Поиск не работает с заголовком и содержимым.

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

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

Я пробовал следующий код, но он не работает. Можете помочь мне?

$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),
    ),
  ),
]);

Проблемы в коде

  1. Неправильная структура запроса: Параметр s, который отвечает за поиск по заголовкам и содержимому, был неправильно включен в tax_query. Это основная причина, по которой ваш поиск не функционирует как ожидалось. tax_query используется исключительно для фильтрации по налогономическим параметрам, таким как теги и категории, и не может обрабатывать запросы на поиск текста.

  2. Создание дополнительного запроса: Использование 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, что повысит видимость вашего сайта в поисковых системах.

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

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