Создать пользовательский запрос для поиска?

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

Я создал поисковую строку с использованием 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 'Нет постов, соответствующих вашему запросу.';
}

Объяснение кода:

  1. sanitize_text_field: Эту функцию необходимо использовать для очистки входных данных из AJAX-запроса, чтобы предотвратить возможные атаки, такие как XSS.

  2. post_type: Убедитесь, что вы указали правильный пользовательский тип поста (store в данном случае).

  3. posts_per_page: Установка этого параметра в -1, чтобы получить все посты, соответствующие запросу.

  4. meta_query: Здесь мы проверяем, содержится ли значение $keyword в метаданных с ключом postal_code. Вы можете добавить другие условия в массив meta_query, если вам нужно проверить другие метаполя.

  5. s: Этот параметр позволяет искать по заголовкам постов.

  6. WP_Query: Этот класс используется для выполнения вашего запроса и получения соответствующих постов.

  7. Цикл вывода результата: Стандартный цикл WordPress для вывода заголовков постов и метаданных.

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

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

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