व्यवस्थापक की उपयोगकर्ता सूची में कस्टम पोस्ट प्रकार द्वारा उपयोगकर्ता की पोस्ट की संख्या दिखाना?


9

मैं यह जानने की कोशिश कर रहा हूं कि WPHonors.com/wp-admin/users.php पर कस्टम पोस्ट प्रकारों के लिए उपयोगकर्ताओं के पास कितनी संख्या में पोस्ट दिखाने के लिए कस्टम कॉलम बनाने के लिए प्रबंधन पृष्ठ पर हुक लगाने का तरीका है ।

मैंने इसके लिए एक टीआरसी टिकट बनाया, लेकिन @nacin ने बताया कि इसके बजाय एक प्लगइन के लिए यह अधिक काम क्यों है।

मुझे उपयोगकर्ता तालिका के उत्पादन में हेरफेर करने का कोई तरीका नहीं मिला है, इसलिए मैं प्रत्येक उपयोगकर्ता के लिए CPTs पोस्ट की गणना के लिए कस्टम कॉलम जोड़ सकता हूं। और इससे कुछ सवाल हो सकता है @nacin ने पूछा, पोस्ट संख्याओं को लिंक से क्या लिंक करेगा। वर्तमान 'पोस्ट' पोस्ट के लिए एक उपयोगकर्ता की गिनती होती है, यह पोस्ट प्रबंधन पृष्ठ से लिंक करता है, उस उपयोगकर्ता के लिए सभी पोस्ट दिखाता है ( /wp-admin/edit.php?author=%author_id%)।

अगर मैं इसे कहीं लिंक करता, तो यह होता:

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

अगर यह किसी भी तरह संभव था, तो मुझे लगता है। लेकिन मुझे इसे कहीं भी लिंक करने की आवश्यकता भी नहीं है। मैं ज्यादातर बस प्रत्येक व्यक्ति के लिए सीपीटी पोस्ट मायने रखता है, होने दिखाना चाहते हैं 600उपयोगकर्ताओं और की संयुक्त कुल 300+भर में पदों 4कस्टम पोस्ट प्रकार। Admins केवल एक है जो 'post'पोस्ट सबमिट कर सकता है , ताकि उपयोगकर्ता के पेज में कॉलम बेकार हो।

जवाबों:


10

यहाँ माइक के ट्यूटोरियल उत्तर का विस्तार है। मैंने सूचीबद्ध प्रकारों के लिंक जोड़े ताकि आप एक पर क्लिक कर सकें और उस लेखक के लिए उस प्रकार के सभी पदों की एक सूची पर अधिकार कर सकें, जिसके लिए एक अतिरिक्त चर $countsऔर कुछ अतिरिक्त आउटपुट की आवश्यकता थी$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

यह मानते हुए कि मैं प्रश्न को समझ गया हूं, आपको जो करने की आवश्यकता है वह कॉलम हेडर से संबंधित दो हुक में है और एडमिन पेज के लिए कॉलम वैल्यू है। वे हैं 'manage_{$type}_columns'और 'manage_{$type}_custom_column'आपके उपयोग-मामले में कहां {$type}है users

'manage_users_columns'अंकुड़ा

यह पहला सरल है, यह आपको कॉलम हेडर और इसलिए उपलब्ध कॉलम निर्दिष्ट करता है। वर्डप्रेस "पोस्ट" कॉलम के मूल्य को हार्डकोड करता है, इसलिए जब से आप इसे बदलना चाहते हैं, हम बस इसे हटाने जा रहे हैं unset()और फिर उसी शीर्षक के साथ एक नया कॉलम जोड़ें, लेकिन इसके बजाय इसके पहचानकर्ता हैं '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'अंकुड़ा

आगे आपको 'manage_users_custom_column'हुक का उपयोग करने की आवश्यकता है जो केवल गैर-मानक कॉलम के लिए बुलाया जाता है। हम $column_name=='custom_posts'भविष्य में नए उपयोगकर्ता कॉलम जोड़ने के मामले में अपने कोड को मजबूत बनाने के लिए परीक्षण करते हैं और फिर हम उस फ़ंक्शन से उपयोगकर्ता पोस्ट प्रकार की संख्याएं लेते हैं _yoursite_get_author_post_type_counts()जो मैंने लिखा था, जिसकी चर्चा मैं अगले में करूंगा। मैं तो इस प्रारूप के लिए कुछ तरीके के साथ खेला लेकिन फैसला किया एक HTML <table>सबसे उपयुक्त था (क्योंकि यह है डेटा की एक तालिका) । यदि कोई तालिका आपके लिए काम नहीं करती है, तो मुझे लगता है कि आप बहुत आसानी से अलग मार्कअप उत्पन्न कर पाएंगे:

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

