Wordpress博客分页返回404页面,$ post未定义

时间:2015-04-03 15:14:18

标签: wordpress .htaccess pagination http-status-code-404

我在较旧的网站上设置了一个博客,并尝试了一切以使分页工作。

以下是category-blog.php文件中的代码:

    <section>
    <div id="content">
        <h1 class="blog-heading">In The News</h1>
            <?php
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

            get_posts(array(
                'post_type'      => 'post', // You can add a custom post type if you like
                'paged'          => $paged,
                'posts_per_page' => 4
            ));
            ?>
        <?php if( have_posts() ): ?>

            <div id="blog-grid">

                <?php while (have_posts()) : the_post(); ?>         
                <div class="blog-post" id="blog-post-<?php get_the_ID(); ?>">                   
                    <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'blog-index' ); ?></a>
                    <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
                    <?php the_excerpt(); ?>
                    <div class="readmore-link">
                        <a href="<?php the_permalink(); ?>">Read More</a>
                    </div><!-- end div.readmore-link -->                        
                </div><!-- end div.blog-post -->
                <?php endwhile; ?>                  
            </div><!-- end div#blog-grid -->

            <div class="pagination">
                <?php my_pagination(); ?>
            </div><!-- /.navigation -->

        <?php endif; ?>

    </div><!-- end content -->
</section>

和functions.php文件

    if ( ! function_exists( 'my_pagination' ) ) :
    function my_pagination() {
        global $wp_query;

        $big = 999999999; // need an unlikely integer
        $paginate_links = paginate_links( array(
            //'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'base' => str_replace( $big, '%#%', get_pagenum_link($big) ),
            'format' => '?paged=%#%',
            'current' => max( 1, get_query_var('paged') ),
            'total' => $wp_query->max_num_pages,
            'prev_next' => False
        ) );
        if ( $paginate_links ) {
            echo $paginate_links;
        }

    }
endif;

当我访问/ blog的博客页面时,我可以看到帖子列表..正如预期的那样。分页呈现在帖子下方(再次,如预期的那样)但是当你导航到第2页时...你去/ blog / page / 2 /并得到404错误,说明$ post未定义!

我尝试通过在functions.php中声明posts_per_page和pre_get_posts来解决这个问题,我可以在网上找到这些帖子,如:

define('PER_PAGE_DEFAULT', 4);
function my_post_count_queries( $query ) {
  if (!is_admin() && $query->is_main_query()){
       $query->set('posts_per_page', 4);
  }
}
add_action( 'pre_get_posts', 'my_post_count_queries' );

add_action( 'pre_get_posts', 'modify_blog_query' );
function modify_blog_query( $query ) {
    if ( !is_admin() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', 4 );
    }
}


function change_posts_per_page(){ return 1; }
if( preg_match("|\/".get_option('tag_base')."\/.+\/page\/[0-9]+$|i", $_SERVER['REQUEST_URI']) ){
    add_filter( 'pre_option_posts_per_page' , 'change_posts_per_page');
}

甚至远远地修改了.htaccess重写规则以忽略/ blog页面..我甚至安装了几个插件,它们像我的函数一样呈现了分页..并且仍然产生了404.

我还用标准Prev / Next替换了整个分页功能,结果相同:

                    <div class="nav-previous alignleft"><?php next_posts_link( 'Older posts' ); ?></div>
                <div class="nav-next alignright"><?php previous_posts_link( 'Newer posts' ); ?></div>

最后,由于这是一个现有的实时网站..我无法禁用任何现有的插件,以查看是否有一个或多个导致冲突或错误。

非常感谢任何有关最佳/更好的方法的帮助和反馈。

已更新

我用自定义查询替换了get_posts查询..基于下面的Nathan推荐(感谢!)..仍然,在分页链接上使用相同的404。

以下是我使用的自定义查询:

        <?php
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $temp = $wp_query;
        $wp_query = null;
        $wp_query_args = array( 
                            'post_type'=> 'post',
                            'posts_per_page' => 4,
                            'paged'=> $paged
                        );
        $wp_query = new WP_Query( $wp_query_args );
        if ( $wp_query->have_posts() ) : ?>
        <div id="blog-grid">
        <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

        <div class="blog-post" id="blog-post-<?php get_the_ID(); ?>">                   
            <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'blog-index' ); ?></a>
            <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
            <?php the_excerpt(); ?>
            <div class="readmore-link">
                <a href="<?php the_permalink(); ?>">Read More</a>
            </div><!-- end div.readmore-link -->                        
        </div><!-- end div.blog-post -->

        <?php endwhile; ?>
        </div><!-- end div#blog-grid -->    
        <?php endif; ?>

        <div class="pagination">
            <?php my_pagination(); ?>
        </div><!-- /.navigation -->

        <?php 
          $wp_query = null; 
          $wp_query = $temp;  // Reset
        ?>

第二次更新

此页面已上线,因此我为愿意提供帮助的人提供了一个链接,以便进行测试:

Blog Index

Blog Page 2, Error page

1 个答案:

答案 0 :(得分:0)

经过大量的研究,摆弄和编码......我意识到分页功能并没有在链接中添加类别基础 - 例如。 / category / blog /并且只返回/ bog / ...奇怪的是,/ blog页面工作了......但是,当分页时,它没有。

因此,我创建了一个新模板并重命名了该类别。我安装了WP_PageNavi并将其用于分页。这解决了这个问题..因此,许多人似乎正在使用的这种分页功能不能正常运行。

即,这一个:

    if ( ! function_exists( 'my_pagination' ) ) :
    function my_pagination() {
        global $wp_query;

        $big = 999999999; // need an unlikely integer
         if( get_option('permalink_structure') ) {
             $format = 'category/page/%#%';
         } else {
             $format = 'category/?paged=%#%';
         }

        $paginate_links = paginate_links( array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            //'base' => str_replace( $big, '%#%', get_pagenum_link($big) ),
            'format' => $format,
            'current' => max( 1, get_query_var('page') ),
            'total' => $wp_query->max_num_pages,
            'prev_next' => False
        ) );
        if ( $paginate_links ) {
            echo $paginate_links;
        }

    }
endif;

它不会预先添加类别基本路径..这会导致分页失败重定向。