从头开始创建了我的第一个自定义主题,我正在尝试用相同的标签列出所有帖子。
在里面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 '<?php single_tag_title(); ?>'</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\', __( \'<< Previous page\', \'text-domain\' ) ),
\'next_text\' => sprintf( \'%1$s <i></i>\', __( \'Next page >>\', \'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 );
?>
这是迄今为止我的主题的文件结构:
最合适的回答,由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
模板文件。
原因是:
$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\' => __( \'<< Previous page\', \'text-domain\' ),
\'next_text\' => __( \'Next page >>\', \'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_page
到
3
总的来说
WP_Query
标记页的对象。仅此而已。