Использование search.php без поля ‘s’ в searchform.php

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

Извините, если это простой или глупый вопрос, но я все еще разбираюсь в том, как работают функции поиска в WordPress.

Я хочу полностью заменить стандартный поиск в своем шаблоне на кастомный поиск, который будет выполнять запрос только по определенному типу пользовательских записей и их метаполям. У меня есть форма поиска, которая это делает, и search.php, который возвращает корректные данные. Однако, поиск не будет работать, если я не добавлю поле ввода с именем ‘s’, и оно не должно быть пустым. Я понимаю, что WP нуждается в этом для доступа к search.php?

Мне не нужно поле поиска, так как мой поиск основан на пользовательских таксономиях и метаполях. Как же мне использовать свой поиск без этого поля?

Это возможно?

Я не уверен, как обойтись без использования id="s" в поле ввода. Но, чтобы прояснить, я полагаю, что WordPress делает что-то вроде $input = $_POST["s"]; когда поиск отправляется. id="s" необходим, потому что он говорит PHP-скрипту, из какого HTML-поля ввода брать данные. WordPress затем будет выполнять различные операции с переменной $input и искать ее на сайте. Это не решение, но, надеюсь, это поможет прояснить некоторые моменты.

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

Используйте параметр плюс фильтр на pre_get_posts, чтобы контролировать поиск, вместо того чтобы полностью его перехватывать.

function alter_search_wpse_105761($qry) {
  if ($qry->is_search()) {
    $qry->set('post_type','your-post-type');
    // и другие условия
  }
}
add_action('pre_get_posts','alter_search_wpse_105761');

Существует много вопросов и ответов, упоминающих pre_get_posts, так что не должно быть сложно выяснить детали, и вы можете редактировать вопрос с дополнительными деталями, чтобы получить более конкретные ответы.

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

Для решения вашей задачи с поиском в WordPress без использования поля ввода с именем ‘s’, вы можете воспользоваться хуком pre_get_posts, который позволяет изменить параметры запроса перед его выполнением. Это позволит вам выполнить поиск по определенному типу записей и его метаполям, не полагаясь на стандартный механизм поиска WordPress.

Вот шаги, которые нужно предпринять:

  1. Создайте поисковую форму: Вместо поля с именем ‘s’, вы можете использовать свои собственные поля ввода, которые соответствуют тем критериям, по которым вы хотите осуществлять поиск (например, таксономии и метаполя).

  2. Используйте параметр в форме: Убедитесь, что ваша форма по-прежнему отправляет запрос. Вам нужно будет добавить скрытое поле с именем ‘s’, чтобы WordPress мог обработать его стандартный поиск, даже если вы не будете использовать это поле для ваших целей.

  3. Настройте pre_get_posts: Используйте хук pre_get_posts для изменения запроса. Вот пример кода, который вы можете использовать в вашем файле функций темы (functions.php):

    function alter_search_query( $query ) {
       // Проверяем, является ли запрос поисковым
       if ( $query->is_search() && !is_admin() ) {
           // Задаем тип записи, по которому будет осуществляться поиск
           $query->set( 'post_type', 'ваш_тип_записи' ); // Замените на ваш кастомный тип записи
    
           // Пример добавления метаполей и таксономий:
           // Если у вас есть конкретные метаполя, добавьте их так:
           $meta_query = array(
               'relation' => 'OR',
               array(
                   'key'     => 'ваше_метаполе',
                   'value'   => $query->get('s'),
                   'compare' => 'LIKE',
               ),
               // Добавьте дополнительные условия по мере необходимости
           );
           $query->set( 'meta_query', $meta_query );
       }
    }
    add_action( 'pre_get_posts', 'alter_search_query' );

В этом коде происходит следующее:

  • Проверяется, что запрос является поисковым и что он не выполняется в административной панели.
  • Устанавливается тип записи, по которому будет осуществляться поиск.
  • Определяется meta_query для поиска по метаполям, в зависимости от введенного значения в запросе.

Если вы хотите избежать поля ‘s’ в вашей форме, вы можете использовать JavaScript для динамического создания этого параметра на этапе отправки формы. Однако, задавать пустое значение туда не рекомендуется, поскольку WordPress ожидает его наличие.

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

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

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