各ユーザーの投稿数でユーザークエリを並べ替えることはできますが、投稿数がゼロのユーザーを結果から除外することはできますか。 Wp_User_Queryクラスにはpre_user_query
アクションがありますが、クエリ文字列は大きな弱点なので、ここでどのような種類のフィルタアクションを使用したいのかわかりません。
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
に関する非常に良い参考文献です。
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)、または投稿タイプの配列(この例のように)のいずれかです。
注:ここではトランジェントを使用しています。システムによってはこの特定のクエリがかなり重くなる可能性があるため、将来の使用に備えて格納するのが合理的です。
終了の回答として送信する
$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;
}
}