Visualizzazione dei conteggi dei messaggi dell'utente per tipo di messaggio personalizzato nell'elenco degli utenti dell'amministratore?


9

Sto cercando di capire come collegarmi alla /wp-admin/users.phppagina di gestione per creare colonne personalizzate per mostrare il numero di post che gli utenti hanno per i tipi di post personalizzati su WPHonors.com .

Ho creato un ticket trac per questo, ma @nacin ha spiegato perché è invece un lavoro in più per un plugin.

Non sono stato in grado di trovare un modo per manipolare l'output della tabella degli utenti, quindi posso aggiungere colonne personalizzate per i conteggi dei post CPT per ciascun utente. E questo potrebbe avere qualcosa a che fare con la domanda che @nacin ha posto, a cosa si collegherebbero i numeri dei post. Per l'attuale numero di post "post" di un utente, si collega alla pagina di gestione dei post, che mostra tutti i post per quell'utente ( /wp-admin/edit.php?author=%author_id%).

Se dovessi collegarlo da qualche parte, sarebbe:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

Se ciò fosse possibile, credo. Ma non ho nemmeno necessariamente bisogno di collegarlo ovunque. Per lo più, voglio solo mostrare il numero di post CPT per ogni persona, con 600utenti e un totale combinato di 300+post tra 4tipi di post personalizzati. Gli amministratori sono solo uno che può inviare 'post'post, quindi quella colonna nella pagina dell'utente è inutile.

Risposte:


10

Ecco un'espansione della risposta del tutorial di Mike. Ho aggiunto collegamenti ai tipi elencati in modo che tu possa fare clic su uno ed essere portato direttamente a un elenco di tutti i post in quel tipo per quell'autore, che ha richiesto una variabile aggiuntiva per $countse alcuni output extra per$custom_column[]

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    return $column_headers;
}

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
    if ($column_name=='custom_posts') {
        $counts = _yoursite_get_author_post_type_counts();
        $custom_column = array();
        if (isset($counts[$user_id]) && is_array($counts[$user_id]))
            foreach($counts[$user_id] as $count) {
                $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
                // admin_url() . "edit.php?author=" . $user->ID;
                $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
            }
        $custom_column = implode("\n",$custom_column);
        if (empty($custom_column))
            $custom_column = "<th>[none]</th>";
        $custom_column = "<table>\n{$custom_column}\n</table>";
    }
    return $custom_column;
}

function _yoursite_get_author_post_type_counts() {
    static $counts;
    if (!isset($counts)) {
        global $wpdb;
        global $wp_post_types;
        $sql = <<<SQL
        SELECT
        post_type,
        post_author,
        COUNT(*) AS post_count
        FROM
        {$wpdb->posts}
        WHERE 1=1
        AND post_type NOT IN ('revision','nav_menu_item')
        AND post_status IN ('publish','pending', 'draft')
        GROUP BY
        post_type,
        post_author
SQL;
        $posts = $wpdb->get_results($sql);
        foreach($posts as $post) {
            $post_type_object = $wp_post_types[$post_type = $post->post_type];
            if (!empty($post_type_object->label))
                $label = $post_type_object->label;
            else if (!empty($post_type_object->labels->name))
                $label = $post_type_object->labels->name;
            else
                $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
            if (!isset($counts[$post_author = $post->post_author]))
                $counts[$post_author] = array();
            $counts[$post_author][] = array(
                'label' => $label,
                'count' => $post->post_count,
                'type' => $post->post_type,
                );
        }
    }
    return $counts;
}

10

Supponendo di aver compreso la domanda, quello che devi fare è agganciare i due hook relativi alle intestazioni di colonna e al valore delle colonne per le pagine di gestione dell'amministratore. Essi sono 'manage_{$type}_columns'e 'manage_{$type}_custom_column'dove nel vostro caso d'uso {$type}è users.

Il 'manage_users_columns'gancio

Questo primo è semplice, ti consente di specificare le intestazioni di colonna e quindi le colonne disponibili. WordPress codifica il valore della colonna "Post" , quindi, poiché si desidera modificarlo, è sufficiente rimuoverlo unset()e quindi aggiungere una nuova colonna con lo stesso titolo ma che ha invece l'identificatore di 'custom_posts':

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
  unset($column_headers['posts']);
  $column_headers['custom_posts'] = 'Posts';
  return $column_headers;
}

