質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

WordPressでページ送りができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,774

cotton88

score 83

Wordpressでアーカイブページのページ送りが表示できません。。
(404.phpに遷移します)

結構困っています。。助けてください。。

状況というか、分かることを列挙して説明いたしますと、

・Underscoreをカスタマイズ
・ページ数(1,2,3・・・10)は問題なく取得できているがリンク先が表示できない。
・プラグインFV Top Level Categoriesをインストール。
・パーマリンクは「/%category%/%postname%」。
・「http://example.com/column/category-slug/page/1/」と打ったら表示できるが2ページ目以降はダメ。
・テスト環境だと問題ないが、本番環境だと本症状になる。

//archive.php

    <div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">

        <?php
        if ( have_posts() ) : ?>

            <?php
            $paged = get_query_var('paged');
            // カテゴリーページの表示件数を変更するには、posts_per_pageの数字を変更
            query_posts($query_string . '&posts_per_page=8&paged=' . $paged);
            /* Start the Loop */
            while ( have_posts() ) : the_post();

                /*
                 * Include the Post-Format-specific template for the content.
                 * If you want to override this in a child theme, then include a file
                 * called content-___.php (where ___ is the Post Format name) and that will be used instead.
                 */
                get_template_part( 'template-parts/content', 'listunit' );

            endwhile;

            pagination();

        else :

            get_template_part( 'template-parts/content', 'none' );

        endif;
        wp_reset_query(); ?>

        </main><!-- #main -->
    </div><!-- #primary -->
//function.php

/*-------------------------------------------*/
/*    Pasing
/*-------------------------------------------*/
function pagination($max_num_pages = '', $range = 1) {
    $showitems = ($range * 2)+1;

    global $paged;
    if(empty($paged)) $paged = 1;

    if($max_num_pages == '') {
        global $wp_query;
        // 最後のページ
        $max_num_pages = $wp_query->max_num_pages;
        if(!$max_num_pages) {
             $max_num_pages = 1;
        }
    }

    if(1 != $max_num_pages) {
        echo '<div class="paging_wrap">'."\n";
        echo '<ol class="paging">'."\n";

        // Prevリンク
        // 現在のページが2ページ目以降の場合
        if ($paged > 1) echo '<li><a class="prev_link" href="'.get_pagenum_link($paged - 1).'">&laquo;</a></li>'."\n";

        // 今のページからレンジを引いて2以上ある場合 && 最大表示アイテム数より最第ページ数が大きい場合
        // (レンジ数のすぐ次の場合は表示する)
        // 1...345
        if ( $paged-$range >= 2 && $max_num_pages > $showitems ) echo '<li><a href="'.get_pagenum_link(1).'">1</a></li>'."\n";
        // 今のページからレンジを引いて3以上ある場合 && 最大表示アイテム数より最第ページ数が大きい場合
        if ( $paged-$range >= 3 && $max_num_pages > $showitems ) echo '<li><span class="txt_hellip">&hellip;</span></li>'."\n";

        // レンジより前に追加する数
        $addPrevCount = $paged+$range-$max_num_pages;
        // レンジより後に追加する数
        $addNextCount = -($paged-1-$range); // 今のページ数を遡ってカウントするために-1
        // アイテムループ
        for ($i=1; $i <= $max_num_pages; $i++) {
            // 表示するアイテム
            if ($paged == $i) {
                $pageItem = '<li><span class="current">'.$i.'</span></li>'."\n";
            } else {
                $pageItem = '<li><a href="'.get_pagenum_link($i).'" class="inactive">'.$i.'</a></li>'."\n";
            }

            // 今のページからレンジを引いた数~今のページからレンジを足した数まで || 最大ページ数が最大表示アイテム数以下の場合
            if ( ( $paged-$range <= $i && $i<= $paged+$range ) || $max_num_pages <= $showitems ) {
                echo $pageItem;
                // 今のページからレンジを引くと負数になる場合 && 今のページ+レンジ+負数をレンジに加算した数まで
            } else if ( $paged-1-$range < 0 && $paged+$range+$addNextCount >= $i ) {
                echo $pageItem;
            // 今のページからレンジを足すと 最後のページよりも大きくなる場合 && 今のページ+レンジ+負数をレンジに加算した数まで
            } else if ( $paged+$range > $max_num_pages && $paged-$range-$addPrevCount <= $i ) {
                echo $pageItem;
            }
        }

        // 現在のページにレンジを足しても最後のページ数より2以上小さい時 && 最大表示アイテム数より最第ページ数が大きい場合
        if ( $paged+$range <= $max_num_pages-2 && $max_num_pages > $showitems ) echo '<li><span class="txt_hellip">&hellip;</span></li>'."\n";
        if ( $paged+$range <= $max_num_pages-1 && $max_num_pages > $showitems ) echo '<li><a href="'.get_pagenum_link($max_num_pages).'">'.$max_num_pages.'</a></li>'."\n";
        // Nextリンク
        if ($paged < $max_num_pages) echo '<li><a class="next_link" href="'.get_pagenum_link($paged + 1).'">&raquo;</a></li>'."\n";
        echo "</ol>\n";
        echo "</div>\n\n";
     }
}

