Вопрос или проблема
Я работаю над поиском. Я могу искать посты по тегам и категориям, но не могу искать по заголовку и содержимому.
Я пробовал следующий код, но он не работает. Можете помочь мне?
$getSearch = get_search_query();
//print($search);
$query = new WP_Query([
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
's'=> $getSearch // для заголовка и содержимого
),
array(
'taxonomy' => 'post_tag', // для тега
'field' => 'slug',
'terms' => array($getSearch),
),
array(
'taxonomy' => 'category', // для категории
'field' => 'slug',
'terms' => array($getSearch),
),
),
]);
if ($query->have_posts() ):
while ( $query->have_posts() ) {$query->the_post();?>
<!--некоторый контент-->
<?php }
else :
get_template_part( 'template-parts/content', 'none' );
endif;
?>
?>
function.php
add_action( 'pre_get_posts', 'my_search_exclude' );
function my_search_exclude( $query ) {
if ( ! $query->is_admin && $query->is_search && $query->is_main_query() ) {
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
$query->set( 'post__not_in', array( 471 ) );
$taxquery= array(
'post_type' => 'any',
's'=> $query->get('s')
);
$query->set( 'tax_query', $taxquery);
}
}
Правка: Похоже, ваша настоящая проблема заключается в поиске тегов и категорий, следовательно, следует поместить параметр s
внутрь tax_query
.
Нет способа искать теги, категории и другие термины, используя только поля, предоставленные WP_Query
. Ваш запрос не работает, потому что то, что вы хотите, невозможно выполнить только с доступными параметрами.
Вместо того, чтобы спрашивать, как исправить ваше решение/попытку, я бы рекомендовал задать новый вопрос о том, как искать термины таксономии/категории/теги.
Оригинальный ответ:
Причина, по которой ваш поиск не работает, в том, что ваш запрос не содержит поиска:
$query = new WP_Query([
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
's'=> $getSearch // для заголовка и содержимого
),
...
По какой-то причине параметр s
был вставлен внутрь tax_query
, что не имеет большого смысла.
Например, вот нормальный запрос, который выполняет поиск:
$query = new WP_Query([
's' => 'поисковые термины',
и т.д..
Но по какой-то причине вы поместили его внутрь tax_query
:
$query = new WP_Query([
'tax_query' => array(
'relation' => 'OR',
array(
's'=> $getSearch // для заголовка и содержимого
),
Это не будет работать и не соответствует тому, что рекомендовали документация и примеры.
Более того, код создает совершенно новый запрос без необходимости, что также не имеет смысла, так как удваивает время загрузки страницы и нарушает постраничный просмотр.
Вместо этого все эти проблемы можно легко обойти, используя фильтр pre_get_posts
, например в functions.php
:
add_action( 'pre_get_posts', function( \WP_Query $q ) {
if ( !$q->is_main_query() || !$q->is_search() ) {
return;
}
$q->set( 'tax_query', ....... );
} );
Теперь вы можете использовать search.php
как планировалось, с использованием стандартного цикла постов, и все будет работать как обычно. Нет необходимости в запросе в начале файла.
Кратко: если вы хотите изменить посты, которые WP показывает, сообщите WP, что вы хотите с помощью pre_get_posts
. Не создавайте второй запрос, это ухудшает производительность и создает множество новых проблем.
Ответ или решение
Проблема с поиском по заголовкам и содержимому ваших постов в WordPress
Введение
Разработка функционала поиска в WordPress может вызвать определенные трудности, особенно когда дело касается поиска по заголовкам и содержимому постов. Вы столкнулись с проблемой, когда ваш поиск не возвращает ожидаемые результаты для заголовков и содержания, но работает правильно для тегов и категорий. Давайте разберем предложенный вами код и при этом предложим оптимальное решение.
Анализ кода
Ваш текущий код для выполнения поиска выглядит следующим образом:
$getSearch = get_search_query();
$query = new WP_Query([
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
's' => $getSearch // для заголовка и содержания
),
array(
'taxonomy' => 'post_tag', // для тегов
'field' => 'slug',
'terms' => array($getSearch),
),
array(
'taxonomy' => 'category', // для категорий
'field' => 'slug',
'terms' => array($getSearch),
),
),
]);
Проблемы в коде
-
Неправильная структура запроса: Параметр
s
, который отвечает за поиск по заголовкам и содержимому, был неправильно включен вtax_query
. Это основная причина, по которой ваш поиск не функционирует как ожидалось.tax_query
используется исключительно для фильтрации по налогономическим параметрам, таким как теги и категории, и не может обрабатывать запросы на поиск текста. -
Создание дополнительного запроса: Использование
WP_Query
напрямую в вашем коде создаёт новый запрос, тогда как использование хукаpre_get_posts
позволяет модифицировать основной запрос WordPress, что более производительно и корректно с точки зрения работы с пагинацией.
Рекомендуемое решение
Чтобы исправить проблему, вам следует воспользоваться хуком pre_get_posts
в вашем functions.php
, что позволит вам модифицировать основной запрос WordPress перед его выполнением:
add_action('pre_get_posts', function($query) {
if (!$query->is_admin && $query->is_search && $query->is_main_query()) {
$query->set('post_type', array('post', 'page', 'product'));
$query->set('post__not_in', array(471)); // Исключите нужные посты
// Настройка tax_query для поиска по тегам и категориям
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'taxonomy_name',
'value' => get_search_query(),
'compare' => 'LIKE',
)
);
$query->set('meta_query', $meta_query);
}
});
Заключение
Изменение вашего подхода к поиску с использованием pre_get_posts
позволит интегрировать функционал поиска по заголовкам, содержимому и таксономиям более эффективно. Рекомендуется тестировать изменения на локальной среде перед развертыванием на живом сайте, чтобы убедиться, что все работает. Следуя описанным шагам, вы сможете улучшить пользовательский опыт вашего сайта и увеличить его общую производительность.
SEO советы: Убедитесь, что ваш сайт оптимизирован для поисковых систем, путем использования улучшенного текста для заголовков и метаописаний. Поддерживайте структуру URL чистой и соответствующей, чтобы облегчить индексацию. Может быть разумным также использовать плагин для управления SEO, что повысит видимость вашего сайта в поисковых системах.