В стандартном поиске WordPress отсутствует возможность поиска по метаданным, что значительно ограничивает функциональность поиска, особенно если на сайте используются пользовательские поля (Custom Fields). В этой статье подробно разберём, как расширить поиск с учётом метаданных, чтобы сделать поиск более точным и полезным.
Что такое метаданные в WordPress и зачем они нужны для поиска
Метаданные — это дополнительная информация, которая хранится в базе данных для каждого поста, страницы или другого типа записи. Например, это могут быть авторские данные, рейтинг, цена товара, дата события и прочее. По умолчанию WordPress ищет только по заголовкам и содержимому, игнорируя метаданные.
Добавление поиска по метаданным позволяет пользователям находить контент по более узким критериям, что особенно важно для сайтов с кастомизированным контентом, интернет-магазинов, каталогов и порталов.
Для расширения поиска по метаданным можно использовать плагины или писать собственные функции, подключаясь к WP_Query.
Расширение поиска по метаданным с помощью плагина SearchWP
Один из самых популярных и мощных плагинов для улучшения поиска — SearchWP. Он позволяет индексировать и искать по произвольным полям, таксономиям и даже содержимому PDF и документов.
Основные преимущества SearchWP:
- Лёгкая настройка индексации метаданных.
- Поддержка нескольких поисковых движков с разными настройками.
- Возможность назначать веса для разных частей контента.
Для использования достаточно установить и активировать плагин, после чего в настройках SearchWP добавить нужные пользовательские поля для индексации. Это избавит от необходимости писать код самостоятельно.
Пример настройки поиска по пользовательским полям в SearchWP
1. Откройте настройки SearchWP в админке WordPress.
2. Создайте или отредактируйте поисковый движок, добавив в раздел «Custom Field» название метаполя, например, _product_sku для поиска по артикулу товара.
3. Сохраните изменения и обновите индекс.
Теперь поиск будет учитывать значение этого метаполя, что значительно улучшит результаты.
Реализация поиска по метаданным без плагинов: пример кода
Если вы хотите обойтись без сторонних плагинов, можно расширить стандартный WP_Query, добавив собственный фильтр, который позволит искать по метаданным.
Ниже пример функции, которая расширяет стандартный поиск, добавляя поиск по пользовательскому полю meta_key:
function wp_puzzle_extend_search_query(\$query) {
if ( ! is_admin() && \$query->is_main_query() && \$query->is_search() ) {
\$meta_query = array(
array(
'key' => 'meta_key', // замените на ваше метаполе
'value' => \$query->query_vars['s'],
'compare' => 'LIKE',
),
);
\$query->set('meta_query', \$meta_query);
// Чтобы искать и по содержимому, и по метаданным, расширим параметры
\$query->set('s', ''); // отключаем стандартный поиск по заголовкам и контенту
add_filter('posts_join', 'wp_puzzle_search_join');
add_filter('posts_where', 'wp_puzzle_search_where', 10, 2);
add_filter('posts_distinct', 'wp_puzzle_search_distinct');
}
}
add_action('pre_get_posts', 'wp_puzzle_extend_search_query');
function wp_puzzle_search_join(\$join) {
global \$wpdb;
\$join .= " LEFT JOIN " . \$wpdb->postmeta . " ON (" . \$wpdb->posts . ".ID = " . \$wpdb->postmeta . ".post_id) ";
return \$join;
}
function wp_puzzle_search_where(\$where, \$query) {
global \$wpdb;
if ( \$search = \$query->get('s') ) {
\$search = esc_sql(\$search);
\$where .= " OR (" . \$wpdb->postmeta . ".meta_value LIKE '%" . \$search . "%')";
}
return \$where;
}
function wp_puzzle_search_distinct(\$distinct) {
return 'DISTINCT';
}
Этот код расширяет стандартный поиск, добавляя возможность искать по значению метаполя meta_key. Его необходимо заменить на нужное вам поле. Учтите, что такой подход может замедлить работу сайта при большом объёме данных.
Использование метаданных для фильтрации результатов поиска
Помимо расширения поиска, метаданные удобно использовать для фильтров. Например, на сайте каталога фильтр по цене, цвету или типу товара построен на пользовательских полях. Для реализации можно использовать WP_Query с параметром meta_query.
Пример фильтрации по метаданным
\$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'price',
'value' => array(1000, 5000),
'type' => 'NUMERIC',
'compare' => 'BETWEEN',
),
array(
'key' => 'color',
'value' => 'red',
'compare' => '=',
),
),
);
\$query = new WP_Query(\$args);
Такой запрос вернёт товары с ценой от 1000 до 5000 и цветом красный. Аналогично можно строить сложные фильтры для поиска.
Выводы и рекомендации по работе с метаданными в WordPress
Поиск по метаданным — мощный инструмент для повышения удобства пользователей и точности поиска. Для его реализации:
- Используйте специализированные плагины, например, SearchWP, если нужна простая и стабильная реализация.
- Если хотите гибко настраивать поиск самостоятельно — расширяйте WP_Query, используя
meta_queryи фильтры. - Оптимизируйте базу данных и индексы, чтобы избежать замедления сайта при поиске по метаданным.
- Тестируйте работу поиска с учётом реального объёма данных и запросов, чтобы обеспечить качественный пользовательский опыт.
На сайте WPSHOP вы найдете полезные инструменты и плагины для улучшения поиска и работы с метаданными в WordPress.