การแสดงจำนวนโพสต์ของผู้ใช้ตามประเภทโพสต์ที่กำหนดเองในรายการผู้ใช้ของผู้ดูแลระบบ?


9

ฉันพยายามที่จะคิดออกว่าจะขอเข้ามา/wp-admin/users.phpจัดการเพจเพื่อสร้างคอลัมน์ที่กำหนดเองสำหรับการแสดงจำนวนผู้ใช้โพสต์มีสำหรับประเภทโพสต์ที่กำหนดเองในWPHonors.com

ฉันสร้างtrac ticketสำหรับสิ่งนี้ แต่@nacinอธิบายว่าทำไมมันถึงมีงานให้ปลั๊กอินมากกว่า

ฉันไม่สามารถหาวิธีจัดการกับผลลัพธ์ของตารางผู้ใช้ดังนั้นฉันสามารถเพิ่มคอลัมน์ที่กำหนดเองสำหรับการนับโพสต์ CPT สำหรับผู้ใช้แต่ละคน และนั่นอาจเกี่ยวข้องกับคำถาม @nacin ที่ถามว่าจำนวนการโพสต์จะลิงก์ไปยังอะไร สำหรับการโพสต์ 'โพสต์' ในปัจจุบันที่ผู้ใช้มีจำนวนโพสต์นั้นจะเชื่อมโยงไปยังหน้าจัดการโพสต์แสดงโพสต์ทั้งหมดสำหรับผู้ใช้นั้น ( /wp-admin/edit.php?author=%author_id%)

ถ้าฉันจะเชื่อมโยงมันที่ไหนสักแห่งมันจะเป็น:

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

ถ้าเป็นไปได้อย่างใดฉันก็เดาได้ แต่ฉันไม่จำเป็นต้องเชื่อมโยงกับทุกที่ ฉันส่วนใหญ่ต้องการเพียงแสดงจำนวนการโพสต์ CPT สำหรับแต่ละคนโดยมี600ผู้ใช้และ300+โพสต์รวมกันใน4ประเภทโพสต์ที่กำหนดเอง ผู้ดูแลระบบเป็นเพียงคนเดียวที่สามารถส่ง'post'โพสต์ดังนั้นคอลัมน์ในหน้าผู้ใช้จึงไม่มีประโยชน์

คำตอบ:


10

นี่คือส่วนขยายของคำตอบการสอนของ Mike ฉันเพิ่มลิงก์ไปยังประเภทที่ระบุไว้เพื่อให้คุณสามารถคลิกที่รายการหนึ่งและนำไปยังรายการของโพสต์ทั้งหมดในประเภทนั้นสำหรับผู้เขียนนั้นซึ่งต้องการตัวแปรเพิ่มเติมสำหรับ$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

สมมติว่าฉันเข้าใจคำถามสิ่งที่คุณต้องทำคือขอลงในสอง hooks ที่เกี่ยวข้องกับส่วนหัวของคอลัมน์และค่าคอลัมน์สำหรับผู้ดูแลระบบจัดการหน้า พวกเขาเป็น'manage_{$type}_columns'และ'manage_{$type}_custom_column'ที่ในกรณีการใช้งานของคุณคือ{$type}users

'manage_users_columns'เบ็ด

อันแรกนี้ง่ายมันช่วยให้คุณระบุส่วนหัวของคอลัมน์และคอลัมน์ที่มีอยู่ WordPress ฮาร์ดโค้ดมูลค่าของคอลัมน์"โพสต์"ดังนั้นเมื่อคุณต้องการเปลี่ยนเราจะทำการลบออก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'hook ซึ่งเรียกใช้เฉพาะคอลัมน์ที่ไม่ได้มาตรฐานเท่านั้น เราทดสอบ$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()เมื่อเรียกใช้แบบสอบถามในการโพสต์ แต่แบบสอบถามนี้จะต้องใช้ hooks อื่น ๆ มากมายมันดูง่ายกว่าที่จะ"ซุกซน"และทำได้ทั้งหมดในที่เดียว

ฉันละเว้นการโพสต์ใด ๆ$post->post_typeมี'revision'หรือแต่ที่เหลืออยู่ใน'nav_menu_item' 'attachments'คุณอาจพบว่าดีกว่าที่จะรวมประเภทโพสต์ที่คุณต้องการแทนการยกเว้นที่ฉันทำ

ฉันยังกรองโดย$post->post_statusเพียงและ'publish' 'pending'หากคุณต้องการ ได้แก่'future', 'private'และ / หรือ'draft'คุณจะต้องทำการเปลี่ยนแปลงในรหัส

สำหรับการโหลดแต่ละหน้าฉันเรียก_yoursite_get_author_post_type_counts()ใช้ฟังก์ชันนี้เพียงครั้งเดียวแล้วเก็บไว้ในตัวแปรแบบคงที่แทนที่จะเรียกใช้สำหรับผู้ใช้แต่ละคน ฉันเก็บไว้ในอาร์เรย์ที่จัดทำดัชนีโดยผู้เขียน / ID ผู้ใช้ที่มีอาร์เรย์ที่มีชื่อประเภทโพสต์ในองค์ประกอบ'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 ผลลัพธ์

และนี่คือสิ่งที่ดูเหมือนว่านำไปใช้กับการทดสอบการติดตั้ง WordPress 3.0.1 ของฉัน:


(ที่มา: mikeschinkel.com )

ดาวน์โหลดรหัสเต็ม

คุณสามารถดาวน์โหลดรหัสเต็มจากส่วนสำคัญ :

