روش برطرف کردن مشکل دقت روی کاراکترها در سرچ سایت های وردپرسی
هسته سرچ وردپرس WordPress Query بهصورت پیشفرض فقط جستجوی دقیق (Exact Match) را انجام میدهد. این یعنی اگر کسی در سایت وردپرسی چیزی را سرچ کند که کمی با عنوان مطلب منتشر شده در سایت متفاوت باشد، جستجو شکست میخورد و سایت مینویسد: چیزی یافت نشد!
مثلا اگر محتوایی در سایت به نام: “دانلود دور دنیا در 80 روز” منتشر شده باشد و کسی سرچ کند: 80روز، هیچ محتوایی به عنوان نتیجه جستجو یافت نخواهد شد چون بین 80 و روز فاصله گذاشته نشده است!
برخی از قالب ها که سرچ اختصاصی خودشان را دارند و از دیتابیس خودشان نیز برای سرچ استفاده میکنند، این مشکل را برطرف کرده اند، یعنی یک سرچ حرفه ای را جایگزین آن کرده اند.
اما اگر قالب سایت شما چنین کاری را انجام نداده است و مستقیما از همان هسته وردپرس برای جستجو استفاده میکند، برای حل این مشکل کافیست کد زیر را در انتهای فایل Function.php قالب در هاست اضافه کنید.
مشکل برطرف خواهد شد.
function iman_fuzzy_search( $search, $wp_query ) {
global $wpdb;
// فقط روی سرچ فرانتاند
if ( is_admin() || ! $wp_query->is_search() ) {
return $search;
}
$q = $wp_query->query_vars;
if ( empty( $q[‘s’] ) ) {
return $search;
}
$n = ! empty( $q[‘exact’] ) ? ” : ‘%’;
$search = ”;
$searchand = ”;
// ترمهای جستجو
foreach ( (array) $q[‘search_terms’] as $term ) {
$term = esc_sql( $wpdb->esc_like( $term ) );
// جستجو هم روی متن عادی، هم روی نسخهای که فاصلهها حذف شده
$search .= $searchand . “(
{$wpdb->posts}.post_title LIKE ‘{$n}{$term}{$n}’
OR {$wpdb->posts}.post_content LIKE ‘{$n}{$term}{$n}’
OR REPLACE({$wpdb->posts}.post_title, ‘ ‘, ”) LIKE ‘{$n}{$term}{$n}’
OR REPLACE({$wpdb->posts}.post_content, ‘ ‘, ”) LIKE ‘{$n}{$term}{$n}’
)”;
$searchand = ‘ AND ‘;
}
if ( ! empty( $search ) ) {
$search = ” AND ({$search}) “;
}
return $search;
}
add_filter( ‘posts_search’, ‘iman_fuzzy_search’, 10, 2 );
