Menampilkan Jumlah Posting Pengguna berdasarkan Jenis Posting Kustom di Daftar Pengguna Admin?

9

Saya mencoba mencari cara menghubungkan ke /wp-admin/users.phphalaman kelola untuk membuat kolom khusus untuk menunjukkan jumlah posting yang dimiliki pengguna untuk jenis posting kustom di WPHonors.com .

Saya membuat tiket trac untuk ini tetapi @nacin menjelaskan mengapa itu adalah pekerjaan yang harus dilakukan oleh plugin.

Saya tidak dapat menemukan cara untuk memanipulasi output dari tabel pengguna, jadi saya dapat menambahkan kolom khusus untuk jumlah posting CPT untuk setiap pengguna. Dan itu mungkin ada hubungannya dengan pertanyaan @nacin yang ditanyakan, apa yang akan dihubungkan dengan angka-angka jumlah posting. Untuk jumlah posting 'posting' saat ini yang dimiliki pengguna, tautan ke halaman kelola posting, menampilkan semua posting untuk pengguna itu ( /wp-admin/edit.php?author=%author_id%).

Jika saya menautkannya di suatu tempat, itu akan menjadi:

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

Jika itu mungkin terjadi, saya kira. Tetapi saya bahkan tidak perlu menghubungkannya ke mana saja. Saya sebagian besar hanya ingin menunjukkan jumlah posting CPT untuk setiap orang, memiliki 600pengguna dan total gabungan 300+posting di semua 4jenis posting kustom. Admin adalah satu-satunya yang dapat mengirim 'post'posting, sehingga kolom di halaman pengguna tidak berguna.

jaredwilli
sumber

Jawaban:

10

Inilah perluasan jawaban tutorial Mike. Saya menambahkan tautan ke jenis yang tercantum sehingga Anda dapat mengklik satu dan langsung dibawa ke daftar semua posting dalam jenis itu untuk penulis itu, yang memerlukan variabel tambahan untuk $countsdan beberapa output tambahan untuk$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;
}
somatik
sumber
10

Dengan asumsi saya mengerti pertanyaan, apa yang perlu Anda lakukan adalah menghubungkan ke dua kait yang terkait dengan header kolom dan nilai kolom untuk halaman kelola admin. Mereka 'manage_{$type}_columns'dan 'manage_{$type}_custom_column'di mana digunakan-kasus Anda {$type}adalah users.

The 'manage_users_columns'kail

Yang pertama ini sederhana, memungkinkan Anda menentukan header kolom dan karenanya kolom yang tersedia. WordPress hardcodes nilai dari kolom "Posting" jadi karena Anda ingin mengubahnya, kami hanya akan menghapusnya dengan unset()dan kemudian menambahkan kolom baru dengan judul yang sama tetapi yang sebaliknya memiliki pengidentifikasi '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;
}

The 'manage_users_custom_column'kail

Selanjutnya Anda perlu menggunakan 'manage_users_custom_column'hook yang hanya dipanggil untuk kolom non-standar. Kami menguji untuk $column_name=='custom_posts'membuat kode kami kuat jika kami menambahkan kolom pengguna baru di masa depan dan kemudian kami mengambil jumlah jenis posting pengguna dari fungsi yang saya tulis _yoursite_get_author_post_type_counts()yang akan saya bahas selanjutnya. Saya kemudian bermain dengan beberapa cara untuk memformat ini tetapi memutuskan HTML <table>yang paling tepat (karena ini adalah tabel data) . Jika sebuah tabel tidak bekerja untuk Anda, saya berasumsi Anda akan dapat membuat markup yang berbeda dengan mudah:

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

Mendapatkan Hitungan Jumlah menurut Jenis Posting untuk Setiap Pengguna / Penulis

Terakhir ada pengambilan jumlah posting berdasarkan jenis posting oleh penulis / pengguna. Secara umum saya mencoba untuk tetap menggunakan WP_Query()ketika menjalankan kueri pada posting tetapi permintaan ini akan diperlukan menggunakan begitu banyak kait lain hanya tampak lebih mudah untuk menjadi "nakal" dan melakukan semuanya dalam satu.

Saya dihilangkan setiap jabatan $post->post_typeyaitu 'revision'atau 'nav_menu_item'tapi yang tersisa di 'attachments'. Anda mungkin merasa lebih baik untuk secara eksplisit memasukkan jenis posting yang Anda inginkan daripada mengecualikan beberapa yang saya lakukan.

Saya juga difilter $post->post_statushanya untuk 'publish'dan 'pending'. Jika Anda ingin juga menyertakan 'future', 'private'dan / atau 'draft'Anda perlu melakukan perubahan dalam kode.

Untuk setiap pemuatan halaman, saya hanya memanggil _yoursite_get_author_post_type_counts()fungsi ini sekali dan kemudian menyimpannya ke dalam variabel statis alih-alih panggilan untuk setiap pengguna. Saya menyimpan dalam larik yang diindeks oleh ID pengguna / pengguna yang berisi larik dengan nama Jenis Tulisan dalam elemen 'label'dan tentu saja hitungan dalam elemen dengan nama yang sama:

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

UI yang dihasilkan

Dan inilah yang tampaknya diterapkan pada instalasi pengujian WordPress 3.0.1 saya:


