web-dev-qa-db-fra.com

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

Je travaille sur une configuration WordPress pour plusieurs utilisateurs et je l’ai conçue de manière à ce qu’un type d’utilisateur particulier ne puisse voir et n’interagir qu'avec les publications, images, pages, etc. qu’il a 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 s'afficher de manière incorrecte:

image that shows incorrect post counts within WordPress

Êtes-vous au courant de l'existence de filtres ou de points d'ancrage permettant de manipuler ces figures et d'être corrects pour les publications, les pages, les supports et les types de publication personnalisés?

Merci beaucoup.

8
Scott

Cela fonctionne presque, mais des améliorations sont nécessaires pour répondre aux spécificités de la question et traiter différemment les pièces jointes et les types de publication (voir les commentaires dans le code) ...


Premièrement, je pense que cela vaut la peine de noter comment j'ai trouvé le filtre:
apply_filters( 'views_' . $screen->id, $views )

  • inspecter l'élément
    subsubsub

  • faire une recherche globale dans /wp-admin et /wp-includes pour subsubub (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;
}
7
brasofilo

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

Le filtre ressemble maintenant à ceci:

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

$ views 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 hook 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.

3
DarkNeuron