Вопрос или проблема
Мне нужно создать поисковый запрос, который позволит мне фильтровать все посты, где имя автора и заголовки постов или содержание постов содержат слово из текстового поля поиска.
Таким образом, если я ищу “wordpress”, он должен вывести все посты от авторов с этим словом, а также посты, которые содержат его либо в заголовке, либо в содержании.
Надеюсь, это сработает, я не тестировал это. Тестируйте на свой страх и риск, но запрос, связанный с этим, очень близок.
function kv_get_custom_search_query($search_text){
global $wpdb;
$wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_title="%$search_text%" OR post_content="%$search_text%" OR post_title="%$search_text%" LEFT JOIN $wpdb->users ON $wpdb->posts.post_author=$wpdb->users.ID AND display_name="%$search_text%"");
}
Ответ или решение
Вопрос о создании поискового запроса для фильтрации постов в WordPress на основе имени автора, заголовка или содержимого поста, актуален для многих разработчиков и владельцев сайтов. Рассмотрим, как можно реализовать такой функционал, используя правильные методы и подходы.
1. Концепция запроса
Для выполнения задачи нам необходимо создать запрос, который будет искать все посты, соответствующие заданным критериям. В частности, мы должны учитывать:
- Имя автора (display_name)
- Заголовок поста (post_title)
- Содержимое поста (post_content)
Этот запрос должен быть оптимизирован для поиска по введённому тексту (например, "wordpress"). Важной частью реализации является правильное использование SQL-запросов, чтобы избежать ошибок и обеспечить корректное взаимодействие с базой данных WordPress.
2. Оптимизированный код запроса
Изучив ваш пример кода, могу предложить более корректный и безопасный вариант. Для этого мы будем использовать LIKE
оператор и необходимость подготовить параметры запроса для предотвращения SQL-инъекций. Вот как это может выглядеть:
function kv_get_custom_search_query($search_text) {
global $wpdb;
// Подготовка текста для поиска
$search = '%' . $wpdb->esc_like($search_text) . '%';
// Запрос к базе данных
$query = $wpdb->prepare(
"SELECT p.*
FROM $wpdb->posts AS p
LEFT JOIN $wpdb->users AS u ON p.post_author = u.ID
WHERE (p.post_title LIKE %s OR p.post_content LIKE %s OR u.display_name LIKE %s)
AND p.post_type = 'post'
AND p.post_status = 'publish'",
$search, $search, $search
);
return $wpdb->get_results($query);
}
3. Объяснение работы
-
Безопасность: Использование
$wpdb->prepare()
предотвращает SQL-инъекции. Мы также используем$wpdb->esc_like()
для корректного экранирования символов в запросе. -
Запрос: Этот запрос выбирает все посты (
p.*
) из таблицыposts
, соединяет их с таблицейusers
по ID автора и проверяет, есть ли введенный текст в заголовке, содержимом или имени автора. Мы также удостоверяемся, что полученные посты являются опубликованными и имеют тип ‘post’.
4. Производительность
С точки зрения производительности, важно использовать индексы на столбцах, по которым часто выполняются поисковые операции. Если база данных содержит большое количество постов или пользователей, может потребоваться дополнительная оптимизация.
5. Заключение
Используя предложенный метод, вы можете создать функциональный и безопасный поисковой механизм для вашего сайта на WordPress. Такой подход поможет пользователям находить нужные посты на основе критериев, которые их интересуют, улучшая пользовательский опыт и увеличивая вовлечённость пользователей на вашем сайте.
Этот код легко интегрируется в ваши существующие шаблоны или функции, что позволяет вам адаптировать его под конкретные потребности вашего проекта. Не забывайте тестировать код на безопасной среде перед развертыванием на рабочем сайте.