Woocommerce: включение названия и описания категории продукта в поисковый запрос продукта

ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ

При поиске продукта поисковая система ищет только информацию о продукте (название и описание) и отображает ее. Я ищу способ включить в запрос заголовок и описание категории продуктов (product_cat), чтобы я мог перечислить все продукты из найденных категорий.

ЧЕГО Я НЕ ХОЧУ ДЕЛАТЬ

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

ТЛ;ДР

Допустим, у меня есть категория «Домашнее животное» с товарами под названием «кошка», «собака» и т. д., но без термина «домашнее животное» ни в названии, ни в описании. Я бы хотел, чтобы пользователь мог искать домашнее животное и видеть все продукты из этой категории «домашнее животное» в результатах поиска.

До сих пор я пробовал это

function SearchFilter($query) {
  if ($query->is_search && !is_admin()) {
    // Get the search query
    $search_query = $query->query_vars['s'];

    
    $query->set( 'tax_query', array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'name',
            'terms'    => $search_query,
            'operator' => 'LIKE'
        ),
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'description',
            'terms'    => $search_query,
            'operator' => 'LIKE'
        )
    ));

    $query->set('post_type', array('product'));
    $query->set( 'wc_query', 'product_query' );


    if (isset( $_GET['showall'] ) && $_GET['showall'] == 1 ) {
      $query->set( 'paged', 1 );
      $query->set( 'posts_per_page', - 1 );
    } else {
      $query->set( 'posts_per_page', 12 );
    }
  
  }
  return $query;
}
add_filter('pre_get_posts','SearchFilter');

Но, похоже, это не работает. Судя по тому, что я нашел, я предполагаю, что сначала нужно использовать фильтры Posts_join, Posts_where и Post_District для поиска в Product_cat, сохранить идентификаторы, а затем запросить продукты с этими таксономиями (убедившись, что мы также отображаем продукты с терминами в их названии). описание). Но я немного растерялся в этом.

Обратите внимание, что 'field' => 'description', не может работать, поскольку параметр «поле» не допускает значения «описания» в WP_Query с параметрами таксономии

LoicTheAztec 05.04.2024 18:23

Ой ! Верно. Что мне следует сделать, чтобы включить описание в налоговый запрос?

allumette 05.04.2024 18:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел свое решение, отфильтровав поисковый запрос. Надеюсь, это поможет:

function new_search_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_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id
        INNER JOIN {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id";
    }

    return $join;
}
add_filter('posts_join', 'new_search_join' );


function new_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search()) {


        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "
              (".$wpdb->posts.".post_title LIKE $1)
              OR
              (".$wpdb->posts.".post_content LIKE $1)
              OR
              (".$wpdb->terms.".name LIKE $1)
              OR
              (".$wpdb->term_taxonomy.".description LIKE $1)
            ", $where );

    }

    return $where;
}
add_filter( 'posts_where', 'new_search_where' );

/**  Prevent duplicates  */
function new_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'new_search_distinct' );

Другие вопросы по теме