it-swarm.com.de

Welchen Hook verwende ich, um die Post-Status-Option in admin zu bearbeiten?

Ich möchte ausstehende Posts auf bestimmte Benutzer im Admin-Bereich beschränken, daher möchte ich sie aus den Post-Status-Optionen entfernen, wenn alle Posts angezeigt werden (das rot hervorgehobene Bit im Bild unten):

 WordPress post statuses submenu 

Ich kann jedoch nicht finden, welchen Hook ich zum Bearbeiten benötige. Kann mich jemand in die richtige Richtung bringen? Ich habe die Filterreferenz gescannt, aber nichts Passendes gefunden.

5
SinisterBeard

Sie können den Filter views_edit-post (oder views_edit-{custom-post-type}) verwenden, um die verfügbaren "Ansichten" zu ändern:

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

Im obigen Filter müssen Sie die Benutzerregeln angeben, die Sie anwenden möchten. Wenn Sie zum Beispiel die Ansicht "Ausstehend" nur für Benutzer entfernen möchten, die andere Beiträge nicht bearbeiten können:

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;
}

Wenn Sie die ausstehende Ansicht ausschließen, müssen Sie außerdem die Postanzahl "Alle" aktualisieren:

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;
}

Dieser Code entfernt nur den Filter auf dem Bildschirm, blockiert jedoch nicht den Zugriff auf den Beitrag mit ausstehendem Status. Um den Zugriff zu blockieren, müssen Sie die Aktion pre_get_posts verwenden. Zum Beispiel:

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

Der Filter, den Sie suchen, ist views_{$this->screen->id}, der sich in der Methode WP_List_Table::views() befindet.

Wo $this->screen->id der Kontext ist, in dem Sie sich befinden, z. posts, users, etc ...

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

Beispielverwendung:

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

    return $views;
}

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