对定制查询进行分页404

时间:2014-06-09 作者:jphogan

基本问题是,我博客的每个分页页面都将变成404页/第/2页、第/3页等。它过去工作得很好,但现在不行了。我想也许是3.9的改变做到了。

下面是我为解决这个问题而尝试的许多方法中的一些。所有这些的最终结果都是一样的。分页链接404\'d。

停用所有插件多次删除并重置永久链接,而不是将永久链接作为默认值,以确保我的阅读设置>博客页面显示最多设置为与我的循环相同的数字。(以及越来越少的测试)

  • 我尝试了两个独立的导航插件和默认的wordpress分页(旧帖子),每次都是404。尝试使用parse\\u query
  • 尝试分页\\u链接
    • 这是我的代码(或指向我的代码的链接):

      家php

          <?php require dirname( __FILE__ ) . \'/blog-page.php\';
      
      博客页面。php

      <?php
      /*
      Template Name: Blog Page - Custom
      */
      
      get_header(); ?>
      
      <---CUSTOM CODE--->
      
      <?php
      $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
         $args = array(
             \'posts_per_page\' => 5,
             \'post_type\' => \'post\',
             \'paged\' => $paged
         );
      
      $wp_query = new WP_Query($args);
      
      if($wp_query->have_posts()) : 
      
         while($wp_query->have_posts()) : $wp_query->the_post(); ?>
      
      <---CUSTOM CODE--->
      
      
         endwhile;
      
      wp_reset_postdata();?>
      
      <div class="nav-previous alignleft"><?php next_posts_link( \'Older posts\' ); ?></div>
      <div class="nav-next alignright"><?php previous_posts_link( \'Newer posts\' ); ?></div>
      <?php  endif; wp_reset_query();
      
      如果有用的话,这里有一个test site 我已经设置好了有问题的页面。我没有使用默认的wordpress分页。

      我已经没有东西可以尝试了。如有任何建议,将不胜感激。

    2 个回复
    最合适的回答,由SO网友:Pieter Goosen 整理而成

    这里有几件事我不明白,但我会尽力回答。

    你有一个家。php,我假设它是您的默认主页。这里有一行代码,那就是调用另一个页面模板。这是您的代码

      <?php require dirname( __FILE__ ) . \'/blog-page.php\'; 
    
    在博客页面中。php您拥有完整的页面模板。我的问题是,你为什么要这样做。为什么不直接添加博客页面的内容呢。php进入主页。php?会更有意义。

    您不是使用主查询来运行循环,而是一个自定义查询,我也不理解,因为您的自定义查询与主查询完全相同,除了每页的帖子。只需使用pre_get_posts 在主页上设置自定义帖子数。

    function posts_on_homepage( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $query->set( \'posts_per_page\', \'5\' );
        }
    }
    add_action( \'pre_get_posts\', \'posts_on_homepage\' );
    
    您可以将其添加到函数中。php,它将您在主页上的帖子数量设置为5,然后您可以用普通循环替换自定义查询。

    这里需要记住的一点是,无论何时运行自定义查询,分页都将失败,正如注释中所述。

    你需要看看WP_Qeury\'s分页参数。

    paged (int) - 页码。显示在使用“";“旧条目”;链接

    page (int) - 静态首页的页数。显示通常只显示在静态首页的第X页上的帖子。

    因此,对于普通页面,您的查询应该如下所示

    $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
    $query = new WP_Query( array( \'paged\' => $paged ) );
    
    静态页面也是这样

    $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
    $query = new WP_Query( array( \'paged\' => $paged ) );
    
    您还将重置postdata两次。你应该只做一次。顺便提一下wp_reset_query(); 是错误的,它只用于query_posts 不应使用该选项。您应该使用wp_reset_postdata();

    最后,使用自定义查询时,必须指定next_posts_link 通过使用$max_pages 参数,否则将失败。

     next_posts_link( \'Older Entries\', $the_query->max_num_pages );
    
    下面是一个正确工作的自定义查询示例,来自codex

    <?php
    // set the "paged" parameter (use \'page\' if the query is on a static front page)
    $paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
    
    // the query
    $the_query = new WP_Query( \'cat=1&paged=\' . $paged ); 
    ?>
    
    <?php if ( $the_query->have_posts() ) : ?>
    
    <?php
    // the loop
    while ( $the_query->have_posts() ) : $the_query->the_post(); 
    ?>
       <?php the_title(); ?>
    <?php endwhile; ?>
    
    <?php
    
    // next_posts_link() usage with max_num_pages
    next_posts_link( \'Older Entries\', $the_query->max_num_pages );
    previous_posts_link( \'Newer Entries\' );
    ?>
    
    <?php 
    // clean up after our query
    wp_reset_postdata(); 
    ?>
    
    <?php else:  ?>
       <p><?php _e( \'Sorry, no posts matched your criteria.\' ); ?></p>
    <?php endif; ?>
    
    我希望这能说明你的问题

    SO网友:lakewood

    我参加聚会迟到了,但以上这些都帮不了我。我能够为这种完全令人讨厌的情况写一些变通方法。

    检查URL如果存在/page/2,请编写重定向规则,将查询字符串添加到URL,并在分页中使用该查询


    //Set a URL segments Global (functions.php)
    global $segments;
    $segments = explode(\'/\', $_SERVER[\'REQUEST_URI\']);
    $segments = array_filter($segments);
    $segments[\'classes\'] = implode(\' \', $segments);
    
    <小时>
    //Add this rewrite in your functions.php to add a query string to target
    add_action( \'init\', \'forum_paging_redirect\', 10 );
    function forum_paging_redirect( $redirect_url ) {
        global $segments;
    
        if($segments[1] === \'forum\' && $segments[2] === \'page\') {
            echo \'<script>window.location = "/forum?topics_page=\'.$segments[3].\'";</script>\';
        }
    }
    
    <小时>
    // Instead of native pagination function, echo this puppy:
    if(!empty($query_topics)) {
        $total = $query_topics->max_num_pages;
        $page = $_GET[\'topics_page\'];
    
        for($i = 1; $i < $total +1; $i++) {
            if($i == $page) {
                echo \'<span aria-current="page" class="page-numbers current">\'.$i.\'</span>\';
            } else {
                echo \'<a class="page-numbers" href="/forum/?topics_page=\'.$i.\'">\'.$i.\'</a>\';
            }
        }   
    } 
    

    结束

    相关推荐

    Pagination Custom post type

    我有一个名为“doel”的自定义帖子类型。我制作了一个页面模板来显示所有doel项目在这个页面模板中,我循环使用“doel”post类型,在其中6个之后,我想进行分页。仅显示分页。我开始上网,这似乎是wp 3.4版之后的常见问题我在这个网站和wp论坛上尝试了一些解决方案,但没有一个有效。例如,我尝试的是调整循环,因此分页将在循环中、循环外或endwhile和endif之间。此外,我还尝试了wp pagenavi插件和最初的wp previous和next post链接,但它们都不起作用,所以我认为我的循环