WP_User_Query untuk mengecualikan pengguna tanpa pos


9

Saya melihat bahwa adalah mungkin untuk mengurutkan permintaan pengguna dengan jumlah posting yang dimiliki setiap pengguna, tetapi apakah mungkin untuk mengecualikan pengguna dengan nol posting dari hasilnya? Di kelas Wp_User_Query ada pre_user_querytindakan, tetapi string kueri adalah titik lemah yang sangat besar, jadi saya tidak yakin apa jenis tindakan filter yang ingin saya gunakan di sini.


Apakah akan lebih sedikit pajak untuk hanya membuang dari hasil, para pengguna yang post_count== 0?
GhostToast

3
Saya baru saja bersiap untuk menutup ini sebagai pertanyaan yang benar-benar gila. WordPress melakukan ini secara otomatis dengan get_posts_by_author_sqlfungsi yang menghasilkan SQL untuk get_authors()kueri. Pengguna harus memiliki posting yang dipublikasikan atau pribadi untuk dimasukkan dalam hasil. #facepalm
helgatheviking

keren senang kamu menemukan jawabannya
GhostToast

Saya juga! Padahal tidak ada pilihan untuk menutup pertanyaan dengan alasan kebodohan. Terima kasih telah ikut berbicara. Saya akan menerapkan nasihat Anda karena saya ingin menyimpan get_authors()hasilnya sebagai sementara ... maka saya dapat dengan mudah melewati penulis saat ini tanpa perlu melakukan kueri setiap waktu.
Helgatheviking

1
Pertanyaan-pertanyaan ini tidak bodoh, tetapi mendapat dukungan, tolong berikan solusi Anda sebagai jawaban karena dapat membantu orang lain.
Wyck

Jawaban:


10

Yah saya telah datang dengan 2 solusi.

Solusi 1 - foreach loop dan verifikasi setiap pengguna

Yang ini didasarkan dari solusi @ GhostToast, tetapi dengan fungsi WordPress yang diperbarui

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

Solusi 2 - pre_user_queryaksi celana mewah

Inilah yang saya pikirkan ketika saya memposting pertanyaan saya begitu saya menemukan pre_user_querytindakan di WP_User_Querykelas. Jika Anda masuk post_countsebagai orderbyparameter Anda maka beberapa query SQL mewah yang saya tidak akan pernah tahu sendiri akan bergabung dengan tabel yang tepat bersama. Jadi yang saya lakukan adalah menyalin pernyataan bergabung itu dan menambahkannya ke saya sendiri. Ini akan lebih baik jika saya bisa memeriksa keberadaannya terlebih dahulu sebelum menambahkannya ... mungkin saya akan menggunakan pencocokan string di masa depan. Tetapi untuk sekarang karena saya yang mengatur permintaan, saya tahu itu belum ada dan saya belum akan mengkhawatirkannya. Jadi kodenya menjadi seperti ini:

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

dan kemudian menggunakannya

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

Gagasan untuk query_idparameter berasal dari An Introduction to WP_User_Class

Yang juga hanya referensi yang sangat bagus WP_User_Query


1
Ini indah. Sekarang yang kita butuhkan adalah cara untuk menyesuaikan jumlah halaman pagination ke daftar ulang baru ...
Christine Cooper

Panggilan yang bagus. Tidak tahu bagaimana cara melakukannya.
Helgatheviking

author-> id sekarang author-> ID (perubahan kecil tapi id disusutkan)
raison

3

Sejak 4.4, Anda cukup menggunakan parameter `has_published_posts '.

Contoh:

$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_postsdapat berupa true / false (atau null), atau array tipe posting (seperti dalam contoh ini).

Catatan: Saya menggunakan transien di sini karena kueri khusus ini dapat menjadi sangat berat tergantung pada sistem sehingga masuk akal untuk menyimpannya untuk penggunaan di masa mendatang.


0

Mengirimkan sebagai jawaban untuk penutupan:

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

Apakah itu solusi yang diperlukan untuk mendapatkan pengguna dari semua peran? Saya menemukan bahwa membiarkan argumen itu kosong tidak mengembalikan semua pengguna di multisite.
Helgatheviking

get_users_with_role()bukan fungsi WordPress atau apakah saya sudah terlalu lama melihat komputer?
Helgatheviking

1
Itu tidak ada. Mencari 966 file untuk "get_users_with_role": 0 matches across 0 files. Juga get_usernumpostsdisusutkan, gunakancount_user_posts()
Wyck

argh! permintaan maaf saya. ini adalah fungsi yang saya tulis untuk situs berbasis anggota. Anda cukup menggunakan get_users () dan memberikan parameter apa pun yang Anda inginkan: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast Harap perbarui jawaban Anda.
kaiser
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.