प्रत्येक उपयोगकर्ता / लेखक के लिए पोस्ट प्रकार के हिसाब से पोस्ट काउंट प्राप्त करना

अंत में लेखक / उपयोगकर्ता द्वारा पोस्ट प्रकार से पोस्ट काउंट्स की पुनर्प्राप्ति है। आम तौर पर मैं WP_Query()पोस्ट पर प्रश्नों को चलाते समय उपयोग करने के साथ छड़ी करने की कोशिश करता हूं, लेकिन इस क्वेरी को कई अन्य हुक का उपयोग करने की आवश्यकता होती है यह सिर्फ "शरारती" होना आसान लगता है और सभी को एक में करते हैं।

मैं के किसी भी पद छोड़ा गया $post->post_typeहै 'revision'या 'nav_menu_item'लेकिन में छोड़ दिया 'attachments'। हो सकता है कि आपने मेरे द्वारा किए गए पोस्ट को बाहर करने के बजाय स्पष्ट रूप से पोस्ट प्रकारों को शामिल करना बेहतर समझा हो।

मैं भी $post->post_statusकेवल 'publish'और के लिए फ़िल्टर किया गया 'pending'। यदि आप भी शामिल करना चाहते हैं 'future', 'private'और / या 'draft'आपको कोड में परिवर्तन करने की आवश्यकता होगी।

प्रत्येक पृष्ठ लोड के लिए मैं केवल _yoursite_get_author_post_type_counts()एक बार इस फ़ंक्शन को कॉल करता हूं और फिर प्रत्येक उपयोगकर्ता के लिए कॉल के बजाय एक स्थिर चर में संग्रहीत करता हूं । मैं लेखक / उपयोगकर्ता आईडी द्वारा अनुक्रमित सरणी में संग्रहीत करता हूं जिसमें तत्व में पोस्ट प्रकार नाम के साथ एक सरणी होती है 'label'और निश्चित रूप से एक समान नाम वाले तत्व में गिनती होती है:

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

और यह वही दिखता है जो वर्डप्रेस 3.0.1 के मेरे परीक्षण इंस्टॉल पर लागू होता है:


(स्रोत: mikeschinkel.com )

पूरा कोड डाउनलोड करें

आप Gist से पूरा कोड डाउनलोड कर सकते हैं :

आप इस कोड को अपनी थीम की functions.phpफ़ाइल में कॉपी कर सकते हैं या स्टोर में फ़ाइल को एक प्लगइन में शामिल कर सकते हैं, जो भी आप चुनते हैं।

उम्मीद है की यह मदद करेगा!


खैर, यह आसान है। आपको बस इतना ही कहना था कि यह 'मैनेज _ {$ प्रकार} _columns' और 'मैनेज _ _ $ प्रकार} _custom_column ’का उपयोग करता है जहां $ प्रकार = उपयोगकर्ता हैं, और मैं वहाँ से बाकी का पता लगा सकता हूं। मुझे इसका एहसास था, लेकिन मैंने इसकी जाँच की और उपयोगकर्ताओं को नहीं देखा। बाकी काफी आसान है। मैं आपके द्वारा किए गए व्यापक प्रयास की सराहना करता हूं, और मैं WPHonors पर आपके लिए मतदान करूंगा (क्योंकि मेरे पास पहले से ही है) goo.gl/CrSi बहुत बहुत धन्यवाद: D
jaredwilli

1
@ जरेडविल्ली - हां बिल्कुल। लेकिन वर्डप्रेस आंसर का लक्ष्य पहले पूछने वाले से परे लोगों के लिए उत्तर प्रदान करना है। इसलिए मैं गहराई से लिखता हूं, भले ही आपको केवल बिट्स की आवश्यकता हो, दूसरों को दृष्टिकोण के लिए पूरी तरह से नया हो सकता है। दोनों की मदद करने की कोशिश की जा रही है। ओह, और साइट पर अच्छी टिप्पणियों के लिए धन्यवाद (और मौका है कि मैं हालांकि उस तस्वीर को बदल सकता हूं? :)
माइकस्किंकल

हाँ, यही कारण है कि मैंने आपको केवल हुक का उपयोग करने से रोकने की आवश्यकता नहीं बताई। मुझे पता है कि मैं इस के लिए एक की जरूरत है केवल एक ही नहीं होगा तो यह सब अच्छा है।
जारेडविल्ली

