Aggiorna conteggi post (pubblicati, bozze, non collegati) nell'interfaccia di amministrazione


8

Sto lavorando a una configurazione di WordPress multiutente e l'ho fatta in modo che un particolare tipo di utente possa vedere e interagire solo con post, immagini, pagine ecc. Che hanno creato. Il codice per farlo accadere è simile al seguente:

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

Funziona bene nell'interfaccia di amministrazione ma lascia tutti i conteggi dei post visualizzati in modo errato:

immagine che mostra un numero di post errato in WordPress

Sei a conoscenza di eventuali filtri o hook per manipolare queste figure ed essere corretti su post, pagine, media e tipi di post personalizzati?

Grazie molto.


wp_count_posts filter
Mort 1305

Risposte:


8

Ho quasi funzionato, ma sono necessari perfezionamenti per adattarsi alle specifiche della domanda e per gestire gli allegati e i tipi di post in modo diverso (vedere i commenti nel codice) ...


Innanzitutto, penso che valga la pena notare come ho trovato il filtro:
apply_filters( 'views_' . $screen->id, $views )

  • Ispeziona elemento
    subsubsub

  • fai una ricerca globale in /wp-admine /wp-includesper subsubsub (nome della classe divertente, btw) ...

  • ed eccolo qui: /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;
}

1
Grazie mille per questo. Mi ha salvato il culo. Ho una domanda però: è possibile rimuovere completamente il menu contenuto in .subsubsub?
Maciej Gurban,

4

Al momento della scrittura, questa funzionalità ora risiede nella classe WP_List_Table, nel metodo "views ()".

Il filtro ora appare così:

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

$ views conterrà una matrice di ciascun elemento dell'elenco:

[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>
)

Puoi collegarlo al gancio current_screen con una 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;
}

È quindi possibile aggiungere / modificare / rimuovere gli elementi nell'elenco.


0

So che questo è un vecchio post, ma l'ho incontrato diverse volte alla ricerca di una soluzione migliore, quindi ho pensato di aggiungere qualcosa al mix. Fino ad oggi, ho analizzato ogni singolo numero dalle stringhe filtrate da view_{$screen->id}. Ma ho appena imparato che questi numeri sono analizzati nella riga 248 di class-wp-posts-list-table.php . Questo view_{$screen->id}filtro dovrebbe essere usato per aggiungere e rimuovere viste, non per cambiare i numeri (stupido).

La funzione che esegue tutto il calcolo dei numeri tra parentesi della stringa della vista è wp_count_posts(). E ha un filtro con lo stesso nome che esiste dalla versione 3.7.0 (rilasciata il 24 ottobre 2013, due anni dopo che questa domanda è stata posta).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.