BLOG

【これは予想外w】WordPressでカテゴリーを分岐させた時の罠…

どうも。お盆休みに遠征してライトトラップでクワガタムシを採集したかわゐです。

クワガタムシ採集で遠征するのは2年ぶり。初めて遠征したときは、「ヒメオオクワガタ」なるクワガタムシをターゲットにしていました。

このクワガタ、生息条件が限られすぎていて、プロでも初めての採集に数年かかると言われるほど、採集難易度が高いクワガタムシです。

そんなクワガタムシを、採集歴ド素人の私、なんとたったの2日で捕まえました(笑)

※ かわゐのクワガタ飼育歴は24年くらいですが、採集歴は4年ほどしかありません。

めっちゃ感動したんですけど、その話をすると3時間は話してしまうので、ここら辺でやめときます。笑

今年度の採集の話は、どこかでお話するかも知れません。笑

さて前置きが段々クワガタムシに支配されつつありますが、本題へ。今回は、WordPressのカテゴリー周りに関するお話です。

WordPress関連の制作をするときは、記事一覧ページはarchive.php、投稿ページはsingle.php、カテゴリーページはcategory.phpで出し分けているかと思います。

大体はこれで何とかなると思うのですが、全くもって何ともならない事態に遭遇しました。

それをかわゐはどのように解決していったのか。そして、今年度行った採集の話はきちんと伏線回収されるのか…。

続きが気になってきたので、そろそろいってみよ~

カテゴリーページ作成時のトラップ…

冒頭で少し触れましたが、今回起こった事態について触れていきます。

カテゴリーの出し分け

サイドバーなどで該当のカテゴリーを選択すると、そのカテゴリーだけの一覧ページが出てくる…。

これが category.php の役割です。

しかし今回は、少し特殊なケースに遭遇しました。

特定のカテゴリー群はひとまとめにして、残りを category.php で出力する

解決方法がわかった今でこそ納得できますが、当時の私は「???」でした。

カテゴリーページを作成していく

特定のカテゴリー群」ということに注目した私は、さまざま考えうる方法で解決していくことにしました。

 固定ページで作成か…?

サイドバーの設定で「exclude」を使って、特定のカテゴリー群を省き、特定のカテゴリー群だけ固定ページで作成してみようと思いました。

// sidebar.php の一部(改変あり)

<?php
    $args = array(
        'posts_per_page' => 5,
        'order' => 'DESC',
        'exclude' => '1, 2'
    );
    $categories = get_categories($args);
    foreach ( $categories as $category ) {
        $cat_id = $category->cat_ID;
        $cat_link = get_category_link($cat_id);
        echo '<li><a href="' . $cat_link . '">' . $category->name . '</a></li>';
    }
?>

これで「特定のカテゴリー群」を省くことができました。不本意ですが、「特定のカテゴリー群」については別のリストを作成して表示させました。

<li>
    <a href="<?php echo esc_url( home_url('/XXX') ); ?>">カテゴリー</a>
</li>

「home_url()」にスラッグを記載することで完成です。

固定ページじゃだめなんだわw

category.phpとpage-XX.phpでそれぞれ出し分けることには成功しましたが、そう簡単に事態は収束しません。

ページネーションを作成していた時のことです。

「あれ…カテゴリーは出てくんのに、固定の方出てこんやん…。」

ということで様々ググった結果、以下のコードに行きつきます。

// page-XX.php の一部(改変あり)

<div class="post">
    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $the_query = new WP_Query( array(
        'posts_per_page' => X, // 表示する投稿数を制限
        'paged' => $paged,
        'post_type' => 'post',
        'category_name' => 'slug01, slug02', // ローカルと本番に対応できる。
        'orderby' => 'date',
        'order' => 'DESC',
        'post_status' => 'publish',
    ) );
    if ($the_query->have_posts()) :?>
    <article>
        <?php while ($the_query->have_posts()) : $the_query->the_post();?>
        <a href="<?php the_permalink(); ?>">
            <?php
                $cat = get_the_category();
                $cat = $cat[0];
            ?>
            <time datetime="<?php the_time('Y-m-d'); ?>"><?php the_time('Y/m/d') ?></time>
            <p class="category"><?php echo get_cat_name($cat->term_id); ?></p>
            <p class="text"><?php the_title(); ?></p>
        </a>
        <?php endwhile; ?>
    </article>
    <?php endif; ?>
</div>

// page-XX.php用のページネーション(改変あり)

<div class="pagination">
    <div class="content">
    <?php
        if ($the_query->max_num_pages > 1) {
            echo paginate_links(array(
                'base' => get_pagenum_link(1) . '%_%',
                'format' => 'page/%#%/',
                'current' => max(1, $paged),
                'total' => $the_query->max_num_pages, // WP_Query使用のため$the_queryを使う。
                'end_size' => 3,
                'mid_size' => 3,
                'prev_text' => '',
                'next_text' => '',
                'type' => 'list',
            ));
        }
        wp_reset_postdata(); // WP_Query使用のため忘れずに記載する。
    ?>
    </div>
