【WordPress】投稿一覧をタクソノミーごとに表示する方法(その2)

プログラミング

【WordPress】投稿一覧をタクソノミーごとに表示する方法

以前こちらの記事で、投稿一覧をタクソノミーごとに区切って表示して、それぞれにタイトルを付ける方法を掲載しました。

しかし、その時点では、ページネーションを付けることがかないませんでした。

今回その2では、ページネーションも兼ね備えたバージョンを紹介します。固定ページにphpを適用させたり、function.phpにコードを追記する点に関しては前回と同様なので、プラグインの使い方などは前回記事を参考にしてください。

ページネーションに関しても、以前作成したものを流用しているので、そちらを参考にしてください。
【WordPress】ページネーションを作成する

固定ページに記載するコード

<?php
        $max_publish = 3; //1ページに表示する投稿数
        $current_page = get_query_var('paged');
        $current_page = $current_page == 0 ? '1' : $current_page;

        //一つ前のページの最後に表示されていた都道府県を知りたい
        $publish_num = 0;
        $start_prefecture = 1; //表示するページの最初の都道府県のi
        $max_taxonomy_num = 47;//タクソノミーの数
        if (function_exists('listQuery')) {
            for ($i = 1; $i <= $max_taxonomy_num; $i++) {
                if ($publish_num < $max_publish * ($current_page - 1)  && $i != $max_taxonomy_num) {
                    $add_num = listQuery($i, -1)->post_count;
                    $publish_num += $add_num;
                } else {
                    if ($publish_num / (($current_page - 1) * $max_publish) == 1) {
                        $start_prefecture = $i;
                        $shift = 0; //ずらしなし
                    } else {
                        $shift = $max_publish * ($current_page - 1) - $publish_num + $add_num;
                        $i == $max_taxonomy_num ? $start_prefecture = $i : $start_prefecture = $i - 1;
                    }
                    break;
                }
            }
        }
        $publish_num = 0;
        if (function_exists('prefecturesLoop')) {
            $show_publish = 0;
            for ($i = $start_prefecture; $i <= $max_taxonomy_num; $i++) {
                if ($show_publish < $max_publish) {
                    $posts_per_page = $max_publish - $show_publish; //1回に表示する数
                    $publish_num = prefecturesLoop($i, $posts_per_page, $shift); //この都道府県の投稿数
                    if ($i == $start_prefecture) {
                        $show_publish = $publish_num - $shift;
                        $shift = 0;
                    } else {
                        $show_publish += $publish_num;
                    }
                } else {
                    break;
                }
            }
        }
        if (function_exists('pagination')) {
            pagination($current_page, 5, $max_publish);
        }
        ?>

function.phpに記載するコード

タクソノミー別に記事がいくつあるか調べる関数

function listQuery($slug, $posts_per_page)
{
    $list_args = array(
        'post_type'      => 'prefectures',
        'tax_query' => array(
            array(
                'taxonomy' => 'prefectures',
                'field' => 'slug',
                'terms' => array($slug),
            )
        ),
        'posts_per_page' => $posts_per_page,
    );
    $query = new WP_Query($list_args);
    wp_reset_postdata();
    return $query;
}

指定のタクソノミーがついた記事の一部を取り出す関数

function prefecturesLoop($slug, $posts_per_page, $shift)
{
    switch ($slug) {
        case '1':
            $prefecture = "北海道";
            break;
        case '2':
            $prefecture = "青森県";
            break;
 〜省略〜
        case '46':
            $prefecture = "鹿児島県";
            break;
        case '47':
            $prefecture = "沖縄県";
            break;
        default:
            $prefecture = "";
            break;
    }
    $list_args = array(
        'post_type'      => 'prefectures',
        'tax_query' => array(
            array(
                'taxonomy' => 'prefectures',
                'field' => 'slug',
                'terms' => array($slug),
            )
        ),
        'posts_per_page' => $posts_per_page + $shift,
    );

    $list_query = new WP_Query($list_args);

    $current_post = $list_query->post_count;

    if ($list_query->have_posts()) : //投稿が存在するものに限る。
        echo '<h2>' . $prefecture . '</h2>';
        $count = 0;
        while ($list_query->have_posts()) : $list_query->the_post();
            $count++;
            if ($count > $shift) {
               echo '<div>
                <div>
                    <h5>
                    <a href=' . get_the_permalink() . '>' . get_the_title() . '</a>
                    </h5>
                    <p>' . get_the_content() . '</p>
                    <a
                        href=' . get_the_permalink() . '
                        >記事を読む</a
                    >
                </div>
              </div>';
            }
        endwhile;
    endif;
    wp_reset_postdata();
    return $current_post;
}

ページネーション

【WordPress】ページネーションを作成する
こちらに記載しております。

注意

こちらの実装方法では、複数のタクソノミーを記事につけた際、ページャーの数が足りないというバグが発生します。

記事に複数のタクソノミーをつけたい場合には、ページャーの

 $full_page = ceil(wp_count_posts('introduction')->publish / $max_publish);

この部分をカスタマイズしてください。

コメント

タイトルとURLをコピーしました