Wordpress, поиск также в описании категорий сообщений (ИЛИ term_taxonomy.description LIKE %A%)

Я изо всех сил пытаюсь найти простой способ поиска WordPress, чтобы также искать в описании категорий сообщений. Я нашел несколько тем, но не нашел реального ответа.

Дело в том, что пользователь может также вводить то, что он ищет, + название категории (например, «Mario Nintendo 64», где «Nintendo 64» — это название категории. На данный момент он не возвращает никаких результатов, что не чувствует себя хорошо).

Мне нужно искать в term_taxonomy.description, так как у категорий есть псевдонимы, которые я ввожу в это поле (например: «Nintendo 64, N64 и т. д.»)

Вот что я придумал.

function custom_posts_join ($a) {
    global $wpdb;
    return $a . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
}

function custom_posts_where ($a) {
    global $wpdb;
    return $a . " AND $wpdb->term_taxonomy.taxonomy = 'category'";
}

add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );

Тем не менее, мне нужно иметь возможность интегрировать OR (term_taxonomy.description LIKE '%A%') в поиск прямо сейчас, запрос sql ищет только

(posts.post_title LIKE '%A%') 
OR (posts.post_excerpt LIKE '%A%') 
OR (posts.post_content LIKE '%A%')

Кроме того, можно ли добавить DISTINCT, чтобы он не возвращал одно и то же сообщение несколько раз, основываясь на том факте, что сообщения могут принадлежать к нескольким категориям.

Я действительно не знаю, на правильном ли я пути, но я застрял. Также мне интересно, насколько тяжело, что может показаться небольшой корректировкой, это окажется на сервере? Я не занимался разработкой в ​​течение многих лет, и теперь я вернулся к этому, и я не уверен, что это сделает поиск слишком тяжелым. Является ли INNER JOIN лучшим способом?

Есть ли другой способ, которым я мог бы обрабатывать поиск для поиска в описании категорий сообщений.


person bob brown    schedule 22.05.2020    source источник
comment
Вы пытались запустить прямой SQL-запрос или вам нужно использовать WP_Query?   -  person Thapedict    schedule 22.05.2020
comment
Я попытался запустить прямой SQL, и он работает. Но да, я пытаюсь интегрировать свои изменения через фильтры, чтобы не слишком сильно заморачиваться с кодом wordpress. Мне просто нужно иметь возможность добавить это небольшое условие через фильтры «ИЛИ (term_taxonomy.description LIKE '%s%')'   -  person bob brown    schedule 22.05.2020


Ответы (1)


После нескольких часов исследований я, наконец, добился прогресса, и все работает отлично!

Вот как это выглядит сейчас:

function custom_posts_join ( $join ) {
    global $wpdb;
    if ( is_search() ) {
        $join .= " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
        INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_id) ";
    }
    return $join;
}    

function custom_posts_where ( $where ) {
    global $wpdb;
    if ( is_search() ) {
        $where = preg_replace(
                "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
                "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->term_taxonomy.".description LIKE $1)", $a );
        $where .= " AND $wpdb->term_taxonomy.taxonomy='category'";
    }
    return $where;
}
add_filter('posts_join', custom_posts_join );
add_filter('posts_where', custom_posts_where );

И добавить DISTINCT:

function custom_posts_distinct ( $distinct ) {
    global $wpdb;
    if ( is_search() ) {
        return "DISTINCT";
    }
    return $distinct;
}
add_filter( 'posts_distinct', 'custom_posts_distinct' );

Тем не менее, как насчет производительности, выполняя 2 ВНУТРЕННИХ СОЕДИНЕНИЯ при каждом исследовании?

В любом случае, вот полное решение, надеюсь, это кому-то поможет.

person bob brown    schedule 22.05.2020