Mettre à jour le nombre de publications (publié, brouillon, non attaché) dans l'interface d'administration

8

Je travaille sur une configuration WordPress multi-utilisateurs et je l'ai fait pour qu'un type particulier d'utilisateurs ne puisse voir et interagir qu'avec les publications, images, pages, etc. qu'ils ont créées. Le code pour y arriver ressemble à ceci:

add_filter('pre_get_posts', 'current_author_posts');

function current_author_posts($query) {

    if ($query->is_admin && current_user_can('artist')) {
        global $user_ID;
        $query->set('author', $user_ID);
    }

    return $query;
}

Cela fonctionne bien dans l'interface d'administration mais laisse tous les comptes de messages affichés de manière incorrecte:

image qui montre le nombre de publications incorrect dans WordPress

Connaissez-vous des filtres ou des crochets pour manipuler ces chiffres et être correct entre les publications, les pages, les médias et les types de publication personnalisés?

Merci beaucoup.

Scott
la source

Réponses:

7

J'ai presque réussi, mais des améliorations sont nécessaires pour s'adapter aux spécificités de la question et pour traiter les pièces jointes et les post-types différemment (voir les commentaires dans le code) ...


Tout d'abord, je pense qu'il vaut la peine de noter comment j'ai trouvé le filtre:
apply_filters( 'views_' . $screen->id, $views )

  • inspecter l'élément
    sous-sous-sous

  • faire une recherche globale dans /wp-adminet /wp-includespour subsubsub (nom de classe drôle, btw) ...

  • et le voici: /wp-admin/includes/class-wp-list-table.php

foreach( array( 'edit-post', 'edit-page', 'edit-movie', 'upload' ) as $hook )
    add_filter( "views_$hook" , 'wpse_30331_custom_view_count', 10, 1);

function wpse_30331_custom_view_count( $views ) 
{
    global $current_screen;
    switch( $current_screen->id ) 
    {
        case 'edit-post':
            $views = wpse_30331_manipulate_views( 'post', $views );
            break;
        case 'edit-page':
            $views = wpse_30331_manipulate_views( 'page', $views );
            break;
        case 'edit-movie':
            $views = wpse_30331_manipulate_views( 'movie', $views );
            break;
        case 'upload':
            $views = wpse_30331_manipulate_views( 'attachment', $views );
            break;
    }
    return $views;
}

function wpse_30331_manipulate_views( $what, $views )
{
    global $user_ID, $wpdb;

    /*
     * This is not working for me, 'artist' and 'administrator' are passing this condition (?)
     */
    if ( !current_user_can('artist') ) 
        return $views;

    /*
     * This needs refining, and maybe a better method
     * e.g. Attachments have completely different counts 
     */
    $total = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE (post_status = 'publish' OR post_status = 'draft' OR post_status = 'pending') AND (post_author = '$user_ID'  AND post_type = '$what' ) ");
    $publish = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_author = '$user_ID' AND post_type = '$what' ");
    $draft = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = '$user_ID' AND post_type = '$what' ");
    $pending = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'pending' AND post_author = '$user_ID' AND post_type = '$what' ");

    /*
     * Only tested with Posts/Pages
     * - there are moments where Draft and Pending shouldn't return any value
     */
    $views['all'] = preg_replace( '/\(.+\)/U', '('.$total.')', $views['all'] ); 
    $views['publish'] = preg_replace( '/\(.+\)/U', '('.$publish.')', $views['publish'] ); 
    $views['draft'] = preg_replace( '/\(.+\)/U', '('.$draft.')', $views['draft'] ); 
    $views['pending'] = preg_replace( '/\(.+\)/U', '('.$pending.')', $views['pending'] ); 

    // Debug info
    //echo 'Default counts: <pre>'.print_r($views,true).'</pre>';
    //echo '<hr><hr>';
    //echo 'Query for this screen of this post_type: <b>'.$what.'</b><pre>'.print_r($wp_query,true).'</pre>';

    return $views;
}
brasofilo
la source
Merci beaucoup pour celui-ci. J'ai sauvé mon cul. J'ai une question cependant: est-il possible de supprimer complètement le menu contenu dans .subsubsub?
Maciej Gurban
3

Au moment de l'écriture, cette fonctionnalité réside désormais dans la classe WP_List_Table, dans la méthode "views ()".

Le filtre ressemble maintenant à ceci:

$views = apply_filters( "views_{$this->screen->id}", $views );

$ vues contiendra un tableau de chaque élément de la liste:

[19-Feb-2016 11:43:44 UTC] Array
(
  [all] => <a href="link_to_view" class="current">Alle <span class="count">(1)</span></a>
  [trash] => <a href="link_to_view">Trash <span class="count">(94)</span></a>
  [confirmed] => <a href="link_to_view">Confirmed <span class="count">(1)</span></a>
)

Vous pouvez le connecter au crochet current_screen avec une priorité> 10:

add_action( 'current_screen', function ( $current_screen ) {
        if ($current_screen->id === 'edit-my_page')
            add_filter( "views_{$current_screen->id}", 'list_table_views_filter' );
    }, 20);

function list_table_views_filter( array $view ) {
    error_log(print_r($view, true));
    return $view;
}

Vous pouvez ensuite ajouter / modifier / supprimer des éléments de la liste.

DarkNeuron
la source