显然,您可以接受所有帖子,并使用PHP将结果随机化like shown in this answer. 或者,也可以使用SQL进行随机化。
在数据库中处理随机化:没有内置的WordPress函数(或参数)来实现这一点,但是,您可以使用posts_request
用于更改原始SQL查询集的筛选器WP_Query
仅从数据库中实现随机化。
您可以在活动主题的functions.php
文件或作为新的自定义插件:
<?php
/**
* Plugin Name: Randomize Posts
* Plugin URI: https://wordpress.stackexchange.com/a/260877/110572
* Description: Randomize posts basd on \'_randomize_posts_count\' query argument
* Author: Fayaz
* Version: 1.0
* Author URI: http://fmy.me/
*/
function wpse260713_randomize_posts( $sql_query, $query ) {
$rand = (int) $query->get( \'_randomize_posts_count\' );
if( $rand ) {
$found_rows = \'\';
if( stripos( $sql_query, \'SQL_CALC_FOUND_ROWS\' ) !== FALSE ) {
$found_rows = \'SQL_CALC_FOUND_ROWS\';
$sql_query = str_replace( \'SQL_CALC_FOUND_ROWS \', \'\', $sql_query );
}
$sql_query = sprintf( \'SELECT %s wp_posts.* from ( %s ) wp_posts ORDER BY rand() LIMIT %d\', $found_rows, $sql_query, $rand );
}
return $sql_query;
}
add_filter( \'posts_request\', \'wpse260713_randomize_posts\', 10, 2 );
然后,您可以使用以下查询:
$args = array(
\'post_type\' => \'post\',
\'posts_per_page\' => 10,
\'orderby\' => \'date\',
\'order\' => \'DESC\',
\'meta_key\' => \'_thumbnail_id\',
\'no_found_rows\' => \'true\',
\'_randomize_posts_count\' => 3
);
$query = new WP_Query( $args );
比较分析:这种方法只会带来
_randomize_posts_count
而不是在PHP端带来所有结果和随机化。因此,它可以更好地优化与数据库的数据通信。如果数据库服务器与web服务器分开,则效果更好。
If query cache is not enabled, 当显示的随机帖子数量与选择的帖子总数相差很大时,这个解决方案会更快。例如:如果您显示最近200篇文章中的3篇随机文章,那么这种方法会快得多。If query cache is enabled, 然后Birgire\'s method 将更快,因为这样可以避免以后的SQL请求。然而,对于较大的样本量,它可能仍然较慢,因为您必须在查询缓存中存储大量信息。如果您仔细考虑样本大小并选择更适合您的用例的解决方案,则是最好的选择。
Note: 与常规代码相比,随机方法的速度非常慢(而且通常不可伸缩),因此无论您选择什么方法,当您的随机样本量相当大(如数千)时,都要格外小心。