Il 'manage_users_custom_column'gancio

Successivamente è necessario utilizzare l' 'manage_users_custom_column'hook che viene chiamato solo per colonne non standard. Testiamo per $column_name=='custom_posts'rendere solido il nostro codice nel caso in cui aggiungiamo nuove colonne utente in futuro e quindi prendiamo i conteggi del tipo di post dell'utente dalla funzione che ho scritto di _yoursite_get_author_post_type_counts()cui parlerò in seguito. Ho quindi giocato con alcuni modi per formattare questo, ma ho deciso che un HTML <table>era il più appropriato (dal momento che è una tabella di dati) . Se una tabella non funziona per te, suppongo che sarai in grado di generare markup diversi abbastanza facilmente:

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
  if ($column_name=='custom_posts') {
    $counts = _yoursite_get_author_post_type_counts();
    $custom_column = array();
    if (isset($counts[$user_id]) && is_array($counts[$user_id]))
      foreach($counts[$user_id] as $count)
        $custom_column[] = "\t<tr><th>{$count['label']}</th>" .
                                 "<td>{$count['count']}</td></tr>";
    $custom_column = implode("\n",$custom_column);
  }
  if (empty($custom_column)) 
    $custom_column = "No Posts!";
  else 
    $custom_column = "<table>\n{$custom_column}\n</table>";
  return $custom_column;
}

Ottenere messaggi conta per tipo di posta per ciascun utente / autore

Infine, viene recuperato il conteggio dei post per tipo di post per autore / utente. In genere cerco di continuare a utilizzare WP_Query()quando eseguo query sui post, ma questa query avrebbe richiesto l'utilizzo di così tanti altri hook che sembrava più facile essere "cattivi" e fare tutto in uno.

Ho omesso qualsiasi post di $post->post_typeis 'revision'o 'nav_menu_item'ma lasciato in 'attachments'. Potresti trovare meglio includere esplicitamente i tipi di post desiderati anziché escludere i pochi che ho fatto.

Ho anche filtrato $post->post_statusper solo 'publish'e 'pending'. Se si desidera includere anche 'future', 'private'e / o 'draft'è necessario apportare le modifiche nel codice.

Per ogni caricamento di pagina chiamo questa _yoursite_get_author_post_type_counts()funzione una sola volta e quindi memorizzo in una variabile statica anziché chiamare per ogni utente. Conservo in un array indicizzato per ID autore / utente contenente un array con nome Post Type nell'elemento 'label'e ovviamente il conteggio in un elemento con lo stesso nome:

function _yoursite_get_author_post_type_counts() {
  static $counts;
  if (!isset($counts)) {
    global $wpdb;
    global $wp_post_types;
    $sql = <<<SQL
SELECT
  post_type,
  post_author,
  COUNT(*) AS post_count
FROM
  {$wpdb->posts}
WHERE 1=1
  AND post_type NOT IN ('revision','nav_menu_item')
  AND post_status IN ('publish','pending')
GROUP BY
  post_type,
  post_author
SQL;
    $posts = $wpdb->get_results($sql);
    foreach($posts as $post) {
      $post_type_object = $wp_post_types[$post_type = $post->post_type];
      if (!empty($post_type_object->label))
        $label = $post_type_object->label;
      else if (!empty($post_type_object->labels->name))
        $label = $post_type_object->labels->name;
      else
        $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
      if (!isset($counts[$post_author = $post->post_author]))
        $counts[$post_author] = array();
      $counts[$post_author][] = array(
        'label' => $label,
        'count' => $post->post_count,
        );
    }
  }
  return $counts;
}

L'interfaccia utente risultante

E questo è come appare applicato alla mia installazione di prova di WordPress 3.0.1:


(fonte: mikeschinkel.com )

Scarica il codice completo

Puoi scaricare il codice completo da Gist :

Puoi copiare questo codice nel functions.phpfile del tuo tema o archiviare includendo il file in un plug-in, a seconda della scelta.

Spero che sia di aiuto!


