web-dev-qa-db-fra.com

Comment pre_get_posts filtre-t-il les rôles dans WP Admin

comment puis-je filtrer par rôles dans wordpress admin

im déjà ajouter un filtre par rôles déroulant  enter image description here 

en utilisant ce code http://Pastebin.com/Zbv3UhVH

mais je suis bloqué sur pre_get_posts

function add_role_filter_to_posts_query( $query ) {

    global $post_type, $pagenow;

    if ($pagenow == 'edit.php' && $post_type == 'post') {

        if ( isset( $_GET['user_role'] ) ) {

            $role = $_GET['user_role'] ); // return string 'contributor_facebook'

            // TO DO 

        }

    }

}
add_action( 'pre_get_posts', 'add_role_filter_to_posts_query' );

ce que je dois faire, le filtrer ..

merci

3

Je ferais 2 requêtes. Cela ressemblerait à quelque chose comme ça:

function add_role_filter_to_posts_administration(){

    //execute only on the 'post' content type
    global $post_type;
    if($post_type == 'post'){

        $user_role  = '';
        // Get all user roles
        $user_roles = array();
        foreach ( get_editable_roles() as $key => $values ) :
            $user_roles[ $key ] = $values['name'];
        endforeach;
        // Set a selected user role
        if ( ! empty( $_GET['user_role'] ) ) {
            $user_role  = sanitize_text_field( $_GET['user_role'] );
        }

        ?><select name='user_role'>
        <option value=''><?php _e( 'All Roles', 'papasemarone' ); ?></option><?php
        foreach ( $user_roles as $key => $value ) :
            ?><option <?php selected( $user_role, $key ); ?> value='<?php echo $key; ?>'><?php echo $value; ?></option><?php
        endforeach;
        ?></select><?php

    }

}
add_action('restrict_manage_posts','add_role_filter_to_posts_administration');

function add_role_filter_to_posts_query( $query ) {

    /**
     * No use on front
     * pre get posts runs everywhere
     * even if you test $pagenow after, bail as soon as possible
     */
    if ( ! is_admin() ) {
        return;
    }

    global $pagenow;

    /**
     * use $query parameter instead of global $post_type
     */
    if ( 'edit.php' === $pagenow && 'post' === $query->query['post_type'] ) {

        if ( isset( $_GET['user_role'] ) ) {
            $role = $_GET['user_role']; // return string 'contributor_facebook'
            $users   = new WP_User_Query( array( 'role' => $role ) );
            $results = $users->get_results();

            $user_ids = array();
            foreach( $results as $result ) {
                $user_ids[] = (int) $result->ID;
            }

            /**
             * I use PHP_INT_MAX here cause 0 would not work
             * this means "user that does not exist"
             * this trick will make WP_Query return 0 posts
             */
            $user_ids = ! empty( $user_ids ) ? $user_ids : PHP_INT_MAX;

            $query->set( 'author__in', $user_ids );

        }

    }

}
add_action( 'pre_get_posts', 'add_role_filter_to_posts_query' );

Vous devez créer une requête utilisateur pour obtenir tous les utilisateurs ayant un rôle spécifique, puis interroger les publications avec le paramètre "author".

3
JMau