</div>

WP_Queryを使ってクエリを変更しています。

一般的なページネーションでは、「‘total’ => $wp_query->max_num_pages,」を使って表示しています。

ですが、今回はクエリを変更したので…

‘total’ => $the_query->max_num_pages,」にすることでページネーションを表示させることができる…。

と思っていたのか?(某伝説のスーパーサイヤ人風)

これで表示できたらよかったのですが、まさかの表示できませんでした

なすすべをなくした私。起死回生の一手で逆転はできるのか…。

そもそも固定ページじゃなくてよくね?

ググっている中で、似たような問題に遭遇している記事を発見しました。

はじめはその記事をみても

「同じやつやん」

と思っていたのですが、よくよく記事の内容をみると…

category-slug.phpにてページネーションを…」

という文字を発見。

そして私が作成していたのは「page-XX.php」です。

そういうことか!

わざわざ固定ページに分けなくても、category-slug.phpにすればよかっただけの話でした。

最終的に解決したコードは以下の通りです。

// category-slug.phpの一部(改変あり)
<div>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <article>
        <a href="<?php the_permalink(); ?>">
            <?php
                $cat = get_the_category();
                $cat = $cat[0];
            ?>
            <time datetime="<?php the_time('Y-m-d'); ?>"><?php the_time('Y/m/d') ?></time>
            <p class="category"><?php echo get_cat_name($cat->term_id); ?></p>
            <p class="text"><?php the_title(); ?></p>
        </a>
    </article>
    <?php endwhile; ?>
    <?php endif; ?>
</div>

// category-slug.phpのページネーション(改変あり)

<div class="pagination">
    <div class="content">
        <?php
            global $wp_query;
            $bignum = 999999999;
            if ( $wp_query->max_num_pages <= 1 )
            return;
            echo paginate_links( array(
            'base'         => str_replace( $bignum, '%#%', esc_url( get_pagenum_link($bignum) ) ),
            'format'       => '',
            'current'      => max( 1, get_query_var('paged') ),
            'total'        => $wp_query->max_num_pages,
            'prev_text'    => '',
            'next_text'    => '',
            'type'         => 'list',
            'end_size'     => 5,
            'mid_size'     => 5
            ) );
        ?>
    </div>
</div>

category.phpではページネーションが出力されているので、同じ属性のcategory-slug.phpもうまく出力されました。

めちゃめちゃ悩んでいた分、自力で解決できた時の達成感が半端なかったです。

無事に解決ができたということで、冒頭の伏線も回収しておきましょう。

今年度はオオクワガタを狙っていました。が、やはりオオクワガタ。一筋縄では行きませんでした。

少年の夢、ライトトラップをつかってみても全く歯が立ちません。クヌギの雑木林も調査してみましたが、ダメでした…。

ヒメオオクワガタの奇跡はそうそう起こるもんじゃありませんね(笑)

来年は他に目をつけている場所を探してみます。Youtubeとかしてみようかな。笑

ご期待いただけると嬉しいです。

カテゴリーページの分岐で学んだこと

ということで、今回はカテゴリー出し分け時のハプニングについて記事にしました。

今回起こった事態を振り返って思ったのは「当時の考えに固執してはいけない」ということです。

悩んでいたときは「固定ページで出力させる」ことに意識を向けすぎていましたからね。

ですが、少し視点を変えることで、同じカテゴリーの属性で解決ができました

解決するときに思っていた「そもそも…この必要があるのか?」という視点を、これからも大事にしていきたいと思います。

クワガタの飼育や採集でも、ね。

無事に伏線回収も済ませたということで、おあとがよろしいようで。

今回はこの辺りで締めくくりましょう。もし他にも素晴らしい解決法があったら、ご教授ください。それでは!

【参考記事】

WordPressのメインループの内容を書き換える方法|HP Code
固定ページに投稿一覧とページネーションを設置する、3分で|しょーごログ
wordpress固定ページでループとページネーション|アトリエロワ
固定ページでpaginationがうまく表示できない場合の対処方法|ナオユネット
WordPress固定ページでのページネーションで2ページ目以降が404になる|なないろ研究所
複数カテゴリーの一覧のページネーション

WEBデザイナー かわゐ
著者.
WEBデザイナー かわゐ
役職.
WEBデザイナー
資格.
ITパスポート, 世界遺産検定3級

フロントエンドエンジニア歴4年目。「人生は経験だ」と思い、前職は宮古島に就職。しかしクワガタムシがいないのと台風の勢力が化け物過ぎたのとで、大阪へ避難。避難前にリースに応募して入社。入社後はWordPressやECサイトの構築を担当。クワガタに命を捧げるクワガタ系エンジニア。