分页在自定义页面模板上不起作用

时间:2014-06-07 作者:bluantinoo

我在这方面搜索了很多,但我不明白为什么我的代码不起作用。

我发布了一个带有“slug”的页面;博客;使用自定义构建模板的;页面博客。php“;我通过编辑原文构建的;页php;。我想循环最新的帖子,分页。

对于编号分页,我尝试了几个插件。它们都适用于归档和分类页面,但也适用于页面博客。php我总是得到相同的结果。我试图查看的任何页面都会出现404错误。只有第一页上的循环有效。

URL如下所示:

www.mywebsite。com/blog/(页面url,带第一个页面循环,ok)

www.mywebsite。com/blog/page/2/(404错误)

www.mywebsite。com/blog/page/3/(404错误)

这是我的页面博客。php完整代码。

    <?php get_header(); ?>

    <div id="primary" class="content-area col three-fourth two-columns-right">
        <main id="main" class="site-main" role="main">
            
            <?php while ( have_posts() ) : the_post(); // page loop ?>

            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <header class="entry-header">
                    <?php the_title( \'<h1 class="entry-title">\', \'</h1>\' ); ?>
                    <?php edit_post_link( __( \'Edit\', \'mywebsite\' ), \'<span class="edit-link">\', \'</span>\' ); ?>
                </header>

                <div class="entry-content">
                    <?php the_content(); ?>
                </div>
            </article>

            <?php endwhile; // end of the page loop. ?>
            <?php wp_reset_postdata(); ?>
            
            <?php 
            // Begin secondary loop (pagination not working)
            $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
            
            $args = array (
                \'post_type\'              => \'post\',
                \'post_status\'            => \'publish\',
                \'paged\' => $paged,
            );

            // The Query
            $news_query = new WP_Query( $args );
            
            // Preserving main query
            $temp_query = $wp_query;
            $wp_query   = NULL;
            $wp_query   = $news_query;
            
            ?>
            <?php if ( $news_query->have_posts() ) : ?>
                <?php while ( $news_query->have_posts() ) : $news_query->the_post(); ?>
                    <?php get_template_part( \'content\', get_post_format() );?>
                <?php endwhile; ?>

                <?php  if(function_exists(\'wp_paginate\')) {
                    wp_paginate();
                } ?>
                
                <?php wp_reset_postdata(); ?>

            <?php else : ?>

                <?php get_template_part( \'content\', \'none\' ); ?>

            <?php endif; ?>
            <?php 
            // Reset main query object
            $wp_query = NULL;
            $wp_query = $temp_query;    
            ?>

        </main><!-- #main -->
    </div><!-- #primary -->

<?php get_sidebar(\'blog\'); ?>
<?php get_footer(); ?>

3 个回复
SO网友:Pieter Goosen

MOST IMPORTANT EDIT

当我测试您的代码时,我总是添加页面标题名称,但从未意识到这是您没有添加的内容。您应该始终命名自定义页面模板,以便wordpress知道它是一个页面模板。因此,您需要编辑自定义页面模板并添加标题,如下所示

<?php
/**
 * Template Name: Name of your template
 */
get_header(); ?>

ORIGINAL ANSWER

您必须查看的分页参数WP_Query.

  • paged (int) - 页码。显示在使用“旧条目”链接时通常只显示在第X页上的帖子。

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

    如果将此页面模板设置为主页,则代码将正常工作并分页。但是,如果将此页面模板用作帖子/博客页面,则需要更改

    $paged = ( get_query_var(\'page\') ) ? get_query_var(\'page\') : 1;
    

    $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
    
    需要注意的是,您使用的插件(WP Paginate) 两年多没有更新过。虽然它仍然可以工作,但我建议您看看其他最新的插件,以避免以后出现问题。

    或者,您可以使用此函数进行分页。我不确定原作者是谁,但不管你是谁,我都相信你。

    以下代码进入函数。php

    if ( ! function_exists( \'pietergoosen_pagination\' ) ) :
    
        function pietergoosen_pagination($pages = \'\', $range = 2) {   
           $showitems = ($range * 2)+1;  
    
          global $paged;
          if(empty($paged)) $paged = 1;
    
              if($pages == \'\')
              {
                 global $wp_query;
                 $pages = $wp_query->max_num_pages;
                    if(!$pages)
                    {
                    $pages = 1;
                    }
                }   
    
               if(1 != $pages)
              {
                $string = _x( \'Page %1$s of %2$s\' , \'%1$s = current page, %2$s = all pages\' , \'pietergoosen\' );
                echo "<div class=\'pagination\'><span>" . sprintf( $string, $paged, $pages ) . "</span>";
                  if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href=\'".get_pagenum_link(1)."\'>" . __( \'&laquo; First\', \'pietergoosen\' ) . "</a>";
                 if($paged > 1 && $showitems < $pages) echo "<a href=\'".get_pagenum_link($paged - 1)."\'>" . __( \'&lsaquo; Previous\', \'pietergoosen\' ) . "</a>";
    
                    for ($i=1; $i <= $pages; $i++)
                    {
                       if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
                       {
                            echo ($paged == $i)? "<span class=\\"current\\">".$i."</span>":"<a href=\'".get_pagenum_link($i)."\' class=\\"inactive\\">".$i."</a>";
                       }
                   }
    
                   if ($paged < $pages && $showitems < $pages) echo "<a href=\'" . get_pagenum_link($paged + 1)."\'>" . __( \'Next &rsaquo;\', \'pietergoosen\' ) . "</a>";
                   if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href=\'".get_pagenum_link($pages)."\'>" . __( \'Last &raquo;\', \'pietergoosen\' ) . "</a>";
                   echo "</div>\\n";
             }
            } //  pietergoosen_pagination
    
    endif;
    
    您可以在模板中调用分页,如下所示

     <?php  pietergoosen_pagination(); ?>
    

    EDIT

    据我所知,你对另一个答案的评论

    我不想让那个页面成为我的主页。我的主页有另一个模板。我只想让它发挥作用,并在www.mywebsite下列出帖子。com/blog/URL

    您已经在“阅读设置”中将您的博客页面设置为“帖子页面”,并将其他页面设置为您的“首页:”。如果是这种情况,则索引。php将用作您的帖子页面,而不是自定义页面模板。

    有一种快速的方法可以检查您正在查看的页面使用的模板。只需在函数中粘贴以下代码。php(摘自here)

    add_action(\'wp_head\', \'show_template\');
    function show_template() {
        global $template;
        print_r($template);
    } 
    

    EDIT 2

    这是我修改过的模板之一。请测试它,看看它是否有效。如果这不起作用,我也不知道。我已经用尽可能多的方法测试了你的模板,但我不能让它像你描述的那样失败

    <?php
    /**
     * Template Name: Test Page 3
     */
    get_header(); ?>
    
    <div id="main-content" class="main-content">
    
        <div id="primary" class="content-area">
            <div id="content" class="site-content" role="main">
    
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <header class="entry-header">
                    <?php the_title( \'<h1 class="entry-title">\', \'</h1>\' ); ?>
                    <?php edit_post_link( __( \'Edit\', \'mywebsite\' ), \'<span class="edit-link">\', \'</span>\' ); ?>
                </header>
    
                <div class="entry-content">
                    <?php the_content(); ?>
                </div>
            </article>
    
    
                <?php 
                    global $post;
    
                    $tmp_post = $post;
    
                     $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
    
                    $args = array (
                        \'post_type\'              => \'post\',
                        \'post_status\'            => \'publish\',
                        \'paged\' => $paged,
                    );
    
    
                        $wp_query= null;
                        $wp_query = new WP_Query();
                        $wp_query->query( $args );
    
            if ( $wp_query->have_posts() ) :
    
                    while ( $wp_query->have_posts() ) : $wp_query->the_post();
    
    
                        get_template_part( \'content\', get_post_format() );
    
                endwhile;
    
                    if(function_exists(\'wp_paginate\')) {
                    wp_paginate();
                }   
    
                    else 
    
                        get_template_part( \'content\', \'none\' );
    
                    endif; 
    
                    $post = $tmp_post; 
    
                     if ( comments_open() || get_comments_number() ) {
                            comments_template();
                        } ?>
    
        </div><!-- #content -->
        </div><!-- #primary -->
    
        <?php get_sidebar(); ?>
    
    </div><!-- #main-content -->
    
    <?php
    get_footer();
    

SO网友:jave.web

在我看来,你是在试图对一个页面进行分页,这也可能意味着wordpress正在破坏你的page/paged var,这可以通过添加一个过滤器来轻松解决,添加一个自定义vars页面/页面

add_filter(\'query_vars\', function( $vars ){
    //!!SUPER IMPORTANT!! - always *APPEND* $vars array (NOT re-assign)
    $vars[] = \'page\';
    $vars[] = \'paged\';

    //!!SUPER IMPORTANT!! - always return $vars
    return $vars;
});
YOU MUST REFRESH REWRITE RULES THEN ! - 最简单的方法是转到您的管理>首选项>永久链接=>并单击保存(更改)

如果您仍然获得404,您可能需要添加custom rewrite rule - 每次更改后,始终刷新前面提到的重写规则。。。

SO网友:sultan

您是否已将阅读中的博客页面设置为帖子页面,如果是,请制作一个名为home的模板,并将上述代码放入您的主页模板中。

希望这对你有帮助。

结束

相关推荐

Get posts from taxonomy URL

如何使用URL从自定义分类中获取帖子,以确定显示的是哪个分类术语id?我试图通过使用get_category_by_path 传递URL时返回false,因为自定义分类法不同。对于分类法,是否有一个等效的函数可以做到这一点?我在谷歌上搜索了一下Wordpress抄本,什么也没找到。非常感谢