Поиск товаров WooCommerce только по заголовкам

Вопрос или проблема

Я раньше задавал этот вопрос и решил его с помощью плагина Relevanssi, однако этот плагин теперь ломает все, поэтому я больше не могу его использовать. Как что-то настолько простое может быть таким невозможным в woocommerce?? АААРГ!

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

Вот последняя вещь, которую я пробовал, которая все еще возвращала результаты поиска из всего содержимого, а не только из заголовков:

Разметка

<form role="search" method="get" id="searchform" action="<?php echo home_url( "https://wordpress.stackexchange.com/" ); ?>">
    <input type="hidden" name="post_type" value="product" />
    <input type="text" value="" name="s" />
    <input type="submit" value="Search" />
</form> 

Callback фильтра Search-SQL

// Ищем только в заголовках продуктов.
function __search_by_title_only( $search, &$wp_query ) {
    global $wpdb;
    if($_GET['post_type'] = 'product' )
        return $search;
    $q = $wp_query->query_vars;
    $n = ! empty( $q['exact'] ) ? '' : '%';
    $search =
    $searchand = '';
    foreach ( (array) $q['search_terms'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }
    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 500, 2 );

Кто-нибудь? Я предполагаю, что это как-то связано с самим типом записи woocommerce… они любят добавлять много кастомных хуков и прочего.

Это 9-месячный вопрос, но поскольку у меня была такая же проблема и я нашел решение, я пришел сюда, чтобы опубликовать его.

В файле wp-content/plugins/woocommerce/classes/class-wc-query.php, функция pre_get_posts( $q ), WooCommerce определяет на строке 114:

add_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );

Именно в этот момент WooCommerce портит ваш запрос!

Функция search_post_excerpt определяется прямо ниже, на строке 132, и вы можете увидеть, что она добавляет краткое содержание к запросу поиска.

Так что у вас есть 2 решения:

Плохое — закомментируйте строку 114!

//add_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );

Хорошее, я не реализовал сам, но должно быть что-то вроде добавления фильтра на posts_where, который работает после WooCommerce и исправляет это. Или, может быть, удалить фильтр.

Я поищу лучшего решения и обещаю, что опубликую его здесь. Но плохое решение работает довольно хорошо.

Пока ваш плагин выглядит хорошо. Можете ли вы вывести итоговую строку SQL и добавить ее к вашему вопросу? Также: сохраняет ли плагин WC все в таблице постов как тип записи? Если да: добавили ли вы ограничение, чтобы искать только по этому типу записи? Вероятно, вам нужно сделать это в фильтре $posts_clauses в условии $clauses['where'] или внутри фильтра posts_where. Просто замените строку post_type = post на ваш собственный тип записи из WC.

Я потерялся. Это теперь работает, и какой результирующий код?
Я нашел решение, которое работает для поиска по Постам, но не смог адаптировать его для продуктов.
Как ограничить поиск только по заголовкам в wp-admin

Я не хочу, чтобы Админ поиск заглядывал в небольшое описание. Достаточно будет только Заголовка.

Это, вероятно, перестало работать в версии 3.6.0 (2019).

Если вы сошли с ума в поисках решения (как и я), потому что информация, которая есть в Интернете, старше этой даты

Вот обновление ответа

С версии Woocommerce 3.6.0 существует функция под названием “search_products” в файле includes/data-stores/class-wc-product-data-store-cpt.php

И существует один хук для переопределения woocommerce_product_pre_search_products.
Нужно только изменить одну строку

add_filter( 'woocommerce_product_pre_search_products', 'override_woo_search_products', 10, 6 );
function override_woo_search_products($custom_query=false, $term, $type, $include_variations, $all_statuses, $limit) {
   ...
   $term_group_query .= $wpdb->prepare( " {$searchand} ( ( posts.post_title LIKE %s) OR ( wc_product_meta_lookup.sku LIKE %s ) $variation_query)", $like, $like ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
   ...
}

Ответ или решение

Без сомнения, поиск продуктов только по названиям в WooCommerce может вызвать значительные затруднения для многих пользователей, особенно при недостаточной документации или при смене версий, когда предыдущие решения перестают работать. Давайте разберёмся, как можно решить эту задачу в актуальной версии WooCommerce, используя современные подходы.

Фон

Как многие заметили, после WooCommerce версии 3.6.0 было внедрено несколько изменений, влияющих на поведение поиска продуктов. В предыдущих решениях использовались такие плагины, как Relevanssi, или модификация стандартного поиска WordPress с помощью фильтров posts_search. Однако это может быть ненадежно из-за изменений, внесенных в компоненты WooCommerce.

Решение

Изменение метода search_products

Внутри WooCommerce, начиная с версии 3.6.0, в файле includes/data-stores/class-wc-product-data-store-cpt.php существует функция search_products, которая обрабатывает запросы поиска. Для модификации поведения этой функции существует хук woocommerce_product_pre_search_products.

Вот как может выглядеть корректировка для поиска только по заголовкам продуктов:

add_filter('woocommerce_product_pre_search_products', 'override_woo_search_products', 10, 6);

function override_woo_search_products($custom_query = false, $term, $type, $include_variations, $all_statuses, $limit) {
    global $wpdb;

    // Включаем только поиск по заголовкам продуктов и SKU
    $like = '%' . $wpdb->esc_like($term) . '%';
    $searchand = ' AND ';

    // Обновляем запрос
    $term_group_query = $wpdb->prepare(
        " {$searchand} (( posts.post_title LIKE %s ) OR ( wc_product_meta_lookup.sku LIKE %s ))",
        $like, $like
    );

    // Остальной код, необходимый для реализации поиска с ограничениями
    ...

    return $custom_query;
}

Обратите внимание

  1. Оптимизация производительности: Подобные изменения могут повысить нагрузку на базу данных при выполнении сложных запросов. Убедитесь, что настроены индексы на соответствующие колонки базы данных.

  2. Тестирование: Перед внедрением изменений в продакшн-среду настоятельно рекомендуется протестировать код на локальном сервере или в тестовой среде.

  3. Совместимость плагинов: Убедитесь, что используемые вами плагины совместимы с вносимыми изменениями. Некоторые из них могут всё еще полагаться на стандартные способы поиска, что может вызвать конфликты.

Заключение

Используя данный подход, вы сможете увеличить точность поиска, сосредоточив его исключительно на заголовках продуктов. Понимание структуры и последовательности обработки запроса WooCommerce позволяет значительно упростить работу с поисковыми механизмами, обеспечивая более значимые результаты для ваших пользователей.

Если у вас остались вопросы или требуется дополнительная помощь, всегда стоит обратиться к сообществу WooCommerce или профессионалам в области PHP-разработки для получения квалифицированной поддержки и актуальных советов.

Оцените материал
Добавить комментарий

Капча загружается...