Intereting Posts
Если новый комментарий отправлен в пользовательском почтовом отправлении для отправки по электронной почте из настраиваемого поля Создание фидов событий с вспомогательными страницами / сообщениями для каждого события Как установить плагин на блоге WordPress.com? Создайте "пользовательский журнал" Изменение размера баннера заголовка в дочерней теме Отключить категорию RSS-каналов в блоге WordPress с помощью PHP wp_handle_upload: получить настраиваемое значение флажка из медиа-загрузчика Где я могу хранить общий межсайтовый текст (например, заголовки, заголовки и т. Д.) Фильтровать продукт Woocommerce по ценовому диапазону с помощью API Rest Многопользовательская установка во вложенной папке не будет работать с www ORDER BY значение поля из предложения where Перенос WordPress из Windows Server 2008 R2 (IIS v7.5) в CentOS Одностраничный сайт WordPress – настраиваемые поля или мета-поля или что-то еще? Вызов названия категории без ссылки Страница меню с минимальными возможностями, так как «Абонент» не позволяет «Администратору» получить к нему доступ?

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

Я новый разработчик плагинов 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 за то, что он дал мне идеи о том, что исходный код должен работать 🙂