Gönderi olmayan kullanıcıları hariç tutmak için WP_User_Query


9

Bir kullanıcı sorgusunu her kullanıcının sahip olduğu gönderi sayısına göre sıralamanın mümkün olduğunu görüyorum, ancak sıfır yayını olan kullanıcıları sonuçtan hariç tutmak mümkün mü? Wp_User_Query sınıfında bir pre_user_queryeylem var, ancak sorgu dizeleri büyük bir zayıf nokta, bu yüzden burada ne tür bir filtre eylemi kullanmak istediğimden emin değilim.


post_count== 0 olan kullanıcılardan, sonuçlardan basitçe vazgeçmek daha az vergi ister mi ?
GhostToast

3
Bunu tamamen moronik bir soru olarak kapatmaya hazırlanıyordum. WordPress bunu sorgu get_posts_by_author_sqliçin SQL üreten işlevle otomatik olarak yapar get_authors(). Kullanıcıların sonuçlara dahil edilebilmesi için yayınlanmış veya özel bir yayını olması gerekir. #facepalm
helgatheviking

cevabı bulduğuna sevindim
GhostToast

Ben de! Aptallık nedeniyle soruyu kapatmak için bir seçenek olmamasına rağmen. Ama chiming için teşekkürler. Avukatınızı uygulayacağım çünkü get_authors()sonucu geçici olarak kaydetmek istiyorum ... o zaman mevcut yazarı her seferinde bir sorgulamaya gerek kalmadan atlayabilirim.
helgatheviking

1
Bu sorular aptal değil, oylar aldı, lütfen çözümünüzü başkalarına yardımcı olabileceği için bir cevap olarak sağlayın.
Wyck

Yanıtlar:


10

2 çözüm buldum.

Çözüm 1 - Her döngüyü önleyin ve her kullanıcıyı doğrulayın

Bu, @ GhostToast'ın çözümüne dayanmaktadır, ancak güncellenmiş WordPress işlevleriyle

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

Çözüm 2 - Süslü Pantolon pre_user_queryEylem

Sınıfta bir pre_user_queryeylem bulduğumda sorumu gönderdiğimde böyle düşünüyordum WP_User_Query. Eğer parametre post_countolarak geçerseniz orderbyo zaman ben asla kendi başıma anlamaya olurdu bazı fantezi SQL sorgulama birlikte uygun tablolara katılmak olur. Yani yaptığım şey bu birleştirme ifadesini kopyalayıp kendime eklemekti. Eğer eklemeden önce varlığını kontrol edebilseydim bu daha iyi olurdu ... belki gelecekte bir dize eşleşmesi kullanacağım. Ama şimdilik ben sorguyu kurma biri olduğumdan beri orada olmadığını biliyorum ve henüz bu konuda endişelenmeyeceğim. Böylece kod şöyle çıktı:

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

ve sonra kullanmak için

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

query_idParametre fikri WP_User_Class'a Giriş'ten

Bu da sadece çok iyi bir referans. WP_User_Query


1
Bu çok hoş. Şimdi ihtiyacımız olan sayfa sayfa sayısını yeni elden geçirilen listeye ayarlamanın bir yolu ...
Christine Cooper

İyi karar. Bunu nasıl yapacağınızı bilmiyorum.
helgatheviking

author-> id is now author-> ID (küçük bir değişiklik ancak id amortismana tabi
raison

3

4.4'ten beri `` has_published_posts '' parametresini kullanabilirsiniz.

Misal:

$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_poststrue / false (veya null) veya bir dizi yazı türü olabilir (bu örnekte olduğu gibi).

Not: Bu geçici sorgu sisteme bağlı olarak oldukça ağır alabilirsiniz, çünkü gelecekteki kullanımlar için saklamak mantıklı çünkü burada geçici kullanıyorum.


0

Kapanış için cevap olarak gönderme:

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

Bu, tüm rollerin kullanıcılarını elde etmek için gerekli geçici çözüm mü? Bu argümanı boş bırakmanın çoklu sitedeki tüm kullanıcıları döndürmediğini görüyorum.
helgatheviking

get_users_with_role()bir WordPress işlevi değil veya bilgisayarıma çok uzun zamandır mı bakıyorum?
helgatheviking

1
Mevcut değil. 966 dosya aranıyor "get_users_with_role": 0 matches across 0 files. Ayrıca get_usernumpostsamortismana tabi tutulur, kullanımcount_user_posts()
Wyck

argh! özür dilerim. Bu üye tabanlı bir site için yazdığım bir işlevdi. get_users () yöntemini kullanabilir ve istediğiniz parametreleri iletebilirsiniz: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast Lütfen sadece cevabınızı güncelleyin.
kaiser
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.