web-dev-qa-db-fra.com

Nombre de messages corrects (Tout | Publié | Brouillons | En attente | Corbeille) pour le type de message personnalisé lorsque vous ne souhaitez pas afficher vos propres messages

Je souhaite limiter les utilisateurs de wordpress à afficher uniquement leurs propres publications et éléments multimédias. En suivant les étapes indiquées dans le lien ci-dessous, j'ai développé le plug-in pour empêcher les utilisateurs d'afficher uniquement leurs propres publications et éléments multimédias.

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

Cela fonctionne bien, mais le nombre de publications ne fonctionne pas pour le type de publication personnalisé.

c'est-à-dire tous | Publié | Ébauches | En attente | Corbeille - le nombre de messages personnalisés ne fonctionne pas.

Pour l'utilisateur en tant qu'administrateur, il s'agit des captures d'écran pour post_type = "post" et post_type = "gallery".

enter image description here

enter image description here

Pour l'utilisateur, voici les captures d'écran pour post_type = "post" et post_type = "gallery".

Le nombre de posts fonctionne bien pour post_type = "post", mais quand il s'agit de post_type = "gallery" dans la deuxième capture d'écran, il y a un problème dans le

Tous | Publié | Ébauches | En attente | Corbeille | ,partie

J'ai appliqué le code ci-dessus et obtenu les résultats indiqués dans l'image ci-dessous, le nombre de messages est égal à un, mais aucun ne s'affiche, car le message est celui d'un autre utilisateur.

Ce que je veux corriger, c'est le nombre de messages !!!

Ceci est l'image dans laquelle le post count est 0 pour post_type = "posts" qui est correct et voulait qu'il soit suivi pour la galerie. enter image description here

Ceci est l'image dans laquelle le nombre de messages est égal à 1 pour type_poste = "galerie" qui est erroné comme il devrait être 0 et doit être suivi comme dans le cas des postes. enter image description here

6
Shahrukh Khan

Vous devez changer:

'post_type'   => 'post',

À:

'post_type'   => 'your_custom_post_type_name',

Et toute la référence au poste standard. En outre, vous devez ajouter les filtres uniquement pour la requête principale ou vous pouvez vous retrouver avec des problèmes dans les requêtes secondaires. Ci-dessous un exemple de code pour le type de publication personnalisé gallery. J'essayais de déboguer le code que vous aviez posté (pris de quelque part) mais j'ai finalement décidé de poster un code fonctionnel que j'utilise déjà, qui est beaucoup plus propre question suggérer, vous n’avez pas de problèmes avec ça).

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