随机加载带有最新帖子的类别

时间:2015-11-16 作者:Interactive

我正在创建一个加载5个不同类别的滑块。类别将随机加载到页面中。因此,我知道类别的id,它们随机加载到页面中。

我现在要做的是加载与该类别对应的最新帖子。

以下是我目前掌握的情况:

<?php 
    $numbers = Array(\'5\',\'6\',\'7\'); //id\'s of the categories
    shuffle($numbers);
    query_posts(\'cat=5&posts_per_page=1\'); 
    while (have_posts()) : the_post();                  
    foreach ($numbers as $number) {                         
        echo \'<div class="carousel_items">
        <img src="\'.get_bloginfo(\'template_directory\').\'/images/\'.$number.\'.svg" /><br />
            \'.get_the_excerpt().\'
        </div>\';
    }
    endwhile; 
?>
因此,这将加载分类5中的最新帖子。每一步都在重复。这就是问题所在。我做不到query_posts 在foreach循环中,因为这会创建一个无止境的循环。

有没有办法解决这个问题?

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

从不使用query_posts, 它打破了许多内置函数、自定义函数和插件所依赖的主要查询对象,从而产生了无数问题。这是纯粹的邪恶,你也应该避免它。

对于custom queries, 使用WP_Queryget_posts, 如果只需要更改当前主查询(,单页、静态首页和真实页除外),请使用pre_get_posts.

您的查询完全错误,并且您没有对随机类别号进行任何操作。让我们看看你的代码,重写;(NOTE: 需要PHP 5.4+)

$numbers       = [\'5\',\'6\',\'7\']; //id\'s of the categories
// Get a random key from the array
$rand_key      = array_rand( $numbers );
// Get a random category ID from the array
$random_cat_ID = $numbers[$rand_key];

// Now build our query args
$args = [
    \'cat\'            => $random_cat_ID,
    \'posts_per_page\' => 1
];
$q = new WP_Query( $args );
// Run the loop
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
    $q->the_post();

        // Display what you need from the loop like title, content etc

    }
    wp_reset_postdata();
}
如果需要无序排列中的类别ID数组,请编辑$numbers 然后从每个类别中获取最新帖子,我们需要一种不同的方法。您需要意识到,您需要为每个类别运行一个查询。对于这一点,您真的无能为力,因为您将使用随机排序。

让我们看看代码:

$numbers       = [\'5\',\'6\',\'7\']; //id\'s of the categories
// Shuffle the array
$rand_key      = shuffle( $numbers );

// Run a foreach loop to get the newest post from the categories
foreach ( $numbers as $cat_id ) {
    $args = [
        \'posts_per_page\' => 1,
        \'cat\'            => $cat_id,
        \'no_found_rows\'  => true // Legally skips pagination
        // Add any extra arguments
    ];
    $q = new WP_Query( $args );

    // Run the loop
    if ( $q->have_posts() ) {
        while ( $q->have_posts() ) {
        $q->the_post();

            // Display what you need from the loop like title, content etc

        }
        wp_reset_postdata();
    }
}