带有WP_QUERY和多个循环的分页/无限滚动

时间:2014-08-02 作者:João Luiz Felde

我需要我的网站主页有3列:-第一列有5个浏览量最多的帖子;-第二个是接下来5个浏览量最大的帖子;-第三个是最近发布的帖子。

我不希望帖子永远不会在同一列或另一列中重复,因此我使用wp\\u query以我想要的数量获取我想要的帖子。下面是我加载第二页时发生的情况,使用简单分页或无限滚动:

第一个循环加载5-10个查看次数最多的帖子,这些帖子已经显示在第二个循环的第一次运行中当我仍在加载下一页时,循环会加载相应的帖子,直到我在第三个循环中获得任何帖子,然后在第二个循环中没有帖子,并将所有帖子加载到第一个循环中。

下面是我使用的代码:

<div id="content">

<div class="recentColumn">
<div class="columnContent">

<?

$hotArgs =  array(
    \'post__not_in\' => $loaded,
    \'meta_key\' => \'wpb_post_views_count\', // Pega o número de visitas do post.
    \'orderby\' => \'meta_value_num\', // Ordena do mais visitado para o menos visitado.
    \'posts_per_page\' => \'2\',
    \'paged\' => $paged
    );
$hot = new WP_Query( $hotArgs );


if ($hot->have_posts()) : while ($hot->have_posts()) : $hot->the_post();
$loaded[] = $post->ID;
?>

<div class="articleContent">
<article class="recent" role="article">

    <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?>

    <header>
    <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
    <?php the_excerpt(); ?>
    </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div>




<div class="popularColumn">
<div class="columnContent">

<?
$nextArgs =  array(
    \'post__not_in\' => $loaded,
    \'meta_key\' => \'wpb_post_views_count\', // Pega o número de visitas do post.
    \'orderby\' => \'meta_value_num\', // Ordena do mais visitado para o menos visitado.
    \'posts_per_page\' => \'3\',
    \'paged\' => $paged
    );
 $next = new WP_Query( $nextArgs );

if ($next->have_posts()) : while ($next->have_posts()) : $next->the_post();
$loaded[] = $post->ID; 
?>

<div class="articleContent">
<article class="popular" role="article">
        <a href="<?php the_permalink();?>" title="<?php the_title();?>"><?php the_category();?>

        <header>
        <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
        </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div> 



<div class="randomColumn">
<div class="columnContent">

<?  
$recentsArgs =  array(
    \'post__not_in\' => $loaded,
    \'posts_per_page\' => \'3\',
    \'paged\' => $paged
    );
 $recents = new WP_Query( $recentsArgs );

if ($recents->have_posts()) : while ($recents->have_posts()) : $recents->the_post();
$loaded[] = $post->ID;
?>


<div class="articleContent">
<article class="random" role="article">
        <header>
        <h1><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h1>
        </header>

</article>
</div>

<?php endwhile; endif; ?>

</div>
</div>

我认为解决方案可以使用一个php会话或变量来存储已加载帖子的id,并在循环中检查帖子是否已加载,然后再继续。我试着做这个,但没有成功。我在php方面的技能太少了,也许有人会对如何使其工作有更好的想法。

我感谢你的帮助。谢谢

2 个回复
SO网友:Pieter Goosen

这可能无法解决您的问题,但它将在将来帮助您创建自定义查询。分页多个查询可能会非常棘手。默认情况下,Wordpress中的内置分页没有这种逻辑来分页多个查询。您必须运行多个查询并以某种方式将它们合并。

好,现在我想指出的是。你应该看看WP_Query in the codex 查看如何正确创建自定义查询。这里的问题是,您正在运行三个自定义查询,而没有重置其中任何一个。这将中断前一个查询之后的任何其他查询

重置您创建的每个自定义查询非常重要。你HAVE TO 这样做吧。你只要打电话就可以做到wp_reset_postdata(); 在每次查询后恢复$post 变量查看所提供链接中的示例

SO网友:bonger

您可以重新创建$loaded 数据库中的数组:

$hot_ppp = 3;
$next_ppp = 3;
$recents_ppp = 3;

if ( $paged > 1 ) {
    $prev_hot_next_loaded = $wpdb->get_col( $wpdb->prepare(
        \'SELECT ID FROM \' . $wpdb->posts . \' p JOIN \' . $wpdb->postmeta . \' pm ON pm.post_id = p.ID AND pm.meta_key = %s\'
        . \' WHERE p.post_type = %s AND p.post_status = %s ORDER BY pm.meta_value+0 DESC LIMIT %d\',
        \'wpb_post_views_count\', \'post\', \'publish\', ( $hot_ppp + $next_ppp ) * ( $paged - 1 )
    ) );
    $prev_recents_loaded = $wpdb->get_col( $wpdb->prepare(
        \'SELECT ID FROM \' . $wpdb->posts . \' WHERE ID NOT IN (\' . implode(\',\', $prev_hot_next_loaded ) . \')\'
        . \' AND post_type = %s AND post_status = %s ORDER BY post_date DESC LIMIT %d\',
        \'post\', \'publish\', $recents_ppp * ( $paged - 1 )
    ) );

    $loaded = $prev_hot_next_loaded + $prev_recents_loaded;
}

结束

相关推荐

How to finish this loop?

我已经问过一个问题,如何只获取属于某个分类法的父页面的子页面。一位非常有帮助的用户给了我这个答案,然而,我没有得到代码来完成循环的任何一方,这样我就可以得到:标题、特色图片和摘录。我得到的代码是:$child_ids = $wpdb->get_col( \"SELECT ID FROM $wpdb->posts WHERE post_parent = $post->ID AND post_type = \'page\' ORDER BY menu_order\"