wake-up-neo.com

Verwenden Sie den Filter 'parse_query', um Posts anzuzeigen, die mehreren Kriterien entsprechen

Ich versuche, die Posts-Seite im WordPress-Admin zu filtern, um Posts anzuzeigen, die die Kriterien für "A" oder "B" erfüllen. Ich habe die Dokumentation durchsucht und kann keinen guten Weg finden, dies zu tun.

Details: Ich habe Benutzerrollen festgelegt, sodass Autoren nur ihre eigenen Beiträge bearbeiten können. Ich habe jedoch ein benutzerdefiniertes Feld hinzugefügt, damit Autoren andere Autoren auswählen können, damit diese den Beitrag auch bearbeiten können. Diese Funktion funktioniert perfekt, wenn ich den einen oder anderen Filter in meinem 'parse_query'-Filter verwende, aber wenn ich versuche, beide zu aktivieren, denke ich, dass ich Posts anzeigen möchte, die ALLEN Kriterien entsprechen (was keiner ist).

Als Referenz ist hier mein Code (das ist in functions.php):

add_filter('parse_query', 'show_appropriate_posts');
function show_appropriate_posts($query) {
    if ( strpos($_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php') !== false ) {
        if ( !current_user_can('manage_options') ) {
            global $current_user;

            //Only list posts by this user (A).
            $query->set('author', $current_user->id);

            //List posts this user is "tagged" in (B).
            $query->set('meta_key', 'add_editing_permission_for');
            $query->set('meta_value', $current_user->id);
            $query->set('meta_compare', 'LIKE');

            //@TODO: Need to show posts that meet (A) -or- (B).
        }
    }
}

Auch hier funktionieren sowohl (A) als auch (B), wenn sie alleine ausgeführt werden.

1
GreatBlakes

Ignoriere meinen Kommentar zu meta_query. Dies funktioniert nicht nur nicht mit $query->set(), Sie könnten auch nicht die kritische Anforderung "AODERB" der Abfrage steuern.

Stattdessen glaube ich, dass das, was Sie benötigen, über eine Kombination aus dem Aktions-Hook pre_get_posts und dem Filter-Hook posts_where wie folgt möglich ist.

add_action('pre_get_posts', 'my_show_appropriate_posts');
function my_show_appropriate_posts($query){

    if(strpos($_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php') !== false) :

        if(!current_user_can('manage_options')) :

            /** Unset so that we can control exactly where this part of the query is included */
            $query->set('author', null);

            /** Ensure that the relevant tables required for a meta query are included */
            $query->set('meta_query', array(
                array(
                    'key'       => 'add_editing_permission_for',
                    'value'     => 'dummy', // This cannot be empty because of a bug in WordPress
                    'compare'   => '='
                )
            ));

            /** Call the filter to amend the '$where' portion of the query */
            add_filter('posts_where', 'my_custom_posts_where');

        endif;

    endif;

}

function my_custom_posts_where( $where = '' ){

    global $wpdb;

    /** Add our required conditions to the '$where' portion of the query */
    $where.= sprintf(
        ' AND ( %1$s.post_author = %2$s OR ( %3$s.meta_key = "add_editing_permission_for" AND %3$s.meta_value = %2$s ) )',
        $wpdb->posts,
        get_current_user_id(),
        $wpdb->postmeta
    );

    /** Remove the filter to call this function, as we don't want it any more */
    remove_filter('posts_where', 'my_custom_posts_where');

    return $where;

}

Empfohlene Lektüre

5
David Gard