Вопрос или проблема
Я создал поисковую строку с использованием ajax. Если я ввожу какое-либо значение в поле поиска, это значение ищется в заголовке поста или метаданных поста, и все данные этого значения извлекаются из пользовательского типа поста. Запрос проверяет только заголовок поста и определенные метаданные поста. Он не проверяет содержимое поста или другие поля.
Я попробовал следующий запрос
$args = array(
's' => $keyword,
'numberposts' => -1,
'post_type' => 'store',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'postal_code',
'value' => $keyword,
'compare' => 'LIKE'
)
)
);
Вы проверяли результат вашего запроса, какие результаты вы получаете в объекте $query
? Еще одна вещь: нет необходимости использовать 'relation' => 'OR',
в массиве мета-запроса, попробуйте это тоже. Вместо 'numberposts'
используйте 'posts_per_page'
, это поможет. 🙂 Или вы можете убрать meta_query и сделать ваш $arg что-то вроде
$args = array(
's' => $keyword,
'post_type'=> 'store',
'posts_per_page' => -1,
'meta_key' => 'postal_code',
'meta_value' => $keyword,
'meta_compare' => 'LIKE'
);
Ответ или решение
Чтобы создать пользовательский запрос для поиска в заголовках постов и конкретных метаданных пользовательского типа поста в WordPress, вам нужно подготовить аргументы для вашего запроса так, чтобы он искал только в нужных полях, игнорируя содержимое постов и другие поля. Ниже приведен пример кода, который выполняет эти требования.
Вы можете использовать параметр meta_query
для проверки метаданных, а также использовать параметр s
для поиска в заголовке поста. Объедините эти два условия в одном запросе. Вот как это можно сделать:
$keyword = sanitize_text_field($_POST['keyword']); // Получаем значение из AJAX-запроса
$args = array(
'post_type' => 'store', // Укажите нужный тип поста
'posts_per_page' => -1, // Получить все посты
'meta_query' => array(
'relation' => 'OR', // Используем OR для поиска в заголовке и метаданных
array(
'key' => 'postal_code', // Укажите нужные ключи метаданных
'value' => $keyword,
'compare' => 'LIKE'
),
),
's' => $keyword, // Поиск по заголовку поста
);
// Выполнение запроса
$query = new WP_Query($args);
// Проверка результата
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Используйте функции WordPress для вывода нужной информации, например:
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_post_meta(get_the_ID(), 'postal_code', true) . '</p>';
}
wp_reset_postdata();
} else {
echo 'Нет постов, соответствующих вашему запросу.';
}
Объяснение кода:
-
sanitize_text_field: Эту функцию необходимо использовать для очистки входных данных из AJAX-запроса, чтобы предотвратить возможные атаки, такие как XSS.
-
post_type: Убедитесь, что вы указали правильный пользовательский тип поста (
store
в данном случае). -
posts_per_page: Установка этого параметра в
-1
, чтобы получить все посты, соответствующие запросу. -
meta_query: Здесь мы проверяем, содержится ли значение
$keyword
в метаданных с ключомpostal_code
. Вы можете добавить другие условия в массивmeta_query
, если вам нужно проверить другие метаполя. -
s: Этот параметр позволяет искать по заголовкам постов.
-
WP_Query: Этот класс используется для выполнения вашего запроса и получения соответствующих постов.
-
Цикл вывода результата: Стандартный цикл WordPress для вывода заголовков постов и метаданных.
Таким образом, вы сможете выполнять поиск только по заголовкам и указанным метаданным, что потребуется в вашем случае. Убедитесь, что вы тестируете данный код, чтобы убедиться в его работоспособности в вашем конкретном случае использования.