基于大型数据库的随机作者显示效率

时间:2013-10-21 作者:Giraldi

我正在尝试显示5位作者的列表randomly. 以下是我找到的一些解决方案:

https://stackoverflow.com/questions/5502609/get-authors-randomlyhttps://wordpress.stackexchange.com/a/91326/1044

除了我使用的WP_User_Query 像这样:

$args  = array(
    \'role\' => \'subscriber\'
);
$wp_user_query = new WP_User_Query($args);
$authors = $wp_user_query->get_results();

// Shuffle list to get random results
shuffle($authors);
然而,据我的业余理解will fetch the whole list of users. 所以我想知道我是否有2000-5000 users (or more), 这会影响page load 彻底地?如何提高效率?

UPDATE:

也会array_rand() 是一种比shuffle()?

2 个回复
最合适的回答,由SO网友:helgatheviking 整理而成

如果您担心效率,您可能希望使用Transients API 存储查询。存储要随机化的内容似乎违反直觉,但如果存储整个查询,则始终可以随机化和操纵生成的数组以获得所需的结果。

下面是如何获取所有订阅者并将其存储在一个瞬态中,最后使用一个简单的PHP来洗牌/随机化结果,然后使用array_slice()

if ( false === ( $users = get_transient( \'get_all_subscribers\' ) ) ) {
     // this code runs when there is no valid transient set

    $args  = array(
        \'role\'   => \'subscriber\'
    );

    $wp_user_query = new WP_User_Query( $args );

    $users = $wp_user_query->get_results();

    set_transient( \'get_all_subscribers\', $users );
}

// proceed with data normally
// randomize the stored result
shuffle( $users );
$rand_users = array_slice( $users, 0, 5 );

var_dump( $rand_users );
然后,为了确保瞬态是最新的,我们将在更新或添加用户时将其删除:

// Create a simple function to delete our transient
function delete_all_subscribers_transient() {
     delete_transient( \'get_all_subscribers\' );
}
// Add the function to the profile_update and user_registration hooks
add_action( \'profile_update\', \'delete_all_subscribers_transient\' );
add_action( \'user_register\', \'delete_all_subscribers_transient\' );

SO网友:birgire

如果您只需要5.

如果要使用WP_User_Query() 要随机获取5个用户,可以尝试使用pre_user_query 钩住以覆盖orderby部分:

$args  = array(
    \'role\'   => \'subscriber\',
    \'number\' => 5,
);
add_action( \'pre_user_query\', \'my_pre_user_query\' );
$wp_user_query = new WP_User_Query( $args );
在哪里

function my_pre_user_query( $q ){
    $q->query_orderby = \' ORDER BY RAND() \';

    // remove the hook
    remove_action( current_filter(), __FUNCTION__ );
}
更新:此article 包含使用特殊WHERE 条件,在ORDER BY RAND() 开始。。。据我所知。

这个WHERE 你的情况可能是

WHERE RAND()<(SELECT ((5/COUNT(*))*10) FROM wp_users)
因此,如果您有大量用户,则可以尝试此修改后的操作回调:

function my_pre_user_query( $q ){
    $q->query_where = str_replace( \'WHERE 1=1\', \'WHERE RAND()<(SELECT ((5/COUNT(*))*10) FROM wp_users) \', $q->query_where );
    $q->query_orderby = \' ORDER BY RAND() \';

    // remove hook
    remove_action( current_filter() , __FUNCTION__ );
}
如果上述文章中的技巧奏效了!

以下是修改后回调的更通用版本:

function my_pre_user_query( $q ){

    $limit = preg_replace( \'/[^\\d]/\', \'\', $q->query_limit );

    $from   = \'WHERE 1=1\';
    $to     = sprintf( \'WHERE RAND()<(SELECT ((%d/COUNT(*))*10) FROM %susers)\', 
                        $limit, 
                        $GLOBALS[\'wpdb\']->prefix 
             );

    $q->query_where   = str_replace( $from, $to, $q->query_where );
    $q->query_orderby = \' ORDER BY RAND() \';

    // remove the hook    
    remove_action( current_filter() , __FUNCTION__ );
}

结束

相关推荐

Randomize Users

我正在尝试随机显示我的用户,我想知道是否可以编辑此页面上的答案以满足我的需要(多个用户而不是单个用户):Sidebar random author spotlight这是我的代码(我可以轻松切换到WP_user_query 如果需要)<?php $args = array( \'fields\' => \'all_with_meta\', \'exclude\' => array(1), );