第1页有2个循环,其中包含Orderby Rand和Second Orderby Date

时间:2016-02-29 作者:Maciek Wrona

我试图实现的是在一个页面上设置两个循环。First one 获取11篇最新帖子,并按rand顺序进行排序。Second 显示按日期排序的其余帖子。

FIRST LOOP

$args = array(\'posts_per_page\' => 11,\'orderby\' => \'rand\' , \'order\' => \'ASC\');
$loop = new WP_Query($args);
$do_not_duplicate[] = $post->ID;

while ($loop-> have_posts()) : $loop->the_post();
$do_not_duplicate[] = $post->ID;

SECOND LOOP

$args2 = array(\'posts_per_page\' => 22, \'paged\' => $paged, \'post__not_in\' => $do_not_duplicate, \'orderby\' => \'date\', \'order\' => \'ASC\', \'max_num_pages\' => 5);
$loop2 = new WP_Query($args2);

while ($loop2-> have_posts()) : $loop2->the_post();
我的问题是,第二个循环应该在每次刷新后以相同的顺序显示相同的帖子,不幸的是,事实并非如此。有什么建议吗?

4 个回复
最合适的回答,由SO网友:Maciek Wrona 整理而成

根据@PieterGoosen的一些线索,我找到了有效的解决方案。

First loop

$argsR = array(
      \'numberposts\' => 11,
      \'fields\'         => \'ids\'
    );

$latest_posts =  get_posts( $argsR );
shuffle( $latest_posts );


$args = array(\'posts_per_page\' => 11,
              \'post__in\' => $latest_posts , 
              \'orderby\' => \'post__in\', 
              \'order\' => \'ASC\');

$loop = new WP_Query($args);
$do_not_duplicate[] = $post->ID;

while ($loop-> have_posts()) : $loop->the_post();
    $do_not_duplicate[] = $post->ID;
所以,第一个循环以随机顺序显示11篇最近的帖子,并将每个帖子ID推送到$do_not_duplicate[]我用来从第二个循环中排除最新帖子的数组。

Second loop

$args2 = array(
    \'posts_per_page\' =>-1, 
    \'post__not_in\' => $do_not_duplicate, 
    \'orderby\' => \'date\', 
    \'order\' => \'ASC\');

$loop2 = new WP_Query($args2);
$num_of_posts = $loop->post_count;
while ($loop2-> have_posts()) : $loop2->the_post();
有了两个独立的循环,我可以根据需要对第二个帖子列表分页。

SO网友:Lisa Anderson

是的,别忘了<?php wp_reset_postdata(); ?> 在循环之间。我记得第一次在一个页面上运行多个查询时,我被这个问题难住了。

SO网友:Pieter Goosen

随机获取帖子非常昂贵,应该在需要的地方避免。我认为我们可以用更好的方式来做到这一点。

允许一次查询所有帖子,不考虑按日期排序。我们将只查询ID,这应该非常快

将查询结果(post ID)存储在两个变量中

将一个ID数组随机排列,然后得到前11个ID

然后,我们将从第二个数组中删除这11个ID,并获得22个ID

合并两个数组并运行最终查询

让我们尝试以下代码

$args = [ // ADJUST THESE AS NEEDED
    \'posts_per_page\' => -1,
    \'order\'          => \'ASC\',
    \'fields\'         => \'ids\' // Only get post ID\'s, this also bypass object caches
];
$array_1 = $array_2 = get_posts( $args );
// Make sure we have posts and we have more than 11 posts
if (    $array_1
     && 11 < count( $array_1 )
) {  
    // Shuffle the first array
    shuffle( $array_1 );
    // Get the first 11 entries sorted randomly
    $array_1_random = array_slice( $array_1, 0, 11 ); 
    // Remove the entries from $array_1_random from $array_2
    $difference     = array_diff( $array_2, $array_1_random );
    // Get the first 22 entries from $difference
    $diff_22_IDs    = array_slice( $difference, 0, 22 ); 
    // Merge the two arrays, $array_1_random and $diff_22_IDs
    $ids = array_merge( $array_1_random, $diff_22_IDs );

    // Now that we have our ID\'s sorted to suite our needs, query the posts
    $last_args = [ // DO NOT ADJUST THESE, SHOULD BE FINE
        \'post__in\'       => $ids,
        \'orderby\'        => \'post__in\',
        \'order\'          => \'ASC\',
        \'posts_per_page\' => count( $ids )
    ];
    $q = new WP_Query( $last_args );

    // Output your loop
    while ( $q->have_posts() ) {
        $q->the_post();

        the_title();

    }
    wp_reset_postdata(); // VERY VERY IMPORTANT
}
一些注释根据需要调整代码。你应该改变一下$last_args 虽然

您说过您需要一页,因此无需设置paged 参数,因为我们将不分页。如果需要分页,则需要稍微调整我的代码

  • \'max_num_pages\' 不是有效参数

  • SO网友:fischi

    第二个查询并不总是显示相同的帖子,因为它依赖于第一个查询,这是随机的。

    例如,您得到了50篇帖子(ID 1到50,按日期排序)。

    首次运行:

    第一个查询取1,2,3,4,5,6,7,8,9,10,11并将这些ID传递给第二个查询,因此第二个查询将显示12,13,14,。。。

    第二次运行:

    第一个查询随机选择IDs 39、40、41、42、43、44、45、46、47、48、49、50,第二个查询将返回IDs 1-22。

    请务必致电wp_reset_postdata() 确保所有查询的行为正确。(谢谢@PieterGoosen:))

    相关推荐

    WordPress Custom Post Loop

    我正在尝试循环浏览自定义WordPress帖子,遇到了一个问题,比如我添加了自定义字段并想在中显示它<li> 使用循环。我成功地完成了操作,但数据/链接/类别正在重复,如果类别与以下内容相同,我希望只显示一次:如果我有2篇带有data1类别的帖子,那么链接将只显示data1once 但我有2个不同类别的帖子,然后它会分别显示每个帖子。Sample Code:<ul class="filter filter-top"> <li cla