Расширеный поиск, включающий Произвольные поля, без плагинов

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

По-умолчанию в WordPress есть встроенный достаточно удобный поиск, который однако ищет только в заголовках записей и их содержимом. Если вы работаете с произвольными типами записей, то, скорее всего, используете произвольные поля для сохранения их атрибутов. Например, Свойство произвольного типа записи будет содержать произвольные поля: адрес, город и область. Можно попробовать использовать объект WP_Query с настройкой meta_query, но это не сработает. Если вы не будете использовать атрибут “s”, он перепишет стандартный поиск, а если используете, то не вернет желаемые результаты. Сниппет будет использовать фильтр posts_clauses для инъекции мета запроса, который совмещается со стандартным поисковым параметром WordPress.

Код сниппета

function custom_search_where($pieces) {

    // фильтр для выбора запроса поиска
    if (is_search() && !is_admin()) {

        global $wpdb;
        $custom_fields = array('field1','field2');
        $keywords = explode(' ', get_query_var('s'));
        $query = "";
        foreach ($custom_fields as $field) {
             foreach ($keywords as $word) {
                 $query .= "((mypm1.meta_key = '".$field."')";
                 $query .= " AND (mypm1.meta_value  LIKE '%{$word}%')) OR ";
             }
        }

        if (!empty($query)) {
            // add to where clause
            $pieces['where'] = str_replace("(((wp_posts.post_title LIKE '%", "( {$query} ((wp_posts.post_title LIKE '%", $pieces['where']);

            $pieces['join'] = $pieces['join'] . " INNER JOIN {$wpdb->postmeta} AS mypm1 ON ({$wpdb->posts}.ID = mypm1.post_id)";
        }
    }
    return ($pieces);
}
add_filter('posts_clauses', 'custom_search_where', 20, 1);
VN:F [1.9.22_1171]

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии