WP_User_Query เพื่อแยกผู้ใช้ที่ไม่มีโพสต์


9

ฉันเห็นว่าเป็นไปได้หรือไม่ที่จะจัดเรียงคิวรีผู้ใช้ตามจำนวนโพสต์ที่ผู้ใช้แต่ละคนมี แต่เป็นไปได้หรือไม่ที่จะยกเว้นผู้ใช้ที่มีโพสต์เป็นศูนย์จากผลลัพธ์ ในคลาส Wp_User_Query มีการpre_user_queryดำเนินการ แต่สตริงการสืบค้นเป็นจุดอ่อนมากดังนั้นฉันไม่แน่ใจว่าการกระทำตัวกรองประเภทใดที่ฉันต้องการใช้ที่นี่


จะเป็นการเสียภาษีน้อยลงหรือไม่หากจะละทิ้งผลการค้นหาผู้ใช้เหล่านั้นที่post_count== 0
GhostToast

3
ฉันเพิ่งเตรียมพร้อมที่จะปิดเรื่องนี้เป็นคำถามที่ผิดศีลธรรมโดยสิ้นเชิง WordPress ทำสิ่งนี้โดยอัตโนมัติด้วยget_posts_by_author_sqlฟังก์ชั่นที่สร้าง SQL สำหรับการget_authors()สืบค้น ผู้ใช้จะต้องมีโพสต์ที่เผยแพร่หรือโพสต์ส่วนตัวที่จะรวมอยู่ในผลลัพธ์ #facepalm
helgatheviking

เด็ดดีใจที่คุณพบคำตอบ
GhostToast

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

1
คำถามนี้ไม่ได้โง่ แต่มี upvotes โปรดให้คำตอบกับคุณเพื่อช่วยผู้อื่น
Wyck

คำตอบ:


10

ฉันได้คำตอบ 2 ข้อ

โซลูชันที่ 1 - foreach วนรอบและตรวจสอบผู้ใช้แต่ละคน

อันนี้มีพื้นฐานมาจากโซลูชันของ @ GhostToast แต่ด้วยฟังก์ชั่น WordPress ที่ได้รับการปรับปรุง

//new query with default args
$author_query = new WP_User_Query();

// Get the results
$authors = $author_query->get_results();

if( $authors ) {

    foreach( $authors as $author ) {

     if ( count_user_posts( $author->id ) >= 1 ) {

        echo $author->display_name . '</br>';
    }
}
} else { 
    echo "no users found"; 
}

โซลูชันที่ 2 - pre_user_queryการกระทำกางเกงแฟนซี

นี่คือสิ่งที่ฉันคิดเมื่อฉันโพสต์คำถามเมื่อพบการpre_user_queryกระทำในWP_User_Queryชั้นเรียน หากคุณผ่านpost_countเป็นorderbyพารามิเตอร์ของคุณแล้วบาง SQL แบบสอบถามแฟนซีที่ฉันจะไม่ได้คิดด้วยตัวเองเกิดขึ้นเพื่อเข้าร่วมตารางที่เหมาะสมด้วยกัน ดังนั้นสิ่งที่ฉันทำคือคัดลอกคำสั่งเข้าร่วมและเพิ่มลงในของฉันเอง นี่จะดีกว่าถ้าฉันสามารถตรวจสอบสถานะของมันก่อนที่จะเพิ่ม ... บางทีฉันอาจจะใช้การจับคู่สตริงในอนาคต แต่ตอนนี้เนื่องจากฉันเป็นผู้ตั้งค่าแบบสอบถามฉันรู้ว่ามันไม่ได้อยู่ที่นั่นและฉันก็ยังไม่ต้องกังวลเลย ดังนั้นรหัสกลายเป็นเช่นนั้น:

function authors_with_posts( $query ) {

    if ( isset( $query->query_vars['query_id'] ) && 'authors_with_posts' == $query->query_vars['query_id'] ) {  
        $query->query_from = $query->query_from . ' LEFT OUTER JOIN (
                SELECT post_author, COUNT(*) as post_count
                FROM wp_posts
                WHERE post_type = "post" AND (post_status = "publish" OR post_status = "private")
                GROUP BY post_author
            ) p ON (wp_users.ID = p.post_author)';
        $query->query_where = $query->query_where . ' AND post_count  > 0 ';  
    } 
}
add_action('pre_user_query','authors_with_posts');

แล้วใช้มัน

$args = ( array( 'query_id' => 'authors_with_posts' ) );  
$author_query = new WP_User_Query( $args );

แนวคิดสำหรับquery_idพารามิเตอร์มาจาก An Introduction to WP_User_Class

ซึ่งเป็นเพียงการอ้างอิงที่ดีมาก WP_User_Query


1
นี่มันช่างน่ารัก ตอนนี้สิ่งที่เราต้องการคือวิธีในการปรับหน้าการนับหน้าให้เป็นรายการทำใหม่ ...
Christine Cooper

โทรดีมาก ไม่รู้จะทำยังไง
helgatheviking

ตอนนี้ผู้เขียน -> id ตอนนี้ผู้เขียน -> ID (การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ แต่ id ถูกคิดค่าเสื่อมราคา)
raison

3

ตั้งแต่ 4.4 คุณสามารถใช้พารามิเตอร์ `has_published_posts 'ได้

ตัวอย่าง:

$authors = get_transient('mytheme_all_authors');
if (empty($authors)){

    $user_args = array(
    'role__in'    => array('Author', 'Administrator', 'Contributor'),
    'orderby' => 'post_count',
    'order'   => 'DESC',
    'count_total'  => true,
    'has_published_posts' => array('post'),
    );

    $authors = new WP_User_Query( $user_args );
    set_transient('mytheme_all_authors', $authors, 1 * HOUR_IN_SECONDS );
}

$total= $authors->get_total();
$authors = $authors->results;
foreach ( $authors as $user) {
    // loop through your users....

has_published_postsอาจเป็นจริง / เท็จ (หรือเป็นโมฆะ) หรืออาร์เรย์ประเภทโพสต์ (เช่นในตัวอย่างนี้)

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


0

ส่งเป็นคำตอบสำหรับการปิด:

   $all_members = get_users();
      foreach($all_members as $member){
        $post_count = count_user_posts($member->ID);
        if(empty($post_count)) {
            $bad_writers[] = $member->ID;
            continue;
        } else {
            // do something;
        }
    }

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

get_users_with_role()ไม่ใช่ฟังก์ชั่น WordPress หรือฉันดูคอมพิวเตอร์ของฉันนานเกินไป?
helgatheviking

1
มันไม่มีอยู่จริง ที่ไหนมี 966 "get_users_with_role": 0 matches across 0 filesไฟล์ ยังget_usernumpostsมีการคิดค่าเสื่อมราคาให้ใช้count_user_posts()
Wyck

โอ๊ะ! ขอโทษด้วย. นี่เป็นฟังก์ชั่นที่ฉันเขียนสำหรับเว็บไซต์ที่เป็นสมาชิก คุณสามารถใช้ get_users () และส่งพารามิเตอร์อะไรก็ได้ที่คุณต้องการ: codex.wordpress.org/Function_Reference/get_users
GhostToast

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