获得Y个随机作者的ID/对象,发帖次数超过X

时间:2015-05-03 作者:Gixty

我想随机显示Y个作者的信息。这些作者必须发表至少X篇文章。

请记住,这将是一个拥有数千名用户的博客,其中大多数用户发布了0篇文章。

我研究了如下函数wp_list_authors()WP_User_Query() 但我似乎无法设定每个作者需要的最少帖子数量。

我试图让作者使用这些函数,然后通过循环测试每个作者id,看看他们是否发布了X个或更多的帖子。(我想避免这种情况,因为它看起来太乏味,而且性能可能太差。

我可以按降序排列,洗牌数组并显示用户信息,但我不希望这样,因为我更喜欢用较少的帖子来展示用户。

如果我按升序排列,我将获得数百或数千个用户,其中0篇帖子。然而,在这里我可以使用wp_list_authors() 如@s\\u ha\\u dum所示:Total number of authors with more than one post 这排除了拥有0篇帖子的作者,但如果我想获得拥有至少2篇或更多帖子的用户,该怎么办?

最后,我可以使用pre_user_query 过滤器如@helgatheviking在中所述:WP_User_Query to exclude users with no posts

这是最好的解决方案吗?性能如何?有更好的解决方案吗?如果是,你会建议我怎么做?

2 个回复
SO网友:Pieter Goosen

您可以删除上面的大部分代码。WP_User_Query 具有include 参数(Wordpress 3.9中引入)

include (数组)-要包括的用户列表。

所以我们需要随机获得一组作者ID。我已经修改了你的count_users_with_posts() 这里有点扩展它,使其更具动态性,并随机获得一定数量的作者。我还必须修复一些错误(一些SQL错误,特别是这一行:WHERE post_count > %s ORDER BY count DESC. 开发时应启用调试:-)

注意:这适用于我的本地安装,有4个用户

function get_author_posts_count( $min_posts = 1, $max_posts = 10, $limit = 10, $post_type = \'post\' )
{
    global $wpdb;

    $authors = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT post_author FROM (
                SELECT post_author, COUNT(*) AS count 
                FROM $wpdb->posts
                WHERE post_type = %s 
                AND post_status=\'publish\' 
                GROUP BY post_author
            ) AS stats
            WHERE stats.count BETWEEN %d AND %d
            ORDER BY RAND()
            LIMIT 0,%d",
            $post_type,
            $min_posts,
            $max_posts,
            $limit
        )
    );

    return $authors;
}
如您所见,我在这里包含了4个参数。

  • $min_posts -> 作者必须拥有的已发布帖子的最小数量。违约1

  • $max_posts -> 由于您希望获得文章数量较少的作者,因此我提供了一个最大文章数量。如果愿意,您可以删除它,只需记住相应地更改SQL,然后更改默认值10

  • $limit -> 要获取的帖子作者数量。违约10

  • $post_type -> 要使用的帖子类型。违约post

    然后,您可以在WP_User_query 如下所示

    $args = [
        \'include\' => get_author_posts_count( 5, 20, 5, \'my_post_type\' )
    ];
    
    $authors = new WP_User_Query( $args );
    
    编辑评论(感谢@birgire),有几个问题你应该注意

    通过以下结果之前get_author_posts_count()include 的参数WP_User_Query, 您应该检查是否有可用的值。如果结果get_author_posts_count() 为空或无效include 参数将被忽略,并返回所有用户。查询不会返回空的用户数组

    SQL查询的长度有限制,因此非常大的作者查询可能会崩溃。正如我已经说过的,我的测试站点非常小,所以我无法最大限度地测试我的代码。你也应该看看this post 关于SQL查询lentghs

如果您对有许多帖子和大量作者的大型网站的测试有任何反馈,我将不胜感激

SO网友:Gixty

这是我到目前为止所拥有的东西的草稿。请随时更新和改进。

首先,我们使用pre_user_action 选择用户获取并显示其信息所需的最少帖子数。它是从WP_User_Query to exclude users with no posts (作者:helgatheviking)。我只是做了一些小改动来满足我的需要。

add_action( \'pre_user_query\', \'users_with_posts\',10, 1 );

function users_with_posts( &$query) {
    global $wpdb;
    $min_posts = 5; 
    if ( isset( $query->query_vars[\'query_id\'] ) && \'wps_last_name\' == $query->query_vars[\'query_id\'] )
         $query->query_from = $query->query_from . " LEFT OUTER JOIN (
                      SELECT post_author, COUNT(*) as post_count
                      FROM $wpdb->posts
                      WHERE post_type = post AND post_status = publish
                      GROUP BY post_author
                    ) p ON ({$wpdb->users}.ID = p.post_author)
                    ";

        $query->query_where = $query->query_where . " AND post_count  > {$min_posts} ";  
}
然后,我们需要发布超过X个帖子的用户总数。

function count_users_with_posts($min_posts) {
        global $wpdb;
        $author_ids = $wpdb->get_col($wpdb->prepare("SELECT post_author FROM
            (SELECT post_author, COUNT(*) AS post_count FROM {$wpdb->posts}
                WHERE post_type = \'post\' AND post_status=\'publish\' GROUP BY post_author) AS stats
            WHERE post_count > %s ORDER BY count DESC;",$min_posts));
        return count($author_ids);
}
现在,我们准备好继续并使用WP_User_query() 函数获取“随机”用户。他们不是100%随机选择的,但这是我能得到的最接近的。

以下是我们函数的参数:

$args = array (
    \'query_id\' => \'users_with_posts\',
    \'orderby\' => \'post_count\',
    \'order\' => \'ASC\', //default
    \'number\' => $total_number,
    \'offset\' => $offset,

); 
你可以看到,我们缺少了两个变量,这就是我们要玩的地方。我们将生成一个随机偏移以获得“随机”效果。

$total_number = 12; //number of users we want to display
$total_authors = count_users_with_posts(5); //total number of users with more than 5 posts
$offset = mt_rand(0,$total_authors - $total_number); //randomly generated offset.

$users = new WP_User_Query( $args );
还有很多改进的空间,我希望有人从这里开始,或者如果有不同的更好的方法,欢迎您分享。

结束

相关推荐

Performance on WPMS

我的WPMS站点托管在8核/32mb RAM服务器上,但响应时间非常长。我们有大约1000个博客(单个db上有35000多个表)和70000个页面浏览量。我认为我可以缩短响应时间,将具有更多页面浏览量的博客移动到单独的DB中,并使用hyper DB插件将所有博客拆分为每个DB 100个博客。你觉得怎么样?