Вопрос или проблема
Я ограничиваю поиск в своем WP блоге только постами, добавив эту строку
<?php if (is_search() && ($post->post_type=='page')) continue; ?>
Таким образом, любые результаты с статических страниц будут исключены, что нормально, но у меня есть проблема,
если у меня есть пост, и он имеет следующее содержимое
Тест POST
И если я пытаюсь искать по этому ключевому слову ” post “,
это возвращает этот пост, который имеет тег видео и атрибут “poster”, что не имеет смысла.
Так как я могу исключить атрибут медиа тегов из результатов поиска.
Причина этого в том, что WordPress ищет совпадения, используя LIKE %post%
, что означает, что любой пост (то есть объект Поста, Страницы или пользовательского типа поста), который содержит post
в своем заголовке или содержимом, будет найден.
Вы можете изменить это поведение по умолчанию, используя posts_where
хук действий.
add_action( 'posts_where', 'my_alter_search_where' );
function my_alter_search_where( $where ){
global $wpdb;
if (is_search()) :
$where.= " AND $wpdb->posts.post_content NOT LIKE '%poster=%'";
endif;
}
%post, так и %poster="%
как два разных вхождения, оно не будет включено. Есть способы обойти это, но мне нужно узнать больше о вашем запросе, поэтому, если этот ответ приемлем, я бы предложил задать это как отдельный вопрос.
Ответ или решение
Вопрос: Поиск в WordPress возвращает неправильные результаты
Если вы столкнулись с проблемой неверных результатов поиска в вашем блоге WordPress, это связано с тем, что по умолчанию WordPress ищет совпадения, используя оператор LIKE %ключевое слово%
. Это означает, что любой пост (или страница) с содержимым, содержащим искомое слово, будет найден, включая медиатеги, такие как теги <video>
, что может привести к нежелательным результатам.
Решение проблемы
Для ограничения поиска только по тексту постов и исключения из результатов медиатегов и их атрибутов, вы можете использовать хук posts_where
. Этот подход позволит вам адаптировать SQL-запрос, который WordPress использует для поиска.
Пример кода
Ниже приведен код, который вы можете добавить в файл functions.php
вашей темы:
add_action('posts_where', 'my_alter_search_where');
function my_alter_search_where($where) {
global $wpdb;
if (is_search()) {
// Исключаем посты, где содержание содержит атрибут poster
$where .= " AND $wpdb->posts.post_content NOT LIKE '%poster=%'";
}
return $where;
}
Объяснение кода
-
Добавление хука: Мы используем
add_action()
для привязки кода к WordPress хукposts_where
, который позволяет изменять условие поиска. -
Проверка поиска: Условие
if (is_search())
гарантирует, что изменения будут применены только во время выполнения операции поиска. -
Исключение результатов: Используя оператор
NOT LIKE
, мы исключаем посты из результатов поиска, которые содержатposter=
в своем контенте.
Обратите внимание
Хотя этот метод эффективно исключает посты, где содержится атрибут poster
, он также имеет ограничения. Например, если в одном и том же посте есть как искомое слово (например, "post"), так и атрибут poster=
, этот пост не будет включён в результаты поиска, что может быть нежелательным.
Если у вас есть более сложные сценарии поиска, возможно, потребуется использование более сложных SQL-запросов или плагинов для поисковых функций.
Альтернативные решения
-
Плагины для поиска: Рассмотрите возможность использования плагинов для расширенного поиска, таких как "Relevanssi" или "SearchWP", которые обеспечивают более гибкие и точные методы поиска, включая возможность настройки индексации и исключений.
-
Фильтрация содержимого: Проверьте, могут ли регулярные выражения или другие способы фильтрации разрешить ваши вопросы, если у вас есть специфические требования к поисковому запросу.
Заключение
Корректировка поведения поиска в WordPress может значительно улучшить опыт пользователей и повысить релевантность результатов. Применяя описанные решения, вы сможете более точно контролировать, какие результаты выводятся по вашему запросу, тем самым избегая нежелательных совпадений с атрибутами медиаэлементов. Удачи в улучшении вашего блога!