web-dev-qa-db-ja.com

タグのページ付けページ(1ページ目を除く)は、tag.phpではなくindex.phpテンプレートをロードします

最初のカスタムテーマを最初から作成し、同じタグを持つすべての投稿のリストを作成しようとしています。

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(); ?>

注:WP_Querytag.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 );
?>

これは私のテーマのファイル構造です。

custom theme file structure

2
Cristian C

コード全体の問題:

あなたのCODEは非常に多くの点で間違っているので、ここでそれらに対処することすら試みるべきではありません。このようなカスタマイズをする前に、 公式WordPressテーマハンドブック を勉強することをお勧めします。

文脈のために、私はあなたのCODE内の他の問題を無視して、以下の問題だけに触れます:

1. index.phpテンプレートが読み込まれるのはなぜですか?

まず第一に、あなたはあなたの間違ったコードから間違ったページネーションを受けています(以下の説明をチェックしてください)。そのため、最初のタグページとは別に、他のすべてのタグページは存在しません(つまり、タグページを増やすにはタグに投稿を追加する必要があります)。

次に、WordPressテンプレートの読み込み規則に従って、これらの存在しないタグページに対して404.phpテンプレートを読み込む必要があります(おそらくHTTPでは、404はページが見つかりませんエラーコード)。ただし、テーマに404.phpテンプレートがないため、WordPressテーマではultimate fallback templateであるため、index.phpテンプレートがロードされています。

さて、あなたが404.phpテンプレートを作成するならば、あなたはそれらの存在しないタグページのためにindex.phpの代わりにそれがロードされるのを見るでしょう。

Study WordPress Template Hierarchy さまざまなテンプレートがさまざまなコンテンツに対してどのように読み込まれるかをよりよく理解するために。

2.間違ったページネーションを修正します。

前述したように、ページネーション内に存在しないタグページ番号が表示されています。存在しないページ番号をページ区切りから削除するには、

'total' => $post_query->max_num_pages

paginate_linksテンプレートファイルのtag.php関数呼び出しからの行。

その理由は:

  1. $post_queryはあなたのカスタムクエリであり、タグアーカイブが持つページ数を決定する主なクエリではありません。 paginate_links関数呼び出しの前にwp_reset_postdata()を使ったことさえあるので、ここでその変数を使う理由はありません。

  2. デフォルトでpaginate_links関数のtotalパラメータは、メインのWP_Queryのmax_num_pagesプロパティの値を取得します。そのため、それを削除すると、メインのWP_Queryオブジェクトからページ付けの正しい値が自動的に提供されます。

3.新しい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'    => __( '&lt;&lt; Previous page', 'text-domain' ),
    'next_text'    => __( 'Next page &gt;&gt;', 'text-domain' ) 
) );

他のすべての値はデフォルトで収集されています(メインのWP_Queryオブジェクトを含む)。そのため、WP_Queryテンプレート内の新しいtag.phpオブジェクトを完全に削除できます。 paginate_linksのドキュメント を確認してください。

そうは言っても、(コメントから判断して)もう1つ必要なことがあるだけです。

4.タグページあたりの投稿数を制御します。

これにも新しい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オブジェクトで3WP_Queryに設定します。それで全部です。

1
Fayaz