設定 → 表示設定で指定した「投稿ページ」、または最新の投稿を表示するトップページのメイン一覧から、特定のカテゴリー・タグを除外します。カテゴリーとタグの例を別々の同名関数で貼ると重複定義になるため、1つの関数にまとめています。
除外する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から同じキーを書き換える処理を確認してください。
元に戻したいときは、どうしますか?
記事では、今回のフック登録と関数を外すと除外処理を停止できます。記事や分類のデータは変更しません。なお、別サイトの検索プラグインやキャッシュとの併用は、その構成で検証が必要です。