Bene, è facile. Tutto quello che dovevi fare era dire che utilizza 'gestisci _ {$ type} _columns' e 'gestisci _ {$ type} _custom_column' dove $ type = utenti, e avrei potuto capire il resto da lì. Ho avuto la sensazione che lo facesse, ma l'ho verificato e non ho visto gli utenti. Il resto è abbastanza facile. Apprezzo molto lo sforzo che ci hai dedicato e voterò per te su WPHonors di sicuro (visto che ho già) goo.gl/CrSi Grazie mille : D
jaredwilli,

1
@jaredwilli - Sì certo. Ma l'obiettivo di WordPress Answers è fornire risposte a persone ben oltre la prima persona che chiede. Ecco perché scrivo in modo approfondito anche se potresti aver bisogno solo di alcune informazioni che altri potrebbero essere completamente nuove nell'approccio. Cercando di aiutare entrambi. Oh, e grazie per i bei commenti sul sito (e possibilità di poter cambiare quella foto però? :)
MikeSchinkel,

Sì, è per questo che non ti ho impedito di dirmi semplicemente il gancio che dovevo usare. So che non sarò l'unico a trovare un bisogno per questo, quindi va tutto bene.
jaredwilli,

Oh scusa, certo che lo farò. Sono stato distratto da un tipo di post personalizzato che sto realizzando per un negozio in costruzione. Suppongo che tu non abbia trovato un modo per collegare i conteggi dei post a una pagina edit.php che mostra un post per gli autori? Probabilmente ho bisogno di incorporarlo nel mio CPT Immagino.
jaredwilli,

@jaredwilli - Ah, sì, ma sembra che @somatic l'abbia fatto per te, giusto?
MikeSchinkel,

2

Quella che segue è una variazione della risposta di sorich87, poiché non riuscivo a farla funzionare e volevo supportare automaticamente più tipi:

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

Ho letto get_posts_by_author_sql()e come dovrebbe costruire un'istruzione WHERE per te, ma i risultati che ho ottenuto sono sempre stati "1 = 0". Quindi ho appena scritto il resto dell'istruzione SQL, poiché ti get_posts_by_author_sql()sta solo salvando dover scrivere due bit: il tipo di post e l'autore:

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

Funziona altrettanto bene e aggiungerà tutte le colonne che desideri, ma ognuna utilizza uno spazio orizzontale, mentre il tutorial di Mike aggiungerà una singola colonna per i tipi di post personalizzati, quindi li elencherà come tabella all'interno di quella riga. Stesse informazioni, visualizzazione diversa. Mike's è probabilmente migliore per grandi quantità di tipi, in quanto crea un elenco verticale condensato (e visualizza solo un elemento di conteggio se non vuoto), mentre il metodo sorich87 è buono per quantità più piccole, in quanto è disponibile solo una stanza con colonne orizzontali.

Non dimenticare che puoi aggiungere "post_status = publishing" alla query per restituire solo gli articoli pubblicati, poiché l'esempio attualmente restituisce tutti i post ...


Grande! get_posts_by_author_sql( $column, true, $user_id );dovrebbe costruire l'istruzione where.
sorich87,

1

Quanto segue lo aggiungerà:

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

@ sorich87 - get_posts_by_author_sql()eh? Quello è nuovo per me; Grazie! Ma ho appena controllato il tuo codice e non credo che faccia quello che si aspetta. La tua get_posts_by_author_sql()chiamata ritorna sempre '1=0"e voleva ottenere un elenco di conteggi per tipo di posta per un utente; a meno che non fraintenda questo codice non lo fa. Forse puoi aggiustarlo?
MikeSchinkel,

Sì, ho frainteso la domanda. Il mio codice aggiungerà solo una colonna per un tipo di post personalizzato. Sostituisci semplicemente post_typecon il nome del tipo di post. Ad esempio: get_posts_by_author_sql( 'book', true, $user_id );per un tipo di post chiamato "libro". Testato e funziona.
sorich87,

PS: Ho anche votato per te su WPHonors. Te lo meriti sicuramente!
sorich87,

Devo ancora provarlo, ma sembra che funzioni, potrebbe non avere tutte le funzionalità che sto cercando, ma è facile aggiungere ancora. Grazie :)
jaredwilli,

@ sorich87 - Fantastico!
MikeSchinkel,
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.