web-dev-qa-db-fra.com

Quel hook dois-je utiliser pour éditer l'option post statuses dans admin?

Je souhaite limiter les publications en attente à certains utilisateurs uniquement dans la section admin. Je souhaite donc le supprimer des options d'état des publications lorsque toutes les publications sont affichées (le bit surligné en rouge dans l'image ci-dessous):

 WordPress post statuses submenu 

Cependant, je ne trouve pas le hook dont j'ai besoin pour l'éditer. Quelqu'un peut-il me guider dans la bonne direction? J'ai scanné la référence du filtre mais je n'ai rien trouvé de approprié.

5
SinisterBeard

Vous pouvez utiliser le filtre views_edit-post (ou views_edit-{custom-post-type}) pour modifier les "vues" disponibles:

add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {
    if( isset( $views['pending'] ) ) {
        unset( $views['pending'] );
    }
    return $views;
}

Dans le filtre ci-dessus, vous devez inclure les règles utilisateur que vous souhaitez appliquer. Par exemple, si vous souhaitez supprimer la vue "En attente" uniquement pour les utilisateurs qui ne peuvent pas modifier d'autres publications:

add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {
    if( isset( $views['pending'] ) && ! current_user_can('edit_others_posts') ) {
        unset( $views['pending'] );
    }
    return $views;
}

De même, si vous excluez la vue en attente, vous devez mettre à jour le nombre de publications "Tous":

add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {

    if( isset( $views['pending'] ) && ! current_user_can('edit_others_posts') ) {
        unset( $views['pending'] );

        $args = [
            // Post params here
            // Include only the desired post statues for "All"
            'post_status' => [ 'publish', 'draft', 'future', 'trash' ],
            'all_posts'   => 1,
        ];
        $result = new WP_Query($args);

        if($result->found_posts > 0) {

            $views['all'] = sprintf( 
                                '<a href="%s">'.__('All').' <span class="count">(%d)</span></a>',
                             admin_url('edit.php?all_posts=1&post_type='.get_query_var('post_type')),
                             $result->found_posts
            );

        }
    }

    return $views;
}

Ce code ne supprime que le filtre à l'écran mais il ne bloque pas l'accès à la publication en attente. Pour bloquer l'accès, vous devez utiliser l'action pre_get_posts. Par exemple:

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

    // only in admin, main query and if user can not edit others posts
    if( is_admin() && ! current_user_can('edit_others_posts') && $query->is_main_query() ) {
        // Include only the desired post statues
        $post_status_arg = [ 'publish', 'draft', 'future', 'trash' ];
        $query->set( 'post_status', $post_status_arg );
    }

}
3
cybmeta

Le filtre que vous recherchez est views_{$this->screen->id} qui se trouve dans la méthode WP_List_Table::views().

$this->screen->id est celui du contexte dans lequel vous vous trouvez, par exemple. posts, users, etc ...

Fichier wp-admin/class-wp-list-table.php

Exemple d'utilisation:

function filter_posts_listable_views($views) {
    //do your thing...

    return $views;
}

add_filter( 'views_posts', 'filter_posts_list_table_views', 100);
1
userabuser