Display random categories

时间:2017-03-24 作者:jrcollins

我正在使用get_categories 模板标记,用于在侧栏小部件中显示类别列表。我希望小部件在每个页面加载上显示完全随机选择的类别。我意识到我可以使用orderby=>rand 参数,但我的理解是,这只会重新排列获取的类别的顺序。

例如,如果我有100个类别,并且想要显示5个类别,那么我可以使用number 参数设置为number=>5orderbyorderby=>rand 但这将每次获取相同的5个类别,并且只重新排列这些类别的顺序。这就是它的工作原理吗?

我找到了以下代码段:

$cats =\'\';
$categories=get_categories();
$rand_keys = array_rand($categories, 5); // 5 is the number of categories you want
foreach ($rand_keys as $key) {
    $cats .= $categories[$key]->term_id .\',\';
}
有必要使用这样的方法来获得完全随机的帖子吗?

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

悲哀地get_categories() and get_terms() won\'t likely ever support \'orderby\' => \'rand\' 这确实给你留下了两个选择-获取每个类别并随机选择5个,或者构建自己的类别WP_Query 查询类别的步骤\'orderby\' => \'rand\'. 前者更容易实现,并且可能有更好的性能(除非您有非常多的类别)。

因此,出于您的目的,以下内容就足够了:

$categories = get_categories();
shuffle( $categories );
$categories = array_slice( $categories, 0, 5 );
之后$categories 将包含5个随机选择的类别。

从技术上讲rand_keys() 接近速度稍快。但在实践中,这种差异可以忽略不计(我们说的是纳秒),除非你在处理成千上万的类别。

值得注意的是,如果您的WordPress安装不包含至少5个类别,那么上面的代码将抛出一个错误(就像您问题中的代码片段一样),因为您无法获取一个数组的前5个元素,而这个数组的长度只有3个元素。

您可以对其进行改进,将其放入函数中以使其可重用且更灵活,并添加一些检查以帮助避免潜在错误:

function get_random_categories( $number, $args = null ) {
  $categories = get_categories( $args ); // Get all the categories, optionally with additional arguments

  // If there aren\'t enough categories, use as many as possible to avoid an error
  if( $number > count( $categories ) )
    $number = count( $categories );

  // If no categories are available or none were requested, return an empty array
  if( $number === 0 )
    return array();

  shuffle( $categories ); // Mix up the category array randomly

  // Return the first $number categories from the shuffled list
  return array_slice( $categories, 0, $number );
}
加载该函数后,您只需调用$categories = get_random_categories( 5 ); 要获得包含5个随机类别的数组,如果安装的类别总数少于5个,则只需按随机顺序返回尽可能多的可用类别。

获取随机帖子要容易得多,因为您只需使用\'orderby\' => \'rand\' 参数,如您所述-当省略分类法和类别参数时,默认情况下查询将返回所有类别的帖子。