【问题标题】:How to create separate pagination for mutiple loops?如何为多个循环创建单独的分页?
【发布时间】:2015-06-02 05:30:48
【问题描述】:

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

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

我喜欢这样做:我在我的 CAT'S 类别中单击“下一个条目”,它进入 该类别中的下一个帖子( CAT'S)NOT 到我的 DOG'S 类别中的第二个帖子,或者其他方式:我点击我的 DOG'S 上的“下一个条目” b> 类别,它THAT 类别(狗) 中的下一篇文章,但 到我的 CAT'S 中的第二篇文章 b> 类别。

有人可以帮我吗?我已经寻求帮助 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(); ?>

【问题讨论】:

  • 您的链接看起来像是从第 1 页转到第 2 页。没有什么可以说明点击了哪个链接。如果您能够在您的 url 中添加一些内容来说明点击了哪个链接,那么分页数据会更容易。
  • Php 不完全是我的“东西”,这就是我寻求帮助的原因......
  • 这就是为什么我没有发布答案,只是发表评论。我对 wordpress 不太了解,但是查看您发布的链接,每个链接都有相同的 url /page/2,它将发布每个项目的第 2 页。如果可以的话,在网址中添加一些内容,说明点击了哪个链接会有所帮助。

标签: php wordpress


【解决方案1】:

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

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>

【讨论】:

  • 感谢您的精彩回答!作为一个使用正则表达式和 add_rewrite_rule 的菜鸟,你能解释一下 (\d+) 的作用吗?谢谢!!你让我很开心:) – Dejo Dekic 1 小时前
  • @tkelly,很好的答案。但它只适用于 index.php 文件对吗?因为当我在我的主页模板文件中尝试它时它不起作用。因为这个代码add_rewrite_rule('page/cats/(\d+)/dogs/(\d+)', 'index.php?paged_cats=$matches[1]&amp;paged_dogs=$matches[2]', 'top');
  • 没错,您在问题中提到了 index.php,但您可以更改重写以使用任何其他页面。例如index.php?pagename=yourpage&amp;paged_cats=$matches[1]&amp;paged_dogs=$matches[2]。 \d+ 匹配一个数字 (0-9) 一次或多次
【解决方案2】:

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

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

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

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

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

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

这是理论上的,肯定会奏效。您可以通过 firebug 测试进出请求的变量并返回您遇到的其他问题,但是您的循环转到第 2 页以单击一个的原因是两个循环都在同一个 post 变量上分页。

【讨论】:

    【解决方案3】:

    我在这里找到答案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,您可以添加一个 rel="nofollow" 用于 SEO 目的。 Here is the instruction how to do add rel="nofollow"

    【讨论】:

      【解决方案4】:

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

      来自法典:

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

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

      【讨论】:

      • 感谢您的帮助,但它不起作用(如果我添加该代码,我的分页就会消失)我猜这是因为我正在通过新的 WP_query 类创建循环:(
      • 我没有告诉你添加这个代码.. 我告诉你在你需要的地方添加一个 TRUE 的 ARGUMENT ..
      • max_num_pages,TRUE); ?> 还是不行……该死的:(
      • 我认为这段代码滥用了参数,请阅读我链接的 codex 页面,还有 - 您是否尝试粘贴我直接给您的代码?它直接取自法典..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多