Skip to content

تغییر پست‌تایپ‌های وردپرس در جستجو

عناوین مطلب

سلام

وردپرس بصورت پیش‌فرض تمام پست‌تایپ‌هایی که حالت public اونها فعال باشه رو توی جستجو میاره. برای خیلی از سایت‌ها این یه مشکل محسوب میشه چون نمیخوان مثلا برگه‌ها توی نتایج جستجو بیاد و فقط محصولات بیاد. یا گاهی نیاز دارن که محصولات و نوشته‌ها بیاد. این مشکل راه حل ساده‌ای داره که در ادامه کدش رو گذاشتم. شما فقط کافیه یکی از این دو کد رو متناسب با نیازتون توی پلاگینتون یا functions.php قالبتون قرار بدید:

روش اول (فقط یک پست‌تایپ)

با این کد شما نتایج جستجو رو فقط به یک پست‌تایپ خاص محدود می‌کنید: (مثلا محصولات)

<?php
add_action( 'pre_get_posts', 'mj_modify_search_query' );
function mj_modify_search_query( $query ) {
 if( !is_admin() && $query->is_main_query() && $query->is_search() ) {
 $query->set( 'post_type', 'product' );
 }
}

دقت کنید که اگر دارید از روش‌های OOP(کلاس و آبجکت) استفاده می‌کنید توی تابع add_action برای آرگومان دوم(callback) به صورت زیر بنویسید:

<?php
add_action( 'pre_get_posts', [__CLASS__, 'mj_modify_search_query'] );

روش دوم (چند پست‌تایپ)

با استفاده از کد زیر می‌تونید مشخص کنید که جستجو چند پست‌تایپ رو شامل بشه و نتایج تمام اون‌ها رو نمایش بده: (مثلا محصولات و نوشته‌ها و پست‌تایپ فرضی برای مدرسین)

<?php
add_action( 'pre_get_posts', 'mj_modify_search_query' );
function mj_modify_search_query( $query ) {
 if( !is_admin() && $query->is_main_query() && $query->is_search() ) {
 $query->set( 'post_type', ['product', 'post', 'teacher'] );
 }
}

توی این روش فقط کافیه شما مقدار post_type رو توی کوئری به آرایه‌ای از پست‌تایپ‌ها که می‌خواید تغییر بدید. وردپرس جستجو رو روی این پست‌تایپ‌ها انجام میده.

اگر از روش‌های OOP استفاده می‌کنید، دقیقا مثل روش اول باید تابع add_action رو ویرایش کنید.

تفسیر کدها

با تابع add_action میتونید مشخص کنید کار مدنظر شما چه زمانی انجام بشه که ما اینجا نوشتیم pre_get_posts . اکشن pre_get_posts دقیقا قبل از گرفتن پست‌ها از دیتابیس انجام میشه و با اون می‌تونید کوئری که برای دیتابیس ارسال میشه رو شخصی‌سازی کنید. آرگومان دوم هم است تابع خودمون هست که کارهای مدنظرمون رو توی اون نوشتیم.

اولین کار بعد از تعریف تابع، نوشتن شرط‌های موردنظرمون هست که همیشه خدا این تغییر انجام نشه و سایت رو به هم بریزه. اولین شرط( ()is_admin! ) داریم بررسی می‌کنیم که این کد توی داشبورد وردپرس اجرا نشه. شرط دوممون ( ()query->is_main_query$ ) برای این هست که توی کوئری‌های زیر مجموعه این کد اجرا نشه و همیشه توی کوئری اصلی باشیم(مثلا کوئری‌ای که توی یک تک نوشته اجرا میشه). اما با شرط سوم ( ()query->is_search$ ) مشخص کردیم که کوئری که الان در حال اجرا هست حتما کوئری مربوط به جستجو باشه.

بعد از اون هم کوئری رو شخصی‌سازی کردیم و post_type اون رو از هر چیزی به مقدار یا مقادیر دلخواه خودمون تغییر دادیم که فقط روی پست‌تایپ‌های مدنظر ما جستجو انجام بشه.

پیدا کردن اسم پست‌تایپ

برای پیدا کردن اسم پست‌تایپی که می‌خواید جستجو روی اون انجام بشه راه حل ساده‌ای داره. فقط کافیه از طریق داشبورد وردپرس روی اون پست‌تایپ کلیک کنید. توی نوار آدرس می‌تونید بعد از عبارت post_type اسم پست‌تایپ رو ببینید. به عنوان مثال این آدرس:

https://mjkhajeh.ir/wp-admin/edit.php?post_type=experience

به راحتی میشه فهمید که اسم پست‌تایپ experience هست.

پیدا کردن اسم پست‌تایپ

لینک‌های مفید:

اطلاعات بیشتر درباره تابع add_action

اطلاعات بیشتر درباره اکشن pre_get_posts

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.