Поиск с использованием определённых метаполей только (исключая заголовок поста и содержимое)

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

У меня есть пользовательский тип записи my_cpt с 9 пользовательскими метаполями, такими как first_name, last_name, location, phone, email и т. д., а также заголовком поста и содержимым поста. Теперь я хочу искать только по полям first_name и last_name.

Посмотрите на этот пример поста:

  • Заголовок поста: Новый игрок (поле заголовка поста в редакторе WP)
  • Описание: Lorem ipsum dolor sit (поле содержания поста в редакторе WP)
  • first_name: John (пользовательский мета)
  • last_name: Doe (пользовательский мета)
  • phone: 123466789 (пользовательский мета)
  • email: [email protected] (пользовательский мета)
  • location: LA (пользовательский мета)

Теперь, если кто-то ищет

  • Игрок, он не получает результатов.
  • Lorem, не получает результатов.
  • John, он находит этот пост
  • LA, ничего не находит

Вы можете использовать WP_Query для этого:

$query = new WP_Query( array( 'post_type' => 'my_cpt' ) );

Это сделает запрос только для постов типа my_cpt.

Чтобы искать только посты с определенным именем или фамилией, вам нужно расширить запрос. Для этого необходимо добавить поле meta_query:

$query = new WP_Query( array( 
                      'post_type' => 'my_cpt' ),
                      'meta_query' => array(
                         'relation' => 'OR', //по умолчанию AND
                          array(
                             'meta_key' => 'first_name',
                             'meta_value' => $search_string,
                             'compare' => 'LIKE'
                          ),
                          array(
                             'meta_key' => 'last_name',
                             'meta_value' => $search_string,
                             'compare' => 'LIKE'
                          )
                       ));

Чтобы использовать этот запрос, вам, вероятно, понадобится пользовательская форма поиска, в которой вы измените параметр поиска с s на что-то вроде search_my_cpt.

После этого вам нужно отредактировать ваш search.php // здесь отображаются результаты:

вам нужно добавить что-то вроде этого:

if( isset($_GET['search_my_cpt'])) {
//ваш новый запрос
//отобразите ваши результаты поиска
}

Я не тестировал этот код, но он должен приблизить вас к вашей цели.

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

Для реализации поиска по пользовательским полям «first_name» и «last_name» в вашей пользовательской записи типа «my_cpt», необходимо создать специальный запрос WP_Query. Давайте рассмотрим, как это сделать по шагам.

Шаг 1: Создание формы поиска

Сначала вам понадобится специальная форма поиска. Измените параметр поиска с обычного s на, например, search_my_cpt. Пример формы:

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
    <label class="screen-reader-text" for="s"><?php _e( 'Search for:' ); ?></label>
    <input type="text" value="" name="search_my_cpt" id="search" placeholder="Поиск по имени или фамилии" />
    <input type="submit" id="searchsubmit" value="<?php echo esc_attr_x('Поиск', 'submit button'); ?>" />
</form>

Шаг 2: Изменение файла search.php

Теперь необходимо изменить файл search.php, чтобы обрабатывать новый параметр поиска. Например, добавьте следующий код:

if ( isset($_GET['search_my_cpt']) && !empty($_GET['search_my_cpt']) ) {
    $search_string = sanitize_text_field( $_GET['search_my_cpt'] );

    $query = new WP_Query( array( 
        'post_type' => 'my_cpt',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'meta_key' => 'first_name',
                'meta_value' => $search_string,
                'compare' => 'LIKE'
            ),
            array(
                'meta_key' => 'last_name',
                'meta_value' => $search_string,
                'compare' => 'LIKE'
            )
        )
    ));

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            // Вывод информации о посте
            the_title(); // вывод заголовка
            the_content(); // вывод содержимого
            // Отображение других метаданных, если необходимо
        }
        wp_reset_postdata(); // сброс глобальных данных после пользовательского запроса
    } else {
        echo 'Нет результатов поиска.';
    }
} else {
    // Здесь вы можете отобразить обычный поиск или другие сообщения
}

Шаг 3: Проверка работоспособности

Теперь, когда в пользовательской записи есть поля first_name и last_name, пользователи могут искать записи, введя имя или фамилию в вашу форму поиска. Система будет возвращать записи, у которых сходства с введённым значением есть в этих полях метаданных.

Заключение

Этот подход позволит вам фильтровать результаты поиска на основе пользовательских полей, исключая заголовки и контент записей. Вы можете дополнительно настроить процесс, включая сортировку результатов или дополнительные поля для поиска, в зависимости от ваших требований. Надеюсь, эта информация была вам полезна!

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

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