Вопрос или проблема
У меня есть пользовательский тип записи 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
, пользователи могут искать записи, введя имя или фамилию в вашу форму поиска. Система будет возвращать записи, у которых сходства с введённым значением есть в этих полях метаданных.
Заключение
Этот подход позволит вам фильтровать результаты поиска на основе пользовательских полей, исключая заголовки и контент записей. Вы можете дополнительно настроить процесс, включая сортировку результатов или дополнительные поля для поиска, в зависимости от ваших требований. Надеюсь, эта информация была вам полезна!