如何为多个循环创建单独的分页?

时间:2012-12-06 17:01:00

标签: php wordpress

我创建了两个带分页的循环(第一个循环循环通过 CAT'S 类别,第二个循环通过 DOG'S 类别),但现在我被卡住了:(

问题:点击我网站上的“下一个条目”( CAT'S 类别)后,它将进入该类别的第二个条目但它也进入我的 DOG'S 类别第二个条目(我不想要那个!! )。反之亦然......

我喜欢做的是:点击我的 CAT'S 类别中的“下一个条目”,它 THAT类别中的下一个帖子( CAT'S)到我的 DOG'S 类别中的第二篇帖子,或者换句话说:我点击 DOG'S上的“下一个条目”类别,它 THAT类别(DOG'S)中的下一篇文章,但 NOT CAT'S中的第二篇帖子类别。

有人可以帮帮我吗?我已经请求了帮助 wordpress.stackexchange.com前一段时间但我没有得到任何答案,所以我在这里提问。

索引php看起来像这样:

<?php get_header(); ?>
<?php get_sidebar(); ?>
<div id="blog">         
    <?php         
    $args = array(
    'category_name' => 'cats' 
    );
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $the_query = new WP_query($args . '&paged=' . $paged . '&cat=-3');      
    while( $the_query -> have_posts()) : $the_query -> the_post();              
    ?>

    <div class="post">
    <div class="post_title">
    <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    </div>
        <div class="entry"> 
            <?php the_post_thumbnail(); ?>
            <?php the_content('Read on...'); ?>

            <p class="postmetadata">
            <?php _e('Filed under&#58;'); ?> <?php the_category(', ') ?> <?php _e('by'); ?> <?php  the_author(); ?><br />
            <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?> <?php edit_post_link('Edit', ' &#124; ', ''); ?>
            </p>
        </div>
    </div>

    <?php endwhile;?>
    <?php wp_reset_postdata();?>
    <div class="navigation">
    <div style="float:left;" class="alignleft"><?php previous_posts_link('&laquo; Previous Entries') ?></div>
    <div style="float:right;" class="alignright"><?php next_posts_link('Next Entries &raquo;',$the_query->max_num_pages) ?></div>
    </div>      
    </div>

    <div id="blogs">    
    <?php       
    $args = array(
    'category_name' => 'dogs' 
    );
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $the_query = new WP_query($args . '&paged=' . $paged . '&cat=-10');
    while( $the_query -> have_posts()) : $the_query -> the_post();              
    ?>

    <div class="post">
    <div class="post_title">
    <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    </div>
        <div class="entry"> 
            <?php the_post_thumbnail(); ?>
            <?php the_content('Read on...'); ?>

            <p class="postmetadata">
            <?php _e('Filed under&#58;'); ?> <?php the_category(', ') ?> <?php _e('by'); ?> <?php  the_author(); ?><br />
            <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?> <?php edit_post_link('Edit', ' &#124; ', ''); ?>
            </p>

        </div>
    </div>

    <?php endwhile;?>
    <?php wp_reset_postdata();?>
    <div class="navigation">
    <div style="float:left;" class="alignleft"><?php previous_posts_link('&laquo; Previous Entries') ?></div>
    <div style="float:right;" class="alignright"><?php next_posts_link('Next Entries &raquo;',$the_query->max_num_pages) ?></div>
    </div>
    </div>
   <?php get_footer(); ?>

4 个答案:

答案 0 :(得分:2)

你需要2个不同的分页值,所以添加一些新的分页值并重写寻找它们的规则(它们实际上只是为了使网址看起来更整洁)。重写规则和分页链接格式意味着您可以翻阅一个类别,而另一个类别页面不会更改。

functions.php

function add_new_rules()
{
  // new 'paged' variables
  global $wp;
  $wp->add_query_var('paged_cats');
  $wp->add_query_var('paged_dogs');

  // rewrite rules
  add_rewrite_rule('page/cats/(\d+)/dogs/(\d+)', 'index.php?paged_cats=$matches[1]&paged_dogs=$matches[2]', 'top');
  add_rewrite_rule('page/cats/(\d+)/dogs/?$', 'index.php?paged_cats=$matches[1]&paged_dogs=1', 'top');

  if( !array_key_exists('page/cats/(\d+)/dogs/(\d+)', (array)get_option('rewrite_rules')) )
  {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
  }
}
add_filter('init', 'add_new_rules');

检查index.php中的新查询变量,并将其用于每个WP_Query和相关的分页链接。

<div id="blog">
  <?php
  $paged_cats = (get_query_var('paged_cats')) ? get_query_var('paged_cats') : 1;
  $paged_dogs = (get_query_var('paged_dogs')) ? get_query_var('paged_dogs') : 1;

  $cats = new WP_query(array(
    'category_name' => 'cats',
    'paged' => $paged_cats,
    'posts_per_page' => 1
  ));
  while( $cats->have_posts() ) : $cats->the_post();
    ?>
    <div class="post">
      <div class="post_title">
        <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
      </div>
      <div class="entry">
        <?php the_post_thumbnail(); ?>
        <?php the_content('Read on...'); ?>
        <p class="postmetadata">
          <?php _e('Filed under&#58;'); ?> <?php the_category(', ') ?> <?php _e('by'); ?> <?php the_author(); ?><br />
          <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?> <?php edit_post_link('Edit', ' &#124; ', ''); ?>
        </p>
      </div>
    </div>
  <?php endwhile; ?>
  <?php wp_reset_postdata(); ?>
  <?php if ( $cats->max_num_pages > 1 ) : ?>
  <div class="navigation">
    <?php
    echo paginate_links(array(
      'base' => home_url("page/cats/%#%/dogs/{$paged_dogs}"),
      'format' => '%#%',
      'current' => $paged_cats,
      'total' => $cats->max_num_pages,
    ));
    ?>
  </div>
  <?php endif; ?>
</div>

  <hr>

<div id="blogs">
  <?php
  $dogs = new WP_query(array(
    'category_name' => 'dogs',
    'paged' => $paged_dogs,
    'posts_per_page' => 1
  ));
  while( $dogs->have_posts() ) : $dogs->the_post();
    ?>
    <div class="post">
      <div class="post_title">
        <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
      </div>
      <div class="entry">
        <?php the_post_thumbnail(); ?>
        <?php the_content('Read on...'); ?>
        <p class="postmetadata">
          <?php _e('Filed under&#58;'); ?> <?php the_category(', ') ?> <?php _e('by'); ?> <?php  the_author(); ?><br />
          <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?> <?php edit_post_link('Edit', ' &#124; ', ''); ?>
        </p>
      </div>
    </div>
  <?php endwhile;?>
  <?php wp_reset_postdata();?>
  <?php if ( $dogs->max_num_pages > 1 ) : ?>
  <div class="navigation">
    <?php
    echo paginate_links(array(
      'base' => home_url("page/cats/{$paged_cats}/dogs/%_%"),
      'format' => '%#%',
      'current' => $paged_dogs,
      'total' => $dogs->max_num_pages,
    ));
    ?>
  </div>
  <?php endif; ?>
</div>

答案 1 :(得分:1)

我在这里找到答案https://wordpress.stackexchange.com/questions/47259/multiple-wp-query-loops-with-pagination,选择答案正在与我合作。它使用格式。

<!-- Cats -->
<div class="animals">
    <?php
        $paged1 = isset( $_GET['paged1'] ) ? (int) $_GET['paged1'] : 1;
        $paged2 = isset( $_GET['paged2'] ) ? (int) $_GET['paged2'] : 1;

        // Custom Loop with Pagination 1
        // http://codex.wordpress.org/Class_Reference/WP_Query#Usage
        $args1 = array(
            'paged'          => $paged1,
            'posts_per_page' => 2,
        );
        $query1 = new WP_Query( $args1 );

        while ( $query1->have_posts() ) : $query1->the_post();
            the_title();
            echo '<br>';
            the_category(' ');
            the_excerpt();
            echo '<hr>';
        endwhile;

        // http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
        $pag_args1 = array(
            'format'  => '?paged1=%#%',
            'current' => $paged1,
            'total'   => $query1->max_num_pages,
            'add_args' => array( 'paged2' => $paged2 )
        );
        echo paginate_links( $pag_args1 );
    ?>
</div>

<!-- Dogs -->
<div class="animals">
    <?php
        // Custom Loop with Pagination 2
        $args2 = array(
            'paged'          => $paged2,
            'posts_per_page' => 2,
        );
        $query2 = new WP_Query( $args2 );

        while ( $query2->have_posts() ) : $query2->the_post();
            the_title();
            echo '<br>';
            the_category(' ');
            the_excerpt();
            echo '<hr>';
        endwhile;

        $pag_args2 = array(
            'format'  => '?paged2=%#%',
            'current' => $paged2,
            'total'   => $query2->max_num_pages,
            'add_args' => array( 'paged1' => $paged1 )
        );
        echo paginate_links( $pag_args2 );
    ?>
</div>

由于它正在生成一个非干净的URL,你可以为SEO目的添加一个rel =“nofollow”。 Here is the instruction how to do add rel="nofollow"

答案 2 :(得分:0)

函数next_post_link()previous_post_link()有一个名为'in_same_cat'的第三个参数 - 您需要将其设置为TRUE。 阅读codex页面(单击答案中的函数名称。

来自codex:

<?php next_post_link('%link', 'Next post in category', TRUE); ?>

他们甚至还有第四个参数'excluded_categories',你也可以用它来实现同样的目的,或者将它们结合起来以获得更复杂的结果。

答案 3 :(得分:0)

你的问题是这样的: 在分页时,wordpress会发送页面ID或计数以获取下一个列表,并且回发中的变量名称对于两个列表都是相同的。当它进入服务器时,两个列表都会通过查看发布变量来获取进入下一页的请求。

jho1086提到的解决方案是创建分页变量作为两个列表的自定义变量并分配它。然后,这将为每个列表发送一个不同的变量,您可以根据需要移动下一个或上一个。

您需要同时添加分页变量并将其添加到分页中。在jho1086的solutuin中看到$ args1和$ pag_args1都引用$ paged2来实现这一点。

  • 当您为猫选择第2页时,它应该将catpage = 2发送到服务器
  • 当您为文档选择第2页时,它应该将dogpage = 2发送到服务器

如果您可以为分页链接解决此问题并传递参数,那么您可以执行以下操作

  • 当服务器获取猫的列表时,使用catpage作为分页参数
  • 当服务器获取狗列表时,使用dogpage作为分页参数

这在理论上肯定会奏效。您可以通过firebug测试进出请求的变量,然后回过头来解决其他问题,但是你的循环转到第2页点击其中的原因是两个循环都在相同的post变量上进行分页。