Вопрос или проблема
Для конкретного сайта, над которым я работаю, требуется, чтобы поиск возвращал результаты для ВСЕХ постов, включая соответствующую поисковую фразу. Однако посты, помеченные как частные, в настоящее время не возвращаются в результатах поиска, если пользователь не вошел в систему.
Возможно ли изменить поиск так, чтобы результаты страниц, помеченных как частные, были включены в результаты поиска?
(Я могу вносить изменения в [дочернюю] тему, которая уже включает логику для изменения результатов поиска, но, если я не ошибаюсь, похоже, что происходит дополнительная фильтрация вне фильтрации дочерней темы)
Ответ или решение
Да, вы можете изменить запрос поиска в WordPress, чтобы включать результаты для приватных страниц, даже когда пользователь не авторизован. Однако стоит учитывать важные аспекты безопасности, так как доступ к приватным постам предназначен только для зарегистрированных пользователей. Тем не менее, если вы уверены в необходимости такого подхода, вот шаги, которые помогут вам добиться желаемого результата:
-
Фильтрация запроса поиска: Вам нужно использовать фильтр
pre_get_posts
, чтобы изменить аргументы запроса перед его выполнением. В коде вашей child-темы добавьте следующий код в файлfunctions.php
:function modify_search_query($query) { // Убедитесь, что это основной запрос и мы находимся на странице поиска if ($query->is_search() && !is_admin() && $query->is_main_query()) { // Освобождаем фильтр, чтобы поиск включал приватные посты $query->set('post_status', array('publish', 'private')); } return $query; } add_action('pre_get_posts', 'modify_search_query');
-
Отображение приватных постов: Если вы добавили приватные посты в результаты поиска, вам также потребуется изменить вывод результатов так, чтобы они были доступны для просмотра. Для этого в вашем шаблоне поиска (
search.php
,archive.php
или другом соответствующем файле) добавьте условие для отображения приватных постов. Например:if (have_posts()) : while (have_posts()) : the_post(); // Проверяем статус поста if (post_password_required() || (get_post_status() === 'private' && !is_user_logged_in())) { // Если пост приватный и пользователь не авторизован, показываем только заголовок echo '<h2>' . get_the_title() . '</h2>'; echo '<p>Этот пост приватен. Авторизуйтесь для доступа к содержимому.</p>'; } else { // Выводим обычный контент поста the_title('<h2>', '</h2>'); the_content(); } endwhile; else : echo '<p>Результатов не найдено.</p>'; endif;
-
Тестирование: После внесения изменений убедитесь, что вы протестировали функциональность. Проверьте, чтобы результаты поиска содержали приватные посты, при этом отображая соответствующее сообщение, если пользователь не авторизован.
Важно:
- Безопасность: Обеспечьте, чтобы это не нарушало вашу политику безопасности. Если контент приватных постов не должен быть доступен для неавторизованных пользователей, возможно, стоит рассмотреть другие подходы.
- Кэширование: Если у вас включено кэширование на сайте, убедитесь, что кэш обновляется после изменений. Это важно для корректного отображения новых результатов поиска.
Следуя этим шагам, вы сможете настроить поиск на вашем сайте таким образом, чтобы он включал приватные посты, даже когда пользователь не авторизован.