如何随机列出至少3篇已发表帖子的5位作者

时间:2013-09-27 作者:user10331

这里有点新手。。。

正如标题所述,我正在尝试生成一个5个随机用户的列表(来自作者、编辑和管理员),每个用户至少发布了3篇文章。(另外,我想排除用户ID为4的作者。)

我想我已经成功地做到了这一切(将之前在wordpress.stackexchange中有用的帖子中的各种解决方案整合在一起,非常感谢!)但我不确定这是不是最好的解决方案,或者它的编码是否正确。我在整个网站的许多页面上都使用了此功能,我担心这可能会导致数据库查询过于密集。

<?php
global $wpdb;
$min_posts = 3; 
$user_ids = $wpdb->get_col("
SELECT `post_author` 
FROM
  (SELECT `post_author`, 
    COUNT(*) AS `count` 
    FROM {$wpdb->posts}
    WHERE `post_status`=\'publish\'  
    GROUP BY `post_author`) 
AS `stats`
WHERE `count` >= {$min_posts} AND post_author !=4;");
shuffle($user_ids);

for($someNumber = 1; $someNumber <= 5; $someNumber++) {
$user = get_userdata($user_ids[$someNumber]); ?>

      <?php echo get_avatar( $user->ID, \'60\' );?>
      <h7><a href="<?php echo get_author_posts_url( $user->ID ); ?>">
        <?php echo $user->display_name ;?></a></h7>
      <hr>
<?php
}
unset($user_ids);
?>
非常感谢您的帮助!

3 个回复
最合适的回答,由SO网友:Pat J 整理而成

你可以使用count_many_users_posts().

$args = array(
    \'exclude\' => array( 4, ),
    \'fields\' => \'ID\',
);
$users = get_users( $args );
$user_posts = count_many_users_posts( $users );
foreach( $user_posts as $user => $posts ) {
    if( $posts < 3 ) {
        unset( $user_posts[$user] );
    }
}
$user_ids = array_keys( $user_posts );
shuffle( $user_ids );
for( $i = 0; $i <=4; $i++ ) {
    $user = get_userdata( $user_ids[$i] );
    // display your user info here
}
参考count_many_users_posts()
  • get_users()
  • array_keys()
  • SO网友:kaiser

    基本查询

    以下查询将为您提供网站中帖子最多的五个用户。使用HAVINGCOUNT 将比其他查询快得多。尤其是比内置的多用途WP查询更快。

    global $wpdb;
    
    $postCountSQL = <<<SQL
        SELECT post_author, COUNT( * ) AS count
            FROM {$wpdb->posts}
        GROUP BY post_author
        HAVING COUNT( * ) > 3
        ORDER BY count DESC 
        LIMIT 0 , 5
    SQL;
    
    $postCount = $wpdb->get_results( $postCountSQL );
    
    现在,您希望随机获得随机结果。实际上,使用MySQL函数很容易RAND():

    SELECT post_author, COUNT( * ) AS count
        FROM {$wpdb->posts}
    GROUP BY post_author
    HAVING COUNT( * ) > 3
    ORDER BY RAND() DESC
    LIMIT 0 , 5
    
    排除要按ID排除特定用户,我们可以使用NOT 声明:

    SELECT post_author, COUNT( * ) AS count
        FROM {$wpdb->posts}
    GROUP BY post_author
    HAVING COUNT( * ) > 3
        AND NOT post_author = {$id}
    ORDER BY RAND( ) DESC 
    LIMIT 0 , 5
    
    在一个小型mu插件中调用该插件(因此它在每个站点上都默认可用):

    <?php
    /**
     * Plugin Name: (#115930) Random User Post Count
     * Plugin URI:  http://wordpress.stackexchange.com/questions/115930/how-to-randomly-list-5-authors-with-at-least-3-published-posts
     * Description: Lists five random users and their posts count. Can exclude users by ID.
     * Author:      Franz Josef Kaiser <[email protected]>
     * Author URI:  http://unserkaiser.com
     */
    defined( \'ABSPATH\' ) OR exit;
    
    function wpse115930UserPostCountRand( $minCount = 3, $userIDs = array(), $limit = 5 )
    {
        ! is_array( $userIDs ) AND $userIDs = array( $userIDs );
    
        global $wpdb;
    
        $sql = <<<SQL
    SELECT post_author, COUNT( * ) AS count
        FROM {$wpdb->posts}
    GROUP BY post_author
    HAVING COUNT( * ) > %d %s
    ORDER BY RAND( ) DESC
    LIMIT 0 , %d
    SQL;
    
        $exclude = "";
        ! empty( $userIDs ) AND $exclude = $wpdb->prepare(
            " AND NOT post_author IN ( %s ) ",
            join( ",", $userIDs )
        );
    
        return $wpdb->get_results( $wpdb->prepare( $sql, $minCount, $exclude, $limit ) );
    }
    
    您现在只需拨打wpse115930UserPostCountRand( 3, array( 4 ), 5 ); 在模板中的任何位置获取至少有5篇帖子的用户,没有4 并将结果限制为3 用户。如您所见,第二个参数是一个数组,因此扩展结果以排除更多用户很容易。同样的情况也适用于不同数量的用户或最少的帖子。

    缓存结果

    如前所述,您可以使用Transients API。另一个甚至更好的选择是使用WP Object Cache 在上述插件中。如果涉及某种持久缓存,如操作码或MEMcache,它也会将其缓存到磁盘。

    玩得开心:)

    SO网友:Dave Navarro

    我在整个网站的许多页面上都使用了此功能,我担心这可能会导致数据库查询过于密集。

    在我所做的几乎所有事情上,如果我不需要“实时”数据,我会使用瞬态缓存XML、JSON和数据库调用。退房the Transient API.

    结束

    相关推荐