Yönetici Kullanıcı Listesinde Özel Mesaj Türüne Göre Kullanıcının Posta Sayımları Gösterilsin mi?


9

Ben /wp-admin/users.phpkullanıcıların WPHonors.com özel yazı türleri için sahip yazı sayısını göstermek için özel sütunlar oluşturmak için yönetmek sayfasına kanca anlamaya çalışıyorum .

Bunun için bir trac bileti oluşturdum ama @nacin bunun yerine neden bir eklenti için daha fazla iş olduğunu açıkladı.

Kullanıcılar tablosunun çıktısını değiştirmek için bir yol bulamadım, böylece her kullanıcı için CPT'ler için sayıları özel sütunlar ekleyebilirsiniz. Ve bunun @nacin sorusu ile bir ilgisi olabilir, post sayım sayıları neye bağlanır? Kullanıcının sahip olduğu mevcut 'gönderi' gönderi sayısı için, gönderi yönetme sayfasına bağlanır ve söz konusu kullanıcının tüm gönderilerini gösterir ( /wp-admin/edit.php?author=%author_id%).

Bir yere bağlayacak olsaydım, şöyle olurdu:

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

Bu bir şekilde mümkün olsaydı, sanırım. Ama onu herhangi bir yere bağlamam gerekmiyor. Ben çoğunlukla sadece CPT sonrası her bir kişi için sayımları sahip göstermek istediğiniz 600kullanıcıları ve bir kombine toplam 300+genelinde mesajların 4özel yayın türleri. Yöneticiler yalnızca 'post'yayın gönderebilen kişidir , bu nedenle kullanıcının sayfasındaki sütun işe yaramaz.

Yanıtlar:


10

Mike'ın öğretici yanıtının bir uzantısı. Listelenen türlere bağlantılar ekledim, böylece birini tıklayabilir ve o yazar için ek bir değişken $countsve bazı ekstra çıktılar gerektiren bu türdeki tüm yayınların bir listesine alınabilirsiniz .$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

Soruyu anladığımı varsayarak , yönetici yönetme sayfaları için sütun başlıkları ve sütun değeri ile ilgili iki kancaya kanca yapmanız gerekir. Bunlar 'manage_{$type}_columns've 'manage_{$type}_custom_column'nerede kullanımınız durum {$type}olduğunu users.

'manage_users_columns'kanca

Bu ilki basittir, sütun başlıklarını ve dolayısıyla kullanılabilir sütunları belirtmenize olanak tanır. WordPress, "Yayınlar" sütununun değerini kodlar, böylece değiştirmek istediğinizden unset()sonra onu kaldıracağız ve aynı başlığa sahip yeni bir sütun ekleyeceğiz, ancak bunun yerine tanımlayıcı var '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;
}

'manage_users_custom_column'kanca

Ardından, 'manage_users_custom_column'yalnızca standart olmayan sütunlar için çağrılan kancayı kullanmanız gerekir . $column_name=='custom_posts'İleride yeni kullanıcı sütunları eklememiz durumunda kodumuzu sağlamlaştırmak için test yapıyoruz ve daha sonra _yoursite_get_author_post_type_counts()yazacağım işlevden bir sonraki tartışacağım kullanıcı yazım türü sayılarını alıyoruz . Daha sonra bunu biçimlendirmek için birkaç yolla oynadım ancak bir HTML'nin <table>en uygun olduğuna karar verdim (çünkü bir veri tablosu olduğu için) . Bir tablo sizin için işe yaramazsa, kolayca kolayca farklı işaretlemeler oluşturabileceğinizi varsayalım:

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

Her Kullanıcı / Yazar için Yazı Türlerine Göre Yazı Sayma

Son olarak yazar / kullanıcı tarafından yazı tipine göre yazı sayımlarının alınması. Genellikle WP_Query()mesajlarda sorgular çalıştırırken kullanmaya çalışıyorum ama bu sorgu sadece "yaramaz" ve hepsi bir arada yapmak daha kolay görünüyordu daha birçok kanca kullanarak gerekli olurdu .

Ben herhangi yazı atlanmış $post->post_typeDİR 'revision'ya 'nav_menu_item'ama sol 'attachments'. Yaptığım birkaç hariç tutmak yerine, istediğiniz yazı türlerini açıkça eklemeyi daha iyi bulabilirsiniz.

Ben de $post->post_statussadece 'publish've tarafından filtre 'pending'. Ayrıca eklemek istiyorsanız 'future', 'private've / veya 'draft'kodda değişiklik yapmak gerekir.

Her sayfa yükü için bu _yoursite_get_author_post_type_counts()işlevi yalnızca bir kez çağırırım ve sonra her kullanıcı için çağrı yerine statik bir değişkende saklarım. Öğede Post Type adına sahip bir dizi 'label've elbette aynı adlı öğedeki sayımı içeren yazar / kullanıcı kimlikleriyle dizinlenmiş bir dizide depolarım :

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

Sonuçtaki Kullanıcı Arayüzü

Ve bu, WordPress 3.0.1 test yüklememe uygulanmış gibi görünüyor:


