楽天セール開催中!ポイント最大11倍! セール会場へ

WordPress│投稿ページ(新着記事)の表示で一部のカテゴリーを除外する方法

設定 → 表示設定で指定した「投稿ページ」、または最新の投稿を表示するトップページのメイン一覧から、特定のカテゴリー・タグを除外します。カテゴリーとタグの例を別々の同名関数で貼ると重複定義になるため、1つの関数にまとめています。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

除外するIDを設定する

子テーマのfunctions.phpなどへ、次のコードを一度だけ追加します。配列内のIDを自分のサイトの値に変更し、カテゴリーだけを使う場合はtag_idsを空のarray()にします。既存のPHPタグ内へ貼る場合は開始タグを追加しません。優先度20は、優先度10で動くSWELL 2.19.0の標準除外処理より後に実行するための指定です。SWELLの表示設定にある除外IDを引き継いでから、この記事のIDを追加します。

function waza_exclude_terms_from_posts_page($query) {
    if (is_admin() || !$query->is_main_query() || !$query->is_home()) {
        return;
    }
    // 自分のサイトのIDに変更。不要な方は array() にする。
    $category_ids = array(36, 7);
    $tag_ids = array(12, 40);
    foreach (array('category__not_in' => $category_ids, 'tag__not_in' => $tag_ids) as $key => $ids) {
        $existing = (array) $query->get($key);
        $query->set($key, array_values(array_unique(array_filter(array_map('absint', array_merge($existing, $ids))))));
    }
}
// SWELLの標準除外処理(優先度10)の後に条件を追加します。
add_action('pre_get_posts', 'waza_exclude_terms_from_posts_page', 20);

除外される範囲

指定カテゴリー、または指定タグを持つ記事が一覧から除外されます。カテゴリーの子カテゴリーはIDへ明示的に追加してください。管理画面、検索結果、カテゴリー一覧、記事本文内の別クエリには適用しません。投稿を削除・非公開にするコードではないため、記事の直接URLは引き続き閲覧できます。

クエリの取得前に条件を追加するので、その条件に応じたページ数でページ送りされます。実WordPress 7.1.2で標準の投稿フィードを確認したところ、is_feedはtrue、is_homeはfalseになり、このコードの除外対象にはなりませんでした。固定フロントページも対象外です。フィードにも同じ除外を適用したい場合は、フィードの種類とコメントフィードを区別した別の条件設計が必要です。

確認するURLと表示場所

開く場所掲載コードの対象
最新投稿のトップ/表示設定の投稿ページメインの記事一覧を除外する
固定ページを指定したトップ対象外
標準の投稿フィード今回の実環境では対象外
検索結果・カテゴリー一覧対象外
本文中の投稿リスト・独自WP_Queryメインクエリではないため対象外

通常の投稿と除外対象の投稿を用意して、投稿ページの1ページ目と2ページ目を確認します。「新着記事」という見た目だけで判断せず、表示設定で指定した投稿ページか、固定ページ内の投稿リストかを区別してください。対象外のカテゴリーも一緒に付けた投稿でも、除外IDのいずれかを持てば一覧から外れます。子カテゴリーだけを持つ投稿も外したい場合は、その子のIDを配列へ追加します。

ページ送りを操作して除外範囲を確かめる

確認する表示今回の結果
投稿一覧の1ページ目通常の投稿2件
投稿一覧の2ページ目通常の投稿1件
同じ検索語の検索結果除外対象も含む5件
除外した記事の直接URL記事本文を表示
固定フロントページ固定ページの本文を維持

通常の投稿3件、除外カテゴリーの投稿1件、除外タグの投稿1件を用意し、投稿一覧を1ページ2件で検証しました。

PCとMobile表示のページ番号をEnterキーで操作し、除外後の3記事が2ページに分かれ、重複も欠落もないことを確認しました。

トップページの投稿スライダーやサイドバーの新着記事は、メインクエリーの投稿一覧とは別です。このコードでそれらの表示までは除外されません。

適用後は投稿一覧だけでなく検索結果と記事の直接URLも開き、公開範囲を変える処理と混同しないように確認します。

確認と戻し方

他のカスタマイズが優先度20以降で同じ条件を上書きする場合は、併用状態で確認してください。今回のフック登録と関数を外すと除外処理を停止できます。記事や分類のデータは変更しません。

参照:WP_Queryのカテゴリー・タグ条件。管理画面の選択式フィルターはカスタムタクソノミーで絞り込む例を参照してください。

ほかの一覧用フィルターと併用する

このコードは実行時点のcategory__not_inとtag__not_inへIDを追加します。

隔離環境では、優先度15の処理が設定した除外IDも保持し、それぞれの条件に該当する記事を除外できました。

後から動く処理が同じ値を空の配列などで置き換えると、ここで追加した除外も失われます。

優先度30で両方を空にする処理を加えると除外対象が再表示され、その処理を外すと除外結果へ戻ることを実クエリで確認しました。

導入先のfunctions.phpやスニペットで、pre_get_postsから同じキーを書き換える処理を確認してください。

実行順序を変えるだけで決めず、最後に渡る除外IDと投稿ページの結果が一致するかを比べます。

別サイトの検索プラグインやキャッシュとの併用は、その構成で検証が必要です。

よくある質問:WordPressの新着記事一覧から一部のカテゴリーを除外するとき

このコードは、どこの一覧から記事を除外しますか?

記事では、設定 → 表示設定で指定した「投稿ページ」、または最新の投稿を表示するトップページのメイン一覧から、特定のカテゴリー・タグを除外します。固定フロントページは対象外です。

除外する対象のIDは、どう設定しますか?

記事では、子テーマのfunctions.phpなどへコードを一度だけ追加し、配列内のIDを自分のサイトの値に変更します。カテゴリーだけを使う場合は、tag_idsを空のarray()にします。既存のPHPタグ内へ貼る場合は、開始タグを追加しません。

子カテゴリーの記事も除外されますか?

記事では、カテゴリーの子カテゴリーはIDへ明示的に追加するとしています。

検索結果やカテゴリー一覧からも消えますか?

消えません。記事では、管理画面、検索結果、カテゴリー一覧、記事本文内の別クエリには適用しないとしています。トップページの投稿スライダーやサイドバーの新着記事もメインクエリーの投稿一覧とは別で、このコードではそれらの表示までは除外されません。

除外した記事は、非公開になりますか?

なりません。記事では、投稿を削除・非公開にするコードではないため、記事の直接URLは引き続き閲覧できるとしています。適用後は、投稿一覧だけでなく検索結果と記事の直接URLも開き、公開範囲を変える処理と混同しないように確認します。

優先度20とは、何のための指定ですか?

記事では、優先度10で動くSWELL 2.19.0の標準除外処理より後に実行するための指定です。SWELLの表示設定にある除外IDを引き継いでから、この記事のIDを追加します。

ほかの処理と併用して、除外が効かなくなることはありますか?

あります。記事では、後から動く処理が同じ値を空の配列などで置き換えると、ここで追加した除外も失われるとしています。優先度30で両方を空にする処理を加えると除外対象が再表示されることを、実クエリで確認したと説明しています。導入先のfunctions.phpやスニペットで、pre_get_postsから同じキーを書き換える処理を確認してください。

元に戻したいときは、どうしますか?

記事では、今回のフック登録と関数を外すと除外処理を停止できます。記事や分類のデータは変更しません。なお、別サイトの検索プラグインやキャッシュとの併用は、その構成で検証が必要です。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次