web-dev-qa-db-fra.com

Utilisez le filtre 'parse_query' pour afficher les publications à partir de plusieurs critères

J'essaie de filtrer la page des messages de l'administrateur WordPress pour afficher les messages répondant aux critères "A" ou aux critères "B". J'ai parcouru la documentation et je ne trouve pas un bon moyen de le faire.

Détails: J'ai défini des rôles d'utilisateur pour que les auteurs ne puissent éditer que leurs propres messages. Cependant, j'ai ajouté un champ personnalisé afin que les auteurs puissent sélectionner d'autres auteurs pour leur permettre de modifier également le message. Cette fonctionnalité fonctionne parfaitement si j'utilise l'un ou l'autre dans mon filtre 'parse_query', mais si j'essaie de l'activer à la fois, la requête pense que je souhaite afficher les publications qui correspondent à TOUS les critères (ce qui n'est aucun).

Pour référence, voici mon code (c’est dans 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).
        }
    }
}

Encore une fois, les deux (A) et (B) fonctionnent lorsqu'ils sont exécutés seuls.

1
GreatBlakes

Ignorer mon commentaire sur meta_query. Non seulement cela ne fonctionne pas avec $query->set(), mais vous ne pourriez pas contrôler l'exigence critique "AOUB" de la requête.

Au lieu de cela, je crois que ce dont vous avez besoin est possible via une combinaison du crochet d’action pre_get_posts et du crochet de filtre posts_where comme suit.

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;

}

Lecture recommandée

5
David Gard