WP_User_Query排除没有帖子的用户


9

我看到可以按每个用户的帖子数对用户查询进行排序,但是可以从结果中排除帖子为零的用户吗?在Wp_User_Query类中有一个pre_user_query操作,但是查询字符串是一个巨大的弱点,因此我不确定在这里要使用哪种过滤器操作。


仅仅从结果中丢弃post_count== 0的那些用户,是否会减少负担呢?
GhostToast

3
我只是准备解决这个完全是太简单的问题了。WordPress会使用get_posts_by_author_sqlget_authors()查询生成SQL 的功能自动执行此操作。用户必须具有已发布或私有帖子才能包含在结果中。#facepalm
helgatheviking 2012年

很高兴您找到了答案
GhostToast 2012年

我也是!尽管由于愚蠢而没有选择来结束问题。尽管感谢您的配合。我将聘请您的顾问,因为我想将get_authors()结果保存为瞬态...然后我可以跳过当前作者,而无需每次都进行查询。
helgatheviking 2012年

1
这个问题并不愚蠢,得到了好评,请提供您的解决方案作为答案,因为它可以帮助其他人。
Wyck

Answers:


10

好吧,我想出了两种解决方案。

解决方案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查询碰巧会将适当的表连接在一起。所以我要做的就是复制该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参数的想法来自WP_User_Class简介

这也是一个很好的参考 WP_User_Query


1
好可爱 现在,我们需要的是一种将分页页数调整为新的重做列表的方法...
Christine Cooper

好决定。不知道该怎么做。
helgatheviking

author-> id现在为author-> ID(变化不大,但ID已贬值)
存在的理由

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_posts可以是true / 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 2012年

get_users_with_role()是不是WordPress功能,或者我看电脑的时间太长了?
helgatheviking 2012年

1
它不存在。在966个文件中搜索"get_users_with_role": 0 matches across 0 files。也get_usernumposts已贬值,使用count_user_posts()
Wyck

啊!我很抱歉。这是我为会员网站编写的功能。您可以只使用get_users()并将所需的任何参数传递给它:codex.wordpress.org/Function_Reference/get_users
GhostToast 2012年

@GhostToast请更新您的答案。
kaiser 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.