【问题标题】:Pagination not working with Loop分页不适用于循环
【发布时间】:2014-09-10 19:40:03
【问题描述】:

第 2 页显示与第 1 页相同的帖子。可能是什么问题? 下面是来自 index.php 的代码 它用于通过简单地点击一个链接来对帖子进行排序,例如排序方式:“价格”或“随机”。

分页

<?php
    previous_posts_link();
    next_posts_link();
?>

循环

<?php

$sort= $_GET['sort'];

if($sort == "A")
    {
    $order= "orderby=rand&posts_per_page =2";
    }

if($sort == "B")
    {
    $order= array (
        'meta_key'=>'price', 
        'orderby'=>'meta_value_num',  
        'order'=>'DESC', 
        'posts_per_page' => 2
    );
    }
?>


<a href="?sort=A">random</a>
<a href="?sort=B">price</a>


<?php $loop = new WP_Query($order); ?><?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
    <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
    <?php    the_excerpt(); the_meta ();?>
<?php endwhile; wp_reset_query();?>

【问题讨论】:

    标签: sorting loops pagination wordpress


    【解决方案1】:

    您的问题是使用自定义查询。你为什么不使用主查询。在这里运行另一个查询是完全没有必要和浪费资源的。

    由于此代码在 index.php 上,这将是您的主页,您可以简单地使用默认循环,并在运行之前使用 pre_get_posts 更改您的主查询。这样做不需要额外的不必要的数据库查询,而且更干净

    因此,删除 index.php 中的自定义查询,并将其替换为以下代码。这就是你所需要的(不要滥用 php 标签:-))

    <?php while (have_posts() ) : the_post(); ?>
        <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
        <?php  the_excerpt(); the_meta ();
    endwhile; 
    
      previous_posts_link();
      next_posts_link();
    ?>
    

    现在,在functions.php中,添加以下内容

    function my_custom_query($query){
     if ( $query->is_home() && $query->is_main_query() ) {
    
       $sort= $_GET['sort'];
    
       if($sort == "A"){
         $query->set( 'orderby', 'rand' );
         $query->set( 'posts_per_page', '2' );
       }
    
       if($sort == "B"){
         $query->set( 'meta_key', 'price' );
         $query->set( 'orderby', 'meta_value_num' );
         $query->set( 'order', 'DESC' );
         $query->set( 'posts_per_page', '2' );
        }
     }
    }
    
    add_action( 'pre_get_posts', 'my_custom_query' );
    

    如果您出于某种原因需要运行自定义查询,请记住将分页变量添加到您的参数中。您可以在WP_Query中查看这些参数

    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $loop = new WP_Query( array( 'paged' => $paged ) );
    

    但这还不够。您还需要在next_posts_link( $label , $max_pages ); 中设置$max_pages 参数,以便分页正常工作。你需要这样的东西

    next_posts_link( 'Older Entries', $loop->max_num_pages );
    

    【讨论】:

    • 彼得!我很高兴看到你的解决方案,事实上,我身后有一个合唱团在唱哈利路亚。哈。我很欣赏代码和详尽/详细的评论,这正是我想要向我解释的方式!因为有时阅读 Codex 就像阅读法律文件一样。您有可以与您保持联系的网站或电子邮件吗?好老师难找。只有一件事,你的代码给了我死机白屏。经过反复试验,我找到了解决方案。它是否正确?我使用了 'function my_custom_query($query){' 而不是 'function my_custom_query(){'
    • 很高兴能帮上忙。是的,对此感到抱歉,现在将修复。我发帖的时候有点着急:-)。
    • 已修复,感谢您指出错误。为您点赞以表示感谢。享受
    • 谢谢彼得。您可以通过下面列出的评论给我发电子邮件吗?真舍不得和你失去联系。不会垃圾邮件或打扰您。只是打个招呼,让您作为紧急联系人
    • 很遗憾,我没有透露我的个人详细信息。随时在此处或在 WPSE 上发布您的问题。我随时准备回答一个好问题:-)
    【解决方案2】:

    如果您想使用自定义 WP_Query 并且仍然希望分页工作,则必须传入 paged 参数。

    // what page is this? default to 1.
    $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
    
    // "A" args
    $order = "orderby=rand&posts_per_page=2&paged={$paged}";
    
    // "B" args
    $order = array (
        'meta_key'=>'price', 
        'orderby'=>'meta_value_num',  
        'order'=>'DESC', 
        'posts_per_page' => 2,
        'paged' => $paged,
    );
    

    【讨论】:

    • 您还需要在next_posts_link 中设置$max_pages 参数才能使分页正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2017-10-21
    • 2014-01-29
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多