Intereting Posts
Я хотел бы иметь разные стили для своих сообщений, основываясь на содержании каждого сообщения Перемещение сайта от разработки к производству Пользовательские типы сообщений и архивы the_excerpt (); не работает Как добавить разбивку на страницы в мой код? Доступ редактора к меню: пользовательский тип сообщения отсутствует Список доступных событий для wp.media Отображение персонализированного типа сообщений по первой букве посредством пользовательской таксономии Есть ли плагин, который заменит сообщение «Ошибка установления соединения с базой данных»? Создание пользователя во внешней базе данных Изменения шаблона темы исчезают при изменении страницы Что означает Multisite в WordPress? Заказы и групповые сообщения по acf по месяцам и годам Перечислите только детей первого уровня с конкретным сроком таксономии Плагины построителя страниц Расширенное настраиваемое поле и настраиваемый тип сообщения

Включая только сообщения текущего пользователя в поиске

Я новый разработчик плагинов WP. Я хочу, чтобы страница поиска включала только сообщения текущего пользователя.

Сначала я добавил новую возможность read_others_posts только для администраторов и редакторов. Затем я попробовал следующий код, поместив его в функцию и pre_get_posts действием pre_get_posts :

 if( !current_user_can('read_others_posts') ) $query->set( 'author', get_current_user_id() ); 

Для всех других запросов (в том числе в админах и дома) этот «фильтр» работает, но поиска нет. Он по-прежнему показывает все сообщения на странице результатов.

Есть ли что-то, что я сделал не так? Есть ли способ достичь того, что я описал?

РЕДАКТИРОВАТЬ:

На всякий случай, если кто-то захочет использовать этот крючок, позвольте мне предоставить более общую версию функции, хотя я думаю, что есть лучший способ добиться этого:

 function exclude_other_users_posts( $query ) { if( !is_user_logged_in() ) { // guests cannot read private posts // and we exclude all public posts here // so guests can read nothing :-) $query->set( 'post_status', 'private' ); $query->set( 'perm', 'readable' ); } elseif( !current_user_can('read_others_posts') ) $query->set( 'author', get_current_user_id() ); } add_action( 'pre_get_posts', 'exclude_other_users_posts' ); 

Solutions Collecting From Web of "Включая только сообщения текущего пользователя в поиске"

После дальнейшего тестирования проблема была вызвана другим фильтром posts_where , который был зарегистрирован для поддержки поиска также в пользовательских полях, и поэтому затрагивается только поиск.

Первоначально он генерирует что-то вроде этого, поэтому, если оператор OR возвращает true (когда одно из настраиваемых полей включает foo ), этот пост появится на странице результатов:

 AND wp_posts.post_author IN (2) AND ( ( (wp_posts.post_title LIKE '%foo%') OR (wp_posts.post_content LIKE '%foo%') ) ) AND ( /* wordpress stuff... */ ) OR ( /* section the filter generates... */ ) 

Я изменил так, чтобы этот фильтр возвращался:

 AND wp_posts.post_author IN (2) AND ( ( (wp_posts.post_title LIKE '%foo%') OR (wp_posts.post_content LIKE '%foo%') OR ( /* section the filter generates... */ ) ) ) AND ( /* wordpress stuff */ ) 

Благодаря Johannes за то, что он дал мне идеи о том, что исходный код должен работать 🙂