不足している情報があれば是非教えて下さい。

追記------------------------------------

single.php に記述している所属しているカテゴリーを表示するコードも原因不明で出力がされていない状況でした。
ご参考になればと思い追記しました。

ここはマルっとUnderscoreのコードを流用しています。

<p class="entry-category"><?php cseo_template_entry_footer(); ?></p><p class="entry-category"></p>
if ( ! function_exists( 'cseo_template_entry_footer' ) ) :
/**
 * Prints HTML with meta information for the categories, tags and comments.
 */
function cseo_template_entry_footer() {
    // Hide category and tag text for pages.
    if ( 'post' === get_post_type() ) {
        /* translators: used between list items, there is a space after the comma */
        $categories_list = get_the_category_list( esc_html__( ', ', 'cseo_template' ) );
        if ( $categories_list && cseo_template_categorized_blog() ) {
            printf( '<span class="cat-links">' . esc_html__( '%1$s', 'cseo_template' ) . '</span>', $categories_list ); // WPCS: XSS OK.
        }

        /* translators: used between list items, there is a space after the comma */
        // $tags_list = get_the_tag_list( '', esc_html__( ', ', 'cseo_template' ) );
        // if ( $tags_list ) {
        //     printf( '<span class="tags-links">' . esc_html__( 'Tagged %1$s', 'cseo_template' ) . '</span>', $tags_list ); // WPCS: XSS OK.
        // }
    }

    if ( ! is_single() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) {
        echo '<span class="comments-link">';
        /* translators: %s: post title */
        comments_popup_link( sprintf( wp_kses( __( 'Leave a Comment<span class="screen-reader-text"> on %s</span>', 'cseo_template' ), array( 'span' => array( 'class' => array() ) ) ), get_the_title() ) );
        echo '</span>';
    }

    edit_post_link(
        sprintf(
            /* translators: %s: Name of current post */
            esc_html__( 'Edit %s', 'cseo_template' ),
            the_title( '<span class="screen-reader-text">"', '"</span>', false )
        ),
        '<span class="edit-link">',
        '</span>'
    );
}
endif;

/**
 * Returns true if a blog has more than 1 category.
 *
 * @return bool
 */
function cseo_template_categorized_blog() {
    if ( false === ( $all_the_cool_cats = get_transient( 'cseo_template_categories' ) ) ) {
        // Create an array of all the categories that are attached to posts.
        $all_the_cool_cats = get_categories( array(
            'fields'     => 'ids',
            'hide_empty' => 1,
            // We only need to know if there is more than one category.
            'number'     => 2,
        ) );

        // Count the number of categories that are attached to the posts.
        $all_the_cool_cats = count( $all_the_cool_cats );

        set_transient( 'cseo_template_categories', $all_the_cool_cats );
    }

    if ( $all_the_cool_cats > 1 ) {
        // This blog has more than 1 category so cseo_template_categorized_blog should return true.
        return true;
    } else {
        // This blog has only 1 category so cseo_template_categorized_blog should return false.
        return false;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cotton88

    2016/08/03 20:47

    「2ページ目(以降)が404 ページがありません と出てしまう」という、カスタム投稿タイプを用いてスラッグを重複させない、という所でしょうか?

    キャンセル

  • asahina_dev

    2016/08/03 21:00

    私は多分そのあたりの関連なんじゃないのかなぁと思ってますが。

    キャンセル

  • cotton88

    2016/08/03 21:03

    ありがとうございます。現在はpostで投稿していて、カスタム投稿タイプを使う理由はありませんが、プラグインを用いてテストしてみたいと思います。

    キャンセル

回答 1

checkベストアンサー

0

query_posts は最近あまり使われない関数です。理由はページングなどへの弊害があるためです。

ページごとの記事数は下記のコードを functions.php に追記すればカテゴリーページにおいて8件の表示に出来ると思います。一度置き換えてみて、それでもページングに問題がある場合はまた詳細を追記ください。

function cat_posts_on_homepage( $query ) {
    if ( $query->is_category() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '8' );
    }
}
add_action( 'pre_get_posts', 'cat_posts_on_homepage' );

【テンプレートタグ/query posts - WordPress Codex 日本語版】
https://wpdocs.osdn.jp/テンプレートタグ/query_posts#.E8.AA.AC.E6.98.8E

【もうquery_postsは呼ばない:WordPress私的マニュアル】
http://elearn.jp/wpman/column/c20110927_01.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/03 21:11

    すごい・・・。2ページ目以降でも表示が出来ました!いつもありがとうございます。感謝してもしきれません。

    原因としては、ご指摘の通りquery_posts なのでしょうか?
    しかしながらテスト環境(ロリポ)と本番環境(不明)で表示ができたり出来なかったりしたので、混乱した一つの要因でした。

    kei344様の考えられる範囲でご回答いただけると幸いです。

    キャンセル

  • 2016/08/03 21:16

    環境がわかりませんし、はっきりと言えませんが、少なくとも「query_posts は環境によって使えない」が問題だったと言うことでしょう。

    今は削除対象にはなっていませんが、将来的にquery_postsはWordPressから削除されると思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる