最初のカスタムテーマを最初から作成し、同じタグを持つすべての投稿のリストを作成しようとしています。
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(); ?>
注:
WP_Query
でtag.php
を使用して新しいクエリを作成しました。これを行った理由は、メインクエリで、paginate_links()
を介して必要なページネーションのタイプ(<Prev 1 2 3 Next>
スタイル)を生成する方法がわからなかったためです。
functions.php
CODE:<?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 );
?>
これは私のテーマのファイル構造です。
あなたのCODEは非常に多くの点で間違っているので、ここでそれらに対処することすら試みるべきではありません。このようなカスタマイズをする前に、 公式WordPressテーマハンドブック を勉強することをお勧めします。
文脈のために、私はあなたのCODE内の他の問題を無視して、以下の問題だけに触れます:
index.php
テンプレートが読み込まれるのはなぜですか?まず第一に、あなたはあなたの間違ったコードから間違ったページネーションを受けています(以下の説明をチェックしてください)。そのため、最初のタグページとは別に、他のすべてのタグページは存在しません(つまり、タグページを増やすにはタグに投稿を追加する必要があります)。
次に、WordPressテンプレートの読み込み規則に従って、これらの存在しないタグページに対して404.php
テンプレートを読み込む必要があります(おそらくHTTPでは、404はページが見つかりませんエラーコード)。ただし、テーマに404.php
テンプレートがないため、WordPressテーマではultimate fallback templateであるため、index.php
テンプレートがロードされています。
さて、あなたが404.php
テンプレートを作成するならば、あなたはそれらの存在しないタグページのためにindex.php
の代わりにそれがロードされるのを見るでしょう。
Study WordPress Template Hierarchy さまざまなテンプレートがさまざまなコンテンツに対してどのように読み込まれるかをよりよく理解するために。
前述したように、ページネーション内に存在しないタグページ番号が表示されています。存在しないページ番号をページ区切りから削除するには、
'total' => $post_query->max_num_pages
paginate_links
テンプレートファイルのtag.php
関数呼び出しからの行。
その理由は:
$post_query
はあなたのカスタムクエリであり、タグアーカイブが持つページ数を決定する主なクエリではありません。 paginate_links
関数呼び出しの前にwp_reset_postdata()
を使ったことさえあるので、ここでその変数を使う理由はありません。
デフォルトでpaginate_links
関数のtotal
パラメータは、メインのWP_Queryのmax_num_pages
プロパティの値を取得します。そのため、それを削除すると、メインのWP_Queryオブジェクトからページ付けの正しい値が自動的に提供されます。
WP_Query
のないページ付けあなたが言ったコメントでは:
これを行ったのは、メインクエリで、
paginate_links()
を介して必要なページ区切りの種類(<Prev 1 2 3 Next>
スタイル)を生成する方法がわからなかったためです。
別のページ区切りスタイルのためだけに、まったく新しいWP_Query
は必要ありません。実際、paginate_links()
関数はメインのWP_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
のドキュメント を確認してください。
そうは言っても、(コメントから判断して)もう1つ必要なことがあるだけです。
これにも新しいWP_Query
は必要ありません。これはfunctions.php
の次のCODEから簡単に実現できます。
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
に設定します。それで全部です。