คุณสามารถคัดลอกรหัสนี้ไปยังfunctions.phpไฟล์ของธีมหรือร้านค้ารวมถึงไฟล์ในปลั๊กอินใดก็ได้ที่คุณเลือก

หวังว่านี่จะช่วยได้!


ก็ง่ายนะ สิ่งที่คุณต้องทำคือใช้ 'จัดการ _ {$ ประเภท} _columns' และ 'จัดการ _ {$ ประเภท} _custom_column' โดยที่ $ type = ผู้ใช้และฉันสามารถหาที่เหลือได้จากที่นั่น ฉันรู้สึกว่ามันทำ แต่ฉันตรวจสอบแล้วและไม่เห็นผู้ใช้ ที่เหลือก็ง่ายพอ ฉันซาบซึ้งในความพยายามมากมายที่คุณใส่ลงไปและฉันจะลงคะแนนให้คุณใน WPHonors แน่นอน (เพราะฉันมีอยู่แล้ว) goo.gl/CrSi ขอบคุณมาก: D
jaredwilli

1
@jaredwilli - ใช่แน่นอน แต่เป้าหมายคำตอบ WordPress คือการให้คำตอบสำหรับคนที่ดีเกินกว่าคนแรกที่ถาม นั่นเป็นเหตุผลที่ฉันเขียนเชิงลึกถึงแม้ว่าคุณอาจแค่ต้องการบิตของข้อมูลอื่น ๆ อาจจะใหม่สำหรับวิธีการ พยายามช่วยเหลือทั้งคู่ โอ้และขอบคุณสำหรับความคิดเห็นที่ดีในเว็บไซต์ (และโอกาสที่ฉันจะเปลี่ยนรูปได้มั้ย :)
MikeSchinkel

ใช่นั่นคือเหตุผลที่ฉันไม่ได้หยุดคุณเพียงแค่บอกเบ็ดที่ฉันต้องการใช้ ฉันรู้ว่าฉันจะไม่เป็นคนเดียวในการค้นหาความต้องการสำหรับสิ่งนี้ดังนั้นมันจึงเป็นเรื่องดี
jaredwilli

ขอโทษแน่นอนฉันจะ ฉันถูกรบกวนโดยโพสต์แบบกำหนดเองที่ฉันทำสำหรับเว็บไซต์ร้านค้าที่กำลังสร้าง ฉันไม่คิดว่าคุณจะหาวิธีเชื่อมโยงการนับโพสต์ไปยังหน้า edit.php ที่แสดงการโพสต์สำหรับผู้แต่งหรือไม่ อาจต้องสร้างที่เป็นของฉัน CPT ฉันคาดเดา
jaredwilli

@jaredwilli - อ่าใช่ แต่ดูเหมือนว่า @somatic ทำเพื่อคุณใช่ไหม?
MikeSchinkel

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" เสมอ ดังนั้นฉันจึงเขียนส่วนที่เหลือของคำสั่ง SQL เช่นget_posts_by_author_sql()เดียวกับการบันทึกคุณต้องเขียนสองบิต: ประเภทโพสต์และผู้เขียน:

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

วิธีนี้ใช้งานได้ดีและจะเพิ่มคอลัมน์ตามที่คุณต้องการ แต่แต่ละคอลัมน์ใช้พื้นที่แนวนอนในขณะที่บทช่วยสอนของ Mike จะเพิ่มคอลัมน์เดียวสำหรับประเภทโพสต์ที่กำหนดเองแล้วแสดงเป็นตารางภายในแถวนั้น ข้อมูลเดียวกันการสร้างภาพที่แตกต่าง ไมค์อาจดีกว่าสำหรับประเภทจำนวนมากเนื่องจากสร้างรายการแนวตั้งแบบย่อ (และแสดงเฉพาะรายการที่นับหากไม่ว่าง) ในขณะที่วิธีการของ sorich87 นั้นดีสำหรับปริมาณน้อยเนื่องจากมีห้องคอลัมน์แนวนอนมากเท่านั้น

อย่าลืมว่าคุณสามารถเพิ่ม "post_status = เผยแพร่" ในแบบสอบถามเพื่อส่งคืนรายการที่เผยแพร่เท่านั้นเนื่องจากตัวอย่างส่งคืนโพสต์ทั้งหมด ...


ที่ดี! get_posts_by_author_sql( $column, true, $user_id );ควรสร้างคำสั่ง where
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'และเขาต้องการรับรายการการนับตามประเภทโพสต์สำหรับผู้ใช้ นอกจากว่าฉันเข้าใจผิดรหัสนี้จะไม่ทำเช่นนั้น บางทีคุณสามารถแก้ไขได้?
MikeSchinkel

ใช่ฉันเข้าใจผิดคำถาม รหัสของฉันจะเพิ่มเพียงหนึ่งคอลัมน์สำหรับประเภทโพสต์ที่กำหนดเองหนึ่งรายการ เพียงแทนที่post_typeด้วยชื่อประเภทโพสต์ เช่น: get_posts_by_author_sql( 'book', true, $user_id );สำหรับประเภทโพสต์ที่เรียกว่า 'หนังสือ' ผ่านการทดสอบและใช้งานได้
sorich87

PS: โหวตให้คุณบน WPHonors คุณสมควรได้รับมันแน่นอน!
sorich87

ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่ดูเหมือนว่าจะใช้งานได้อาจไม่ได้มีฟังก์ชั่นทั้งหมดที่ฉันต้องการ แต่ก็ง่ายที่จะเพิ่ม ขอบคุณ :)
jaredwilli

@ sorich87 - ยอดเยี่ยม!
MikeSchinkel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.