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

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

ただいまの
回答率

88.58%

wordpress(PHP)で開始~最新の投稿をすべて表示させたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 335
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

wordpressにて、バックナンバーページで過去から現在のすべてを表示したいのですが、
最新10件しか表示されず、古いものから順に表示されなくなってしまいます。
開始年からのすべてを表示させるにはどのように修正すればよいでしょうか。

 発生している問題

バックナンバーの表示が最新10件しか表示されない。

 該当のソースコード

<?php get_header(); ?>

<?php APP_breadcrumb(); ?>
<!-- /#breadcrumb -->

<main id="content">

    <div class="post-content backnumber-content">
        <header class="page-title">
            <div class="inner">
                <h1>バックナンバー</h1>
            </div>
        </header>

        <?php
        $years = array();
        while(have_posts()) : the_post();
            $year = get_the_time('Y');
            if(array_search($year, $years) === false) $years[] = $year;
        endwhile;
        $years = array_reverse($years);
        ?>
        <nav class="category-nav">
            <ul>
                <?php foreach($years as $year) : ?>
                <li><a href="#section-year<?php echo $year; ?>"><?php echo $year; ?>年度</a></li>
                <?php endforeach; ?>
            </ul>
        </nav>

        <div class="post-body">
<?php
$last_year = '';
while(have_posts()) : the_post();
    $thumb_id = get_post_thumbnail_id();
    if($thumb_id) $thumb = wp_get_attachment_image_src($thumb_id, 'full');
    $year = get_the_date('Y');
?>
<?php if($last_year != '' && $last_year != $year) : ?>
                </div>
            </section>
<?php endif; ?>
<?php if($last_year != $year) : ?>
            <section id="section-year<?php echo $year; ?>">
                <h2><?php echo $year; ?>年度バックナンバー</h2>
                <div class="articles">
<?php endif; ?>
                    <article>
                        <div class="inner">
                            <header>
                                <h3><?php the_title(); ?></h3>
                            </header>
                            <div class="article-body">
                                <?php if($thumb) : ?><div class="image"><img src="<?php echo $thumb[0]; ?>" alt=""></div><?php endif; ?>
                            </div>
                            <a href="<?php echo get_field('backnumber_link'); ?>" target="_blank" class="button"><img src="<?php echo get_stylesheet_directory_uri(); ?>/assets/images/magazine-view.png" alt=""><span>試読</span></a>
                        </div>
                    </article>
<?php
$last_year = $year;
endwhile;
?>
                </div>
            </section>
        </div>

    </div>

</main>
<!-- /#content -->

<?php get_footer(); ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

ループ条件が指定されていないと、ダッシュボード(管理画面)の「表示設定」( /wp-admin/options-reading.php )で、設定した件数しか表示されません。

pre_get_posts フックを使って、メインループの条件を変更する。

function change_posts_per_page_tt152266($query) {
  /* 管理画面,メインクエリに干渉しないために必須 */
  if ( is_admin() || ! $query->is_main_query() ){
     return;
  }
  /* アーカイブページの表示件数を変更する */
  if ( $query->is_archive() ) {
    $query->set( 'posts_per_page', '-1' );   // 1ページの表示件数 : -1 => 全件
    return;
  }
}
add_action('pre_get_posts', 'change_posts_per_page_tt152266' );

または、WP_Query で、ループの条件を決めて、下記のように使います。

$args = array(
    'posts_per_page' => -1,    // 1ページの表示件数 : -1 => 全件
);
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo get_the_title(); // ここで表示処理
    }
    /* Restore original Post Data */
    wp_reset_postdata();
}

参考URL

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/16 14:47

    ご回答ありがとうございます。

    function.php内にご教示いただいたソースコードを挿入したところ、全件表示できました。
    しかし、サイト内のすべてのカテゴリなどで全件表示されてしまいます。

    投稿ページ用のarchive.phpとバックーナンバーページ用のarchive-backnumber.phpで使い分けをしているのですが、特定のアーカイブ(バックナンバー用)のみを全件表示にすることはできないでしょうか。

    キャンセル

  • 2018/10/16 14:55 編集

    その辺りがよくわからなかったので、一般的な記載だけにとどめました。

    archive-backnumber.php ということは、 post_type が、` backnumber ` ということでしょうか?
    そうであれば、` $query->is_archive() ` の部分を ` is_post_type_archive( 'backnumber' ) ` としてください。
    または、テンプレート判別の ` is_page_template( 'archive-backnumber.php' ) ` の方がいいかもしれません

    キャンセル

  • 2018/10/16 15:36

    早速のご回答ありがとうございます。また、説明不足で申し訳ございませんでした。

    おっしゃるとおり post_type が、` backnumber ` でした。
    ご教示いただいた通り` is_post_type_archive( 'backnumber' ) `で解決いたしました。
    ありがとうございました。

    キャンセル

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

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

同じタグがついた質問を見る