it-swarm.com.de

Korrigieren Sie die Anzahl der Posts (Alle | Veröffentlicht | Entwürfe | Ausstehend | Papierkorb) für den benutzerdefinierten Post-Typ, wenn Sie die Anzeige eigener Posts einschränken

Ich möchte Benutzer in WordPress darauf beschränken, nur ihre eigenen Posts und Medienelemente anzuzeigen. Unter Befolgung der im folgenden Link angegebenen Schritte habe ich das Plugin entwickelt, um die Benutzer zu beschränken, nur die eigenen Beiträge und Medienelemente anzuzeigen.

https://wordpress.stackexchange.com/a/34858/12615

// Show only posts and media related to logged in author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter('views_edit-post', 'fix_post_counts');
        add_filter('views_upload', 'fix_media_counts');
    }
}

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    unset($views['mine']);
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    );
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        );
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('All')
        );
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Publish')
        );
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Draft')
        );
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Pending')
        );
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Trash')
        );
        endif;
    }
    return $views;
}

// Fix media counts
function fix_media_counts($views) {
    global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
    $views = array();
    $count = $wpdb->get_results( "
        SELECT post_mime_type, COUNT( * ) AS num_posts 
        FROM $wpdb->posts 
        WHERE post_type = 'attachment' 
        AND post_author = $current_user->ID 
        AND post_status != 'trash' 
        GROUP BY post_mime_type
    ", ARRAY_A );
    foreach( $count as $row )
        $_num_posts[$row['post_mime_type']] = $row['num_posts'];
    $_total_posts = array_sum($_num_posts);
    $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
    if ( !isset( $total_orphans ) )
        $total_orphans = $wpdb->get_var("
            SELECT COUNT( * ) 
            FROM $wpdb->posts 
            WHERE post_type = 'attachment'
            AND post_author = $current_user->ID 
            AND post_status != 'trash' 
            AND post_parent < 1
        ");
    $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
    foreach ( $matches as $type => $reals )
        foreach ( $reals as $real )
            $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
    $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
    $views['all'] = "<a href='upload.php'$class>" . sprintf( __('All <span class="count">(%s)</span>', 'uploaded files' ), number_format_i18n( $_total_posts )) . '</a>';
    foreach ( $post_mime_types as $mime_type => $label ) {
        $class = '';
        if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
            continue;
        if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
            $class = ' class="current"';
        if ( !empty( $num_posts[$mime_type] ) )
            $views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
    }
    $views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Unattached <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . '</a>';
    return $views;
}

Es funktioniert gut, aber die Anzahl der Posts funktioniert nicht für benutzerdefinierte Post-Typen.

alle | Veröffentlicht | Entwürfe | Ausstehend | Papierkorbzähler für benutzerdefinierte Posts funktionieren nicht.

Für Benutzer als Administrator sind dies die Screenshots für post_type = "post" und post_type = "gallery"

enter image description here

enter image description here

Für Benutzer als Autor sind dies die Screenshots für post_type = "post" und post_type = "gallery".

Die Anzahl der Posts funktioniert gut für post_type = "post", aber wenn es um post_type = "gallery" im zweiten Screenshot geht, gibt es ein Problem in der

Alle | Veröffentlicht | Entwürfe | Ausstehend | Müll | ,Teil

Ich habe den obigen Code angewendet und die Ergebnisse wie im Bild unten angegeben erhalten. Die Anzahl der Beiträge ist eins, aber es wird keiner angezeigt, da der Beitrag von einem anderen Benutzer stammt.

Was ich korrigieren möchte, ist die Anzahl der Posts !!!

Dies ist das Bild, in dem die Anzahl der Posts 0 für post_type = "posts" ist und das für die Galerie befolgt werden soll enter image description here

Dies ist das Bild, in dem die Anzahl der Posts 1 für post_type = "gallery" ist falsch da es 0 sein sollte und dasselbe wie in folgt der Fall von Beiträgen. enter image description here

6
Shahrukh Khan

Du musst dich ändern:

'post_type'   => 'post',

Zu:

'post_type'   => 'your_custom_post_type_name',

Und ein ganzer Verweis auf Standardpost. Außerdem sollten Sie die Filter nur für die Hauptabfrage hinzufügen, da sonst Probleme bei den sekundären Abfragen auftreten können. Unten sehen Sie einen Beispielcode für den benutzerdefinierten Beitragstyp gallery. Ich habe versucht, den Code zu debuggen, den Sie gepostet haben (irgendwoher genommen), aber schließlich habe ich beschlossen, einen bereits verwendeten Arbeitscode zu posten, der viel sauberer ist (er enthält nicht den Zähler für Medien (Uploads), sondern Ihren frage vorschlage, du hast damit keine probleme).

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

    //Note that current_user_can('edit_others_posts') check for
    //capability_type like posts, custom capabilities may be defined for custom posts
    if( is_admin() && ! current_user_can('edit_others_posts') && $query->is_main_query() ) {

        $query->set('author', get_current_user_id());

        //For standard posts
        add_filter('views_edit-post', 'views_filter_for_own_posts' );

        //For gallery post type
        add_filter('views_edit-gallery', 'views_filter_for_own_posts' );

        //You can add more similar filters for more post types with no extra changes
    }

} );

function views_filter_for_own_posts( $views ) {

    $post_type = get_query_var('post_type');
    $author = get_current_user_id();

    unset($views['mine']);

    $new_views = array(
            'all'       => __('All'),
            'publish'   => __('Published'),
            'private'   => __('Private'),
            'pending'   => __('Pending Review'),
            'future'    => __('Scheduled'),
            'draft'     => __('Draft'),
            'trash'     => __('Trash')
            );

    foreach( $new_views as $view => $name ) {

        $query = array(
            'author'      => $author,
            'post_type'   => $post_type
        );

        if($view == 'all') {

            $query['all_posts'] = 1;
            $class = ( get_query_var('all_posts') == 1 || get_query_var('post_status') == '' ) ? ' class="current"' : '';
            $url_query_var = 'all_posts=1';

        } else {

            $query['post_status'] = $view;
            $class = ( get_query_var('post_status') == $view ) ? ' class="current"' : '';
            $url_query_var = 'post_status='.$view;

        }

        $result = new WP_Query($query);

        if($result->found_posts > 0) {

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

        } else {

            unset($views[$view]);

        }

    }

    return $views;
}
7
cybmeta