(sumber: mikeschinkel.com )

Unduh Kode Lengkap

Anda dapat mengunduh kode lengkap dari Gist :

Anda dapat menyalin kode ini ke functions.phpfile tema Anda atau menyimpan memasukkan file dalam plugin, mana pun yang Anda pilih.

Semoga ini membantu!

MikeSchinkel
sumber
Yah, itu mudah. Yang harus Anda lakukan adalah mengatakan ia menggunakan kolom 'kelola _ {$ type} _' dan 'kelola _ {$ type} _custom_column' di mana $ type = pengguna, dan saya bisa mengetahui sisanya dari sana. Saya punya perasaan itu, tapi saya memeriksanya dan tidak melihat pengguna. Sisanya cukup mudah. Saya menghargai upaya yang luas yang Anda lakukan di dalamnya, dan saya akan memberikan suara untuk Anda di WPHonors pasti (karena saya sudah punya) goo.gl/CrSi Terima kasih banyak: D
jaredwilli
1
@jaredwilli - Ya tentu saja. Tetapi tujuan WordPress Answers adalah untuk memberikan jawaban bagi orang-orang di luar orang pertama yang bertanya. Itu sebabnya saya menulis secara mendalam walaupun Anda mungkin hanya perlu sedikit info yang mungkin benar-benar baru untuk pendekatan tersebut. Mencoba membantu keduanya. Oh, dan terima kasih atas komentarnya yang bagus di situs (dan kemungkinan saya bisa mengubah foto itu?)
MikeSchinkel
Ya itu sebabnya saya tidak menghentikan Anda dari hanya memberi tahu saya kait yang perlu saya gunakan. Saya tahu saya tidak akan menjadi satu-satunya yang menemukan kebutuhan untuk ini sehingga semuanya baik.
jaredwilli
Oh maaf, tentu saja saya akan. Saya terganggu oleh jenis pos kustom yang saya buat untuk situs toko yang saya bangun. Saya kira Anda tidak menemukan cara untuk menautkan jumlah posting ke halaman edit.php yang menunjukkan posting untuk penulisnya? Mungkin perlu membuatnya menjadi tebakan CPT saya.
jaredwilli
@jaredwilli - Ah, ya, tapi sepertinya @somatis melakukannya untuk Anda, bukan?
MikeSchinkel
2

Berikut ini adalah variasi pada jawaban sorich87, karena saya tidak bisa membuatnya bekerja, dan saya ingin mendukung beberapa jenis secara otomatis:

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');

Saya membaca get_posts_by_author_sql()dan bagaimana seharusnya membangun pernyataan WHERE untuk Anda, tetapi hasil yang saya dapatkan selalu "1 = 0". Jadi saya hanya menulis sisa pernyataan SQL, karena get_posts_by_author_sql()hanya menghemat Anda harus menulis dua bit: tipe posting dan penulis:

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

Ini berfungsi dengan baik, dan akan menambahkan kolom sebanyak yang Anda inginkan, tetapi masing-masing menggunakan ruang horisontal, sedangkan tutorial Mike akan menambahkan satu kolom untuk jenis posting kustom, dan kemudian daftar sebagai tabel di dalam baris itu. Info yang sama, visualisasi yang berbeda. Mike's mungkin lebih baik untuk sejumlah besar jenis, karena ia membangun daftar vertikal kental (dan hanya menampilkan item hitungan jika tidak kosong), sementara metode sorich87 baik untuk jumlah yang lebih kecil, karena hanya ada begitu banyak ruang kolom horizontal yang tersedia.

Jangan lupa Anda dapat menambahkan "post_status = publikasikan" ke dalam kueri untuk hanya mengembalikan item yang dipublikasikan, seperti contoh saat ini mengembalikan semua posting ...

somatik
sumber
Bagus! get_posts_by_author_sql( $column, true, $user_id );harus membangun pernyataan di mana.
sorich87
1

Berikut ini akan ditambahkan:

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
sumber
@ sorich87 - get_posts_by_author_sql()eh? Yang baru bagi saya; Terima kasih! Tapi saya baru saja memeriksa kode Anda dan saya pikir itu tidak sesuai dengan yang ia harapkan. get_posts_by_author_sql()Panggilan Anda selalu kembali '1=0', dan dia ingin mendapatkan daftar jumlah berdasarkan jenis posting untuk pengguna; kecuali saya salah paham kode ini tidak melakukan itu. Mungkin Anda bisa memperbaikinya?
MikeSchinkel
Ya, saya salah paham pertanyaannya. Kode saya hanya akan menambahkan satu kolom untuk satu jenis posting khusus. Cukup ganti post_typedengan nama jenis tulisan. Misalnya: get_posts_by_author_sql( 'book', true, $user_id );untuk jenis posting yang disebut 'buku'. Diuji dan berhasil.
sorich87
PS: Juga memilih Anda di WPHonors. Anda pasti pantas mendapatkannya!
sorich87
Saya belum menguji ini, tapi sepertinya itu akan berhasil, mungkin saja tidak memiliki semua fungsi yang saya cari, tapi itu masih mudah untuk ditambahkan. Terima kasih :)
jaredwilli
@ sorich87 - Luar Biasa!
MikeSchinkel