Nur die aktuellen Beiträge des Benutzers in die Suche aufnehmen

Ich bin ein neuer WP-Plugin-Entwickler. Ich möchte, dass die Suchseite nur die Posts des aktuellen Benutzers enthält.

Ich habe zuerst eine neue function read_others_posts nur für Administratoren und Editoren hinzugefügt. Dann habe ich den folgenden Code ausprobiert, ihn in eine function pre_get_posts und an die pre_get_posts Aktion pre_get_posts :

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

Bei allen anderen Abfragen (einschließlich in admin und in home) funktioniert dieser “Filter”, die Suche jedoch nicht. Es werden weiterhin alle Posts auf der Ergebnisseite angezeigt.

Gibt es etwas, was ich falsch gemacht habe? Gibt es eine Möglichkeit, das zu erreichen, was ich beschrieben habe?

BEARBEITEN:

Nur für den Fall, dass jemand diesen Hook verwenden möchte, lassen Sie mich eine allgemeinere Version der function bereitstellen, obwohl ich denke, dass es einen besseren Weg gibt, dies zu erreichen:

 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 "Nur die aktuellen Beiträge des Benutzers in die Suche aufnehmen"

Nach weiteren Tests wurde festgestellt, dass das Problem durch einen anderen Filter posts_where , der registriert wurde, um die Suche auch in benutzerdefinierten Feldern zu unterstützen. Aus diesem Grund ist nur die Suche betroffen.

Ursprünglich wird so etwas generiert. Wenn also die OR statement den Wert true zurückgibt (wenn eines der benutzerdefinierten Felder foo ), wird dieser Beitrag auf der Ergebnisseite angezeigt:

 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... */ ) 

Ich habe geändert, so dass dieser Filter zurückgibt:

 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 */ ) 

Danke an Johannes für die Idee, dass der originale Code funktionieren sollte 🙂