问题描述

我看到可以按用户拥有的帖子数排序用户查询,但是可以从结果中排除零个帖子的用户吗?在 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 动作

当我在 WP_User_Query 类中找到 pre_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 的非常好的参考

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。