ओह सॉरी, बिल्कुल। मैं एक कस्टम पोस्ट प्रकार Im द्वारा एक दुकान साइट Im इमारत के लिए बनाकर विचलित हो गया था। मुझे नहीं लगता कि आप पोस्ट को किसी एडिट के लिए पोस्ट काउंट से लिंक करने का एक तरीका निकालते हैं। पृष्ठ उन के लेखकों के लिए एक पोस्ट दिखा रहा है? शायद मेरे CPT Im अनुमान लगाने में बनाने की जरूरत है।
जेरेडविल्ली

@jaredwilli - आह, हाँ, लेकिन ऐसा लगता है कि @somatic ने आपके लिए किया है, है ना?
मिकशिंकेल

2

निम्नलिखित में से एक है sorich87 के उत्तर पर भिन्नता, जैसा कि मैं उसके काम करने के लिए नहीं मिल सका, और मैं स्वचालित रूप से कई प्रकारों का समर्थन करना चाहता था:

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

मैं इस पर पढ़ा get_posts_by_author_sql()और यह कि आपके लिए WHERE स्टेटमेंट का निर्माण कैसे करना है, लेकिन मुझे जो परिणाम मिले वे हमेशा "1 = 0" थे। इसलिए मैंने सिर्फ एसक्यूएल के बाकी विवरण लिखे, जैसा get_posts_by_author_sql()कि आप केवल दो बिट्स लिखने के लिए बचा रहे हैं: पोस्ट प्रकार और लेखक:

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

यह बस के रूप में अच्छी तरह से काम करता है, और आप चाहते हैं के रूप में कई कॉलम जोड़ देगा, लेकिन प्रत्येक एक क्षैतिज स्थान का उपयोग करता है, जबकि माइक के ट्यूटोरियल कस्टम पोस्ट प्रकारों के लिए एक कॉलम जोड़ देगा, और फिर उन्हें उस पंक्ति के भीतर एक तालिका के रूप में सूचीबद्ध करेगा। समान जानकारी, अलग-अलग दृश्य। माईक शायद बड़ी मात्रा में प्रकारों के लिए बेहतर है, क्योंकि यह एक संघनित ऊर्ध्वाधर सूची बनाता है (और केवल एक गिनती आइटम प्रदर्शित करता है यदि खाली नहीं है), जबकि सॉरीच87 की विधि छोटी मात्रा के लिए अच्छी है, क्योंकि वहां केवल इतना क्षैतिज स्तंभ कक्ष उपलब्ध है।

आप केवल पोस्ट की गई वस्तुओं को वापस करने के लिए क्वेरी में "post_status = publish" जोड़ सकते हैं, जैसे कि वर्तमान में सभी पोस्ट वापस नहीं आते हैं ...


महान! get_posts_by_author_sql( $column, true, $user_id );जहां बयान का निर्माण करना चाहिए।
sorich87

1

निम्नलिखित इसे जोड़ देगा:

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()एह? वह एक मेरे लिए नया है; धन्यवाद! लेकिन मैंने अभी आपका कोड चेक किया है और मुझे नहीं लगता कि यह वही करता है जो वह उम्मीद कर रहा है। आपका get_posts_by_author_sql()कॉल हमेशा लौटता है '1=0', और वह एक उपयोगकर्ता के लिए पोस्ट प्रकार के हिसाब से एक सूची प्राप्त करना चाहता था; जब तक मैं गलत नहीं समझती यह कोड ऐसा नहीं करता है। शायद आप इसे ठीक कर सकते हैं?
माइकस्किंकल

हां, मैंने सवाल गलत समझा। मेरा कोड केवल एक कस्टम पोस्ट प्रकार के लिए एक कॉलम जोड़ देगा। बस post_typeपोस्ट प्रकार के नाम से प्रतिस्थापित करें। उदा: get_posts_by_author_sql( 'book', true, $user_id );एक पद प्रकार के लिए जिसे 'पुस्तक' कहा जाता है। परीक्षण किया और यह काम करता है।
sorich87

पुनश्च: WPHonors पर भी आप के लिए मतदान किया। आप निश्चित रूप से इसके लायक हैं!
sorich87

मुझे अभी इसका परीक्षण करना बाकी है, लेकिन ऐसा लग रहा है कि यह काम करेगा, हो सकता है कि सभी कार्यक्षमता इम की तलाश में न हों, लेकिन यह अभी भी जोड़ना आसान है। धन्यवाद :)
jaredwilli

@ sorich87 - बहुत बढ़िया!
माइकस्किंकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.