سلام
وردپرس بصورت پیشفرض تمام پستتایپهایی که حالت 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 رو ویرایش کنید.
دقت کنید که کدها رو زمانی که کپی میکنید حتما php?> رو ازش حذف کنید و اگر توی فایل functions.php یا فایل php دیگهای که قبلا نوشته شده قرار میدید حتما بعد از php?> کدها رو بزارید.
تفسیر کدها
با تابع add_action میتونید مشخص کنید کار مدنظر شما چه زمانی انجام بشه که ما اینجا نوشتیم pre_get_posts . اکشن pre_get_posts دقیقا قبل از گرفتن پستها از دیتابیس انجام میشه و با اون میتونید کوئری که برای دیتابیس ارسال میشه رو شخصیسازی کنید. آرگومان دوم هم است تابع خودمون هست که کارهای مدنظرمون رو توی اون نوشتیم.
اولین کار بعد از تعریف تابع، نوشتن شرطهای موردنظرمون هست که همیشه خدا این تغییر انجام نشه و سایت رو به هم بریزه. اولین شرط( ()is_admin! ) داریم بررسی میکنیم که این کد توی داشبورد وردپرس اجرا نشه. شرط دوممون ( ()query->is_main_query$ ) برای این هست که توی کوئریهای زیر مجموعه این کد اجرا نشه و همیشه توی کوئری اصلی باشیم(مثلا کوئریای که توی یک تک نوشته اجرا میشه). اما با شرط سوم ( ()query->is_search$ ) مشخص کردیم که کوئری که الان در حال اجرا هست حتما کوئری مربوط به جستجو باشه.
بعد از اون هم کوئری رو شخصیسازی کردیم و post_type اون رو از هر چیزی به مقدار یا مقادیر دلخواه خودمون تغییر دادیم که فقط روی پستتایپهای مدنظر ما جستجو انجام بشه.
دقت کنید که پستتایپهایی که مشخص میکنید حتما باید ویژگی public اونها فعال باشه.
پیدا کردن اسم پستتایپ
برای پیدا کردن اسم پستتایپی که میخواید جستجو روی اون انجام بشه راه حل سادهای داره. فقط کافیه از طریق داشبورد وردپرس روی اون پستتایپ کلیک کنید. توی نوار آدرس میتونید بعد از عبارت post_type اسم پستتایپ رو ببینید. به عنوان مثال این آدرس:
https://mjkhajeh.ir/wp-admin/edit.php?post_type=experience
به راحتی میشه فهمید که اسم پستتایپ experience هست.