(kaynak: mikeschinkel.com )

Tam Kodu İndirin

Şunları yapabilirsiniz indirmek tam kod Gist :

Bu kodu temanızın functions.phpdosyasına veya mağazasına ekleyebilir , hangisini seçerseniz seçin.

Bu yardımcı olur umarım!


Bu kolay. Yapmanız gereken tek şey, $ type = kullanıcıların 'yönetmek _ {$ type} _columns' ve 'yönetmek _ {$ type} _custom_column' kullandığını ve gerisini oradan anlayabildiğimi söylemekti. Duygularım vardı, ama kontrol ettim ve kullanıcıları görmedim. Gerisi yeterince kolaydır. Tho içine koyduğunuz kapsamlı çabayı takdir ediyorum ve WPHonors'ta sizin için oy kullanacağım (zaten sahip olduğumdan beri) goo.gl/CrSi Çok teşekkürler: D
jaredwilli

1
@jaredwilli - Evet, elbette. Ancak WordPress Cevapları hedefi, soran ilk kişinin ötesinde insanlar için cevaplar sağlamaktır. Bu yüzden derinlemesine yazıyorum, ancak başkalarının yaklaşım için tamamen yeni olabileceği bilgi parçalarına ihtiyacınız olsa da. Her ikisine de yardım etmeye çalışıyorum. Oh, ve sitede güzel yorumlar için teşekkürler (ve şans olsa ben bu fotoğraf değiştirmek olabilir? :)
MikeSchinkel

Evet, bu yüzden sadece kullanmam gereken kancayı söylemeni engellemedim. Buna ihtiyacım olan tek kişi olmayacağımı biliyorum, bu yüzden hepsi iyi.
jaredwilli

Üzgünüm, tabii ki yapacağım. Yaptığım bir mağaza sitesi için yaptığım özel bir yazı türü dikkatimi dağıttı. Yazı sayılarını, yazarlarının yazılarını gösteren bir edit.php sayfasına bağlamanın bir yolunu bulduğunuzu düşünmüyorum? Muhtemelen bunu benim CPT'm içine inşa etmeliyim.
jaredwilli

@jaredwilli - Ah, evet, ama @somatic sizin için yapmış gibi görünüyor, değil mi?
MikeSchinkel

2

Aşağıda sorich87'nin cevabı üzerinde bir varyasyon var, çünkü onun çalışmasını alamadım ve birden fazla türü otomatik olarak desteklemek istedim:

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

Sizin get_posts_by_author_sql()için WHERE ifadesini nasıl oluşturduğumu ve bunun nasıl yapıldığını okudum , ancak elde ettiğim sonuçlar her zaman "1 = 0" idi. Bu yüzden sadece SQL deyiminin geri kalanını yazdım get_posts_by_author_sql(), sadece iki bit yazmak zorunda kaldığınız için kaydettik: yazı tipi ve yazar:

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

Bu da işe yarıyor ve istediğiniz kadar sütun ekleyecek, ancak her biri yatay alan kullanıyor, Mike'ın öğreticisi özel yazı türleri için tek bir sütun ekleyecek ve daha sonra bunları bu satır içinde bir tablo olarak listeleyecek. Aynı bilgi, farklı görselleştirme. Mike, büyük olasılıkla büyük miktarlarda türler için daha iyidir, çünkü yoğun bir dikey liste oluşturur (ve yalnızca boş değilse bir sayım öğesi görüntüler), sorich87'in yöntemi ise çok fazla yatay sütun odası olduğu için daha küçük miktarlar için iyidir.

Unutmayın, yalnızca yayınlanmış öğeleri döndürmek için sorguya "post_status = yayınla" ekleyebilirsiniz, örneğin şu anda tüm yayınları döndürür ...


Harika! get_posts_by_author_sql( $column, true, $user_id );where ifadesini oluşturmalıdır.
sorich87

1

Aşağıdakiler ekleyecektir:

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()ha? Bu benim için yeni; Teşekkürler! Ama sadece kodunu kontrol ettim ve beklediğini yaptığını sanmıyorum. Aramanız get_posts_by_author_sql()her zaman geri döner '1=0've bir kullanıcı için posta türüne göre bir sayım listesi almak istedi; Bu kodu yanlış anlamadım bunu yapmaz. Belki düzeltebilirsin?
MikeSchinkel

Evet, soruyu yanlış anladım. Kodum, bir özel gönderi türü için yalnızca bir sütun ekleyecektir. Sadece post_typeyazı tipi adıyla değiştirin . Örneğin: get_posts_by_author_sql( 'book', true, $user_id );'kitap' adı verilen bir yazı türü için. Test edildi ve çalışıyor.
sorich87

Not: WPHonors'da da sana oy verdim. Kesinlikle hak ediyorsun!
sorich87

Bunu henüz test etmedim, ama işe yarayacak gibi görünüyor, sadece aradığım tüm işlevselliğe sahip olmayabilir, ancak yine de eklemek kolaydır. Teşekkürler :)
jaredwilli

@ sorich87 - Harika!
MikeSchinkel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.