投稿のないユーザーを除外するWP_User_Query


9

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


結果から単に破棄するほうが負担が少なくなりpost_countますか?== 0のユーザー
GhostToast

3
私はこれを完全にモロニックな質問として閉じる準備をしていました。WordPressはget_posts_by_author_sqlget_authors()クエリのSQLを生成する関数でこれを自動的に行います。ユーザーが結果に含まれるには、公開または非公開の投稿が必要です。#facepalm
helgatheviking

あなたが答えを見つけてうれしい
GhostToast

私も!愚かさの理由で質問を閉じるオプションはありませんが。でもありがとうございました。get_authors()結果を一時的なものとして保存したいので、あなたの弁護人を適用します...毎回クエリを実行する必要なく、現在の作成者をスキップできます。
helgatheviking

1
この質問は愚かではなく、賛成票を得ました。他の人を助けることができるので、回答としてソリューションを提供してください。
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_queryWP_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パラメータのアイデアは、WP_User_Classの紹介からのものです。

どちらも非常に良いリファレンスです WP_User_Query


1
これは素敵です。ここで必要なのは、改ページのページ数を新しいリワークされたリストに調整する方法だけです...
Christine Cooper

よかった。それを行う方法がわからない。
helgatheviking 2014

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

注:この特定のクエリはシステムによってはかなり重くなる可能性があるため、ここでは一時的なものを使用しています。将来の使用のために保存することは理にかなっています。


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

@GhostToast回答を更新してください。
カイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.