WordPressのトップページで特定カテゴリを除外、限定などフィルタして表示するカスタマイズ

公開日:2020/01/03 更新日:2020/01/03
WordPressのトップページで特定カテゴリを除外、限定などフィルタして表示するカスタマイズのサムネイル

はじめに

WordPressでブログを作成している場合、そのブログのトップページとして投稿ページを一覧表示している場合が多いと思います。また、多くのWordPressテーマのデフォルトでは投稿ページはカテゴリによらず全て記事一覧に含めていると思います。この記事では、投稿ページのカテゴリをフィルタして、特定のカテゴリの投稿ページを記事一覧から除外したり、逆に特定のカテゴリの投稿ページのみを記事一覧に含めるためのカスタマイズ方法をまとめます。非常に簡単です。

できるようになること

以下はこのサイトのトップページです。「Windows」というカテゴリに属する2つの投稿ページが一覧表示に含まれています。

wordpress-top-image-1.png

上記を以下のように一覧表示に含まれないようにフィルタします。

wordpress-top-filtered.png

前提と環境

この記事で説明する内容は、以下の環境になります。

  • WordPress バージョン5.3.2
特にプラグイン等のインストールは不要の作業になりますが、テーマファイルを編集する必要があります。バックアップを取ってから行う等十分に注意して作業を行ってください。 また、記事のタイトルでは「トップページ」と言っていますが、特にトップページに限定された話ではなくその他の固定ページ等でも使用できる方法になります。

一覧表示するカテゴリをフィルタする

まずはじめに、WordPressのトップページで投稿ページを一覧表示している部分のコードについて説明します。Wordpressのトップページで投稿ページを一覧表示している場合、おそらくほとんどのテーマでは以下のような記述で実現されています。以下はWordPressのデフォルトのテーマである「Twenty Ninteen」のトップページindex.phpの投稿ページ一覧を出力している部分です。

index.php
<main id="main" class="site-main">

    <?php
        if ( have_posts() ) {

            // Load posts loop.
            while ( have_posts() ) {
                the_post();
                get_template_part( 'template-parts/content/content' );
            }

            // Previous/next page navigation.
            twentynineteen_the_posts_navigation();

        } else {

            // If no content, include the "No posts found" template.
            get_template_part( 'template-parts/content/content', 'none' );

        }
    ?>
        
</main><!-- .site-main -->

テーマによってはトップページ用に使用しているファイル名がhome.phpであったり、top.phpである場合もあるので各自の環境で読み替えてください。

上記を以下のように変更することでカテゴリによるフィルタを実現できます。

index.php
<main id="main" class="site-main">

        <?php $query = new WP_Query( 'cat=10' ); ?> // これを追記
        <?php
        if ( $query->have_posts() ) { // ここを修正

            // Load posts loop.
            while ( $query->have_posts() ) { // ここを修正
                $query->the_post(); // ここを修正
                get_template_part( 'template-parts/content/content' );
            }

            // Previous/next page navigation.
            twentynineteen_the_posts_navigation();

        } else {

            // If no content, include the "No posts found" template.
            get_template_part( 'template-parts/content/content', 'none' );

        }
        ?>
        
</main><!-- .site-main -->

上記の中でカテゴリをフィルタするためのクエリを記述しているのが以下です。以下は具体的にはカテゴリのIDが10番かどうかをフィルタするためのクエリです。

index.php
<?php $query = new WP_Query( 'cat=10' ); ?>

そして上記のクエリを以下のようにhave_posts()the_post()に適用することでフィルタすることができます。

index.php
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
    $query->the_post();

このようにWP_Queryを使用してhave_posts()the_post()にフィルタを適用することでカテゴリをフィルタすることができます。上記の例では、カテゴリIDが10番の投稿のみ一覧表示されます。

カテゴリIDの確認方法

カテゴリIDを確認するには、WordPressの管理画面から「カテゴリー」のページにアクセスして、そこで各カテゴリ名の上にマウスカーソルを当てるだけで以下のようにブラウザの下部にそのカテゴリのURLが表示され、その中にある「tag_ID」を探します。以下の場合は「tag_ID=83」となっているので、「83」がそのカテゴリのカテゴリIDです。

check-tag-id.png

複数のカテゴリを指定したい場合

この場合は単純に以下のようにカンマ区切りで複数のカテゴリIDを指定するだけでOKです。

index.php
<?php $query = new WP_Query( 'cat=10,12,20' ); ?>

上記を使うとカテゴリIDが10,12,20の投稿ページのみが一覧表示されるようになります。

特定のカテゴリを除外したい場合

除外したい場合はカテゴリIDの前に-をつけて以下のようにします。

index.php
<?php $query = new WP_Query( 'cat=-10' ); ?>

上記を使うとカテゴリIDが10番の投稿ページ以外が全て一覧表示されます。 以下のように複数指定してももちろん大丈夫です。

index.php
<?php $query = new WP_Query( 'cat=-10,-12,-20' ); ?>

投稿者でフィルタしたり他のフィルタを適用したい場合

投稿者(author)でフィルタしたり、タグでフィルタしたりすることもできます。上記で説明したカテゴリ含むフィルタの書き方については、以下のリファレンスに詳しく記載されているので見てみてください。

wpdocs.osdn.jp

WP_Query は wp-includes/class-wp-query.php に定義されているクラスで、WordPress ブログへの複雑な投稿やページのリクエストを取り扱います。

have_posts()the_post()について詳しく知りたい方は以下にリファレンスを見てみてください。
wpdocs.osdn.jp

この関数は現在の WordPress クエリにループできる結果があるかどうかをチェックします。

まとめ

WordPressのトップページでカテゴリをフィルタして投稿ページを一覧表示するためのカスタマイズ方法をまとめました。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。