任何标记分页页面(第一页除外)加载的是index.php模板,而不是tag.php

时间:2018-07-04 作者:Cristian C

从头开始创建了我的第一个自定义主题,我正在尝试用相同的标签列出所有帖子。

在里面tag.php 我通过WP_Query 我正在尝试实现该列表的分页(使用paginate_links()). 页面链接似乎输出正确。第一页看起来也不错。

我不明白的是,当我转到下一个标记页(或从我的tag.php 模板,例如。http://127.0.0.1/wp_site/tag/test_tag/page/2/) 内容来自index.php 正在显示。

要正确显示后续标记页,我实际上缺少什么?

tag.php 模板代码:

<?php get_header(); ?>
<div class="">
    <div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">
            <?php if (have_posts()) : ?>
                <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <header class="entry-header">
                        <h1 class="entry-title">Other entries related to &#39;<?php single_tag_title(); ?>&#39;</h1>
                    </header><!-- .entry-header -->
                    <div class="entry-content"></div><!-- .entry-content -->
                </article><!-- #post-## -->
                <div>   
                    <?php while (have_posts()) : the_post(); ?>
                       <?php
                            $tagId = get_queried_object()->term_id;
                            $postType = get_post_type();
                        ?>
                    <?php endwhile; ?>
                    <?php
                        $htmlOutput = \'\';
                        /* the \'terms\' ID is the testimonial category parent id */
                        $paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
                        $args = [
                              \'post_type\' => \'testimonials-widget\', 
                              \'tag_id\' => $tagId,
                              \'posts_per_page\' => 3,
                              \'paged\' => $paged,
                              \'tax_query\' => [
                                    [
                                        \'taxonomy\' => \'category\',
                                        \'field\'    => \'term_id\',
                                        \'terms\'    => \'8\',
                                    ]
                                ],
                        ];    
                        $post_query = new WP_Query($args);
                        $contentHtml = \'\';
                        if($post_query->have_posts() ) {
                            $posts = $post_query->posts;
                            foreach($posts as $post) {
                                // generate html output
                            }
                        }
                        wp_reset_postdata();
                        echo $contentHtml;
                    ?>
                </div>
                <div class="mainContentWrapperCls">
                <?php 
                    echo paginate_links( array(
                        \'base\'         => str_replace( 999999999, \'%#%\', esc_url( get_pagenum_link( 999999999 ) ) ),
                        \'total\'        => $post_query->max_num_pages,
                        \'current\'      => max( 1, get_query_var( \'paged\' ) ),
                        \'format\'       => \'?paged=%#%\',
                        \'show_all\'     => false,
                        \'type\'         => \'plain\',
                        \'end_size\'     => 2,
                        \'mid_size\'     => 1,
                        \'prev_next\'    => true,
                        \'prev_text\'    => sprintf( \'<i></i> %1$s\', __( \'&lt;&lt; Previous page\', \'text-domain\' ) ),
                        \'next_text\'    => sprintf( \'%1$s <i></i>\', __( \'Next page &gt;&gt;\', \'text-domain\' ) ),
                        \'add_args\'     => false,
                        \'add_fragment\' => \'\',
                    ) );
                ?>
            </div>
            <?php else : ?>
                <h1>No posts were found.</h1> 
            <?php endif; ?>
        </main><!-- #main -->
    </div><!-- #primary -->
</div><!-- .wrap -->
<?php get_footer(); ?>
Note:我用创建了一个新查询WP_Query 在里面tag.php. 之所以这样做,是因为我不知道如何生成所需的分页类型(<Prev 1 2 3 Next> 样式)通过paginate_links(), 使用主查询。

主题functions.php 代码:

