web-dev-qa-db-fra.com

Masquer les messages protégés par mot de passe dans admin

Je construis un site pour un client et nous utilisons la fonctionnalité de protection par mot de passe native de WordPress.

Existe-t-il un filtre ou une action quelconque pour filtrer les publications récupérées dans le panneau d'administration? Si je veux empêcher l'affichage de toutes les publications protégées par mot de passe dans le panneau d'administration, disons si vous n'êtes pas administrateur.

4
Dueify

Vous pouvez utiliser le paramètre has_password de WP_Query.

Voici un exemple de masquage, pour les non-administrateurs, sur l'écran edit.php pour le type de publication post :

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'has_password', false );
} );

J'espère que vous pourrez adapter cela à vos besoins.

PS: il serait utile d’avoir une fonction get_current_screen_id(), similaire à la fonction get_current_user_id() ;-)

Mettre à jour

/**
 * Hide password protected posts, for non-admins, in the case of 'edit-post' screen id. 
 * Here we don't restrict this to the current user.
 *
 * @link http://wordpress.stackexchange.com/a/200426/26350
 */
is_admin() && add_action( 'posts_where', function( $where, \WP_Query $q )
{
    $screen = get_current_screen();

    if(     
           ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    ){
        global $wpdb;
        $uid = get_current_user_id();
        $where .= $wpdb->prepare(
            " AND ( ( {$wpdb->posts}.post_password = '' AND {$wpdb->posts}.post_author != %d )
              OR ( {$wpdb->posts}.post_author = %d ) ) ",
            $uid,
            $uid
        );
    }
    return $where;
}, 10, 2 );

Si WP_Query prendrait en charge field_query:

Il serait utile que WP_Query prenne en charge l'argument d'entrée field_query, afin de faciliter le travail avec les champs de publication.

Voici un exemple:

add_action( 'pre_get_posts', function( \WP_Query $q )
{
    $screen = get_current_screen();

    if(    is_admin() 
        && ! current_user_can( 'manage_options' ) 
        && is_a( $screen, '\WP_Screen' ) 
        && 'edit-post' === $screen->id
    )
        $q->set( 'field_query', 
            [
                'outer_relation' => 'AND',
                'relation'       => 'OR',
                [ 
                    'field'   => 'author',
                    'value'   => get_current_user_id(),
                    'compare' => '=',
                ],
                [
                    'relation'  => 'AND',
                    [
                        'field'     => 'author',
                        'value'     => get_current_user_id(),
                        'compare'   => '!=',
                    ],
                    [
                        'field'     => 'password',
                        'value'     => '',
                        'compare'   => '=',
                    ],
                ]       
            ]
        );
} );

J'ai un brouillon pour un tel plugin, alors je le posterai peut-être ici quand il atteindra l'étape alpha; -)

3
birgire