web-dev-qa-db-ja.com

投稿のないユーザーを給与するWP_User_Query

各ユーザーの投稿数でユーザークエリを並べ替えることはできますが、投稿数がゼロのユーザーを結果から除外することはできますか。 Wp_User_Queryクラスにはpre_user_queryアクションがありますが、クエリ文字列は大きな弱点なので、ここでどのような種類のフィルタアクションを使用したいのかわかりません。

9
helgatheviking

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 action

pre_user_queryクラスでWP_User_Queryアクションが見つかったときに質問を投稿したときに、これについて考えていました。あなたがあなたのorderbyパラメータとしてpost_countを渡すならば、私が自分自身で考え出すことができなかっただろうという若干の派手なSQLは適切なテーブルを一緒に結合することが起こります。そこで私は、そのjoinステートメントをコピーして自分のものに追加しました。追加する前にまずその存在を確認することができれば、これはより良いでしょう…おそらく将来文字列の一致を使用するでしょう。しかし、今のところ、私はクエリを設定しているので、それが存在しないことを知っていて、まだ心配する必要はありません。そのため、コードは次のようになりました。

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に関する非常に良い参考文献です。

10
helgatheviking

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は、true/false(またはnull)、または投稿タイプの配列(この例のように)のいずれかです。

注:ここではトランジェントを使用しています。システムによってはこの特定のクエリがかなり重くなる可能性があるため、将来の使用に備えて格納するのが合理的です。

3
pixeline

終了の回答として送信する

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