<?php
    function myCustomThemeScriptEnqueue() {
        // Theme stylesheet, js
        wp_enqueue_style(\'myCustomTheme-style\', get_stylesheet_uri(), array(), \'1.0.0\', \'all\');
    }

    function myCustomThemeThemeSetup() {
        add_theme_support(\'menus\');
        add_post_type_support( \'page\', \'excerpt\' );
    }

    function nllTagFilter($query) {
        if ($query->is_main_query()) {
            if ($query->is_tag) {
                $post_types = get_post_types();
                $query->set(\'post_type\', $post_types);
            }
        }
    }

    add_action(\'pre_get_posts\',\'nllTagFilter\');

    add_action(\'wp_enqueue_scripts\', \'myCustomThemeScriptEnqueue\');
    add_action(\'init\', \'myCustomThemeThemeSetup\');

    add_theme_support( \'post-thumbnails\' );
    set_post_thumbnail_size( 150, 150 );
?>
这是迄今为止我的主题的文件结构:

custom theme file structure

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

总体代码问题:

您的代码在很多方面都是错误的,我甚至不应该在这里尝试解决它们。我建议你学习Official WordPress Theme Handbook 在进行此类自定义之前,请先进行正确的操作。

出于上下文考虑,我忽略了代码中的其他问题,只涉及以下问题:

1。为什么?index.php 是否正在加载模板

首先,错误代码的分页错误(请查看下面的解释)。因此,除了第一个标记页之外,所有其他标记页都不存在(即,您需要向标记添加更多帖子以获得更多标记页)。

其次,根据WordPress模板加载规则,404.php 应该为那些不存在的标记页加载模板(您可能知道,在HTTP中,404是Page Not Found Error CODE). 但是,由于您没有404.php 主题中的模板,index.php 正在加载模板,因为它是ultimate fallback template 在WordPress主题中。

现在,如果您创建404.php 模板,然后您将看到它将被加载,而不是index.php 对于那些不存在的标记页。

学习WordPress Template Hierarchy 以更好地了解如何为不同的内容加载不同的模板。

2。修复错误的分页:

如上所述,分页中不存在标记页码。要从分页中删除那些不存在的页码,需要删除

\'total\' => $post_query->max_num_pages
来自的行paginate_links 函数调用tag.php 模板文件。

原因是:

  1. $post_query 是您的自定义查询,而不是应确定标记存档的页数的主查询。你甚至用过wp_reset_postdata() 之前paginate_links 函数调用,因此没有理由在这里使用该变量。

    total 的参数paginate_links 函数默认情况下获取主WP\\U查询的值max_num_pages 所有物因此,删除它将自动为主WP\\U查询对象的分页提供正确的值。

3。分页而不新建WP_Query:

您在评论中说:

之所以这样做,是因为我不知道如何生成所需的分页类型(<Prev 1 2 3 Next> 样式)通过paginate_links(), 使用主查询。

你不需要一个全新的WP_Query 只是为了不同的分页样式。事实上paginate_links() 函数不需要mainWP_Query 反对!

因此,您所需要的分页样式是:

echo paginate_links( array(
    \'end_size\'     => 2,
    \'mid_size\'     => 1,
    \'prev_text\'    => __( \'&lt;&lt; Previous page\', \'text-domain\' ),
    \'next_text\'    => __( \'Next page &gt;&gt;\', \'text-domain\' ) 
) );
默认情况下,将收集所有其他值(包括主WP_Query 对象)!这样您就可以删除新的WP_Query 中的对象tag.php 完全是模板。检查paginate_links documentation.

话虽如此,您可能还想要一件事(从您的评论来看):

4。控制每个标记页的帖子数:

您不需要新的WP_Query 对于这个也一样。这可以通过中的以下代码轻松实现functions.php:

function tag_post_per_page_filter( $query ) { 
    if ( $query->is_main_query() ) { 
        if ( $query->is_tag ) { 
            $query->set( \'posts_per_page\', 3 );
        }   
    }   
}   

add_action(\'pre_get_posts\',\'tag_post_per_page_filter\');
基本上它设置了posts_per_page3 总的来说WP_Query 标记页的对象。仅此而已。

SO网友:jeffkee

要补充一点,以防对其他人有所帮助:如果您传递“total”参数,它将显示超出需要的页面数

$args = array(\'total\'=>20);
在博客首页(index.php)上,我将显示限制为20页(这个客户端有数百篇文章)。5太少了——希望确保谷歌能获得更多。

然而,当我将此复制到标记时。php或类别。php为了实现OP想要实现的目标,我默认情况下保留了这些变量。我想,即使我将最大值设置为20,如果文章较少,显示的内容也会较少,对吗?Wrong.

事实证明,如果我要求显示20页,即使某个类别下有5页的文章,它也会覆盖这一点。

当我点击特定类别中的第6页时,它将显示我的404的内容。php,因为某一类别下的文章不超过25篇(每页5篇是显示限制)。

我想:“我想,我会的。”;哦,它必须加载所有文章在博客上的分页计数,而不仅仅是这个类别"E;我进行了一场白费力气的追逐,寻找如何将此功能限制为仅显示当前类别页面的答案。

Fayaz上面的话给了我需要的提示:

好吧,您不需要为不同的分页样式使用全新的WP\\u查询。事实上,paginate\\u links()函数根本不需要主要的WP\\u查询对象!注释掉“total”数组键就成功了。

<?php
            $pages_args = array(
                \'prev_next\'=>false,
                // \'total\'=>20
            );

            $pagelinks = paginate_links($pages_args);
            echo $pagelinks;
            ?>

结束

相关推荐

Global changing of H Tags

是否有一种方法可以全局更改标题1、标题2、标题3等的字体大小。例如,如果我想更改所有标记为H2的内容的字体大小,则站点中每个页面上的每个H2文本大小都会更改。非常感谢。