
WordPress 3分間フッキングシリーズについて
こんにちは!埼玉県川越市を拠点に活動するWordPressエンジニアです。「WordPress 3分間フッキング」シリーズでは、お料理番組「3分間クッキング」のように、WordPressの「フック」機能を使ったカスタマイズ方法を、短時間で理解・実装できるように解説しています。
プラグインをインストールせずに、数行のコードで便利な機能を追加できるのがWordPressフックの魅力です。今回は投稿一覧から「未分類」カテゴリーを非表示にする方法を紹介します!
カテゴリー除外の目的と概要
WordPressのホームページや投稿一覧ページには、デフォルトでは全てのカテゴリーの投稿が表示されます。しかし、「未分類」カテゴリーなど、訪問者に見せたくないカテゴリーがある場合もあるでしょう。
例えば、以下のような状況で特定カテゴリーを除外すると便利です:
- 「未分類」カテゴリーを非表示にして、きちんとカテゴリー分けされた投稿だけを表示したい
- 「下書き」など、作業中の投稿をまとめているカテゴリーを公開サイトには表示したくない
- 特定のカテゴリーだけを別のページで紹介し、メインページには表示したくない
- サイト訪問者の関心に合わせて、投稿一覧の表示内容を最適化したい
WordPress の「pre_get_posts」フックを使えば、プラグインを使わずに数行のコードで特定カテゴリーを除外できます。投稿一覧のクエリを実行する前に条件を追加することで、表示内容をカスタマイズします。
カテゴリー除外のためのフックコード
それでは、コードを見てみましょう:
1 2 3 4 5 6 7 8 |
add_action('pre_get_posts', 'wp3min_exclude_uncategorized'); function wp3min_exclude_uncategorized($query) { // 管理画面でなく、メインクエリであり、かつホームページ(投稿一覧)の場合 if (!is_admin() && $query->is_main_query() && $query->is_home()) { // 'uncategorized' カテゴリーを除外する $query->set('category__not_in', array(get_cat_ID('uncategorized'))); } } |
このコードをfunctions.phpに追加するだけで、ホームページ(投稿一覧)から「未分類」カテゴリーの投稿が非表示になります。シンプルながら、とても実用的な機能です。

フックコードの詳細解説
上記のコードを詳しく見ていきましょう。
1. アクションフックの登録
1 |
add_action('pre_get_posts', 'wp3min_exclude_uncategorized'); |
ここでは「pre_get_posts」というアクションフックに関数を登録しています。このフックは、WordPressが投稿を取得するためのクエリを実行する直前に発動します。つまり、データベースからどの投稿を取得するか決まる前に条件を変更できるタイミングです。
2. コールバック関数の定義
1 2 3 |
function wp3min_exclude_uncategorized($query) { // 処理内容 } |
フックの処理を行う関数を定義しています。「$query」パラメータには、WordPressが現在構築中のクエリが参照渡しされます。この参照を通じてクエリを修正できます。
3. 条件チェック
1 2 3 |
if (!is_admin() && $query->is_main_query() && $query->is_home()) { // 条件を満たす場合の処理 } |
これは非常に重要な条件チェックです。3つの条件を確認しています:
- !is_admin() – 管理画面でない場合のみ実行(管理画面の投稿一覧には影響しない)
- $query->is_main_query() – メインクエリの場合のみ実行(ウィジェットやサブクエリには影響しない)
- $query->is_home() – ホームページ(投稿一覧)の場合のみ実行(アーカイブやシングルページには影響しない)
この条件チェックは非常に重要です。これを省略すると、サイト内の全てのクエリに影響し、ウィジェットやナビゲーションなど予期しない場所でも未分類カテゴリーが除外されてしまいます。
4. カテゴリー除外の設定
1 |
$query->set('category__not_in', array(get_cat_ID('uncategorized'))); |
条件を満たした場合、クエリに「category__not_in」パラメータを設定しています。
- $query->set() – クエリパラメータを設定するメソッド
- ‘category__not_in’ – 指定したカテゴリーIDを除外するパラメータ
- get_cat_ID(‘uncategorized’) – カテゴリー名からIDを取得する関数(通常、「未分類」カテゴリーのIDは「1」)
この処理により、「未分類」カテゴリーに属する投稿がホームページの投稿一覧から除外されるようになります。
実装手順
では、このカスタマイズを実際にサイトに追加する方法を見ていきましょう:
- WordPressの管理画面にログインします
- 「外観」→「テーマエディター」(または「テーマファイルエディター」)を開きます
- 子テーマを使用している場合は、子テーマを選択してください
- テーマエディターが表示されない場合は、プラグインで無効化されているか、権限がない可能性があります
- 右側のファイル一覧から「functions.php」を選択します
- ファイルの末尾(PHPの終了タグ「?>」がある場合はその前)に、先に紹介したコードを貼り付けます
- 「ファイルを更新」ボタンをクリックします
- ホームページを表示して、「未分類」カテゴリーの投稿が表示されなくなったことを確認します
functions.phpの編集には注意が必要です。構文エラーがあるとサイト全体が表示されなくなる可能性があります。編集前にバックアップを取っておくか、FTPアクセスができるようにしておきましょう。
カスタマイズのバリエーション
基本的なカテゴリー除外の仕組みを理解したところで、様々なバリエーションと応用例を見ていきましょう。
1. 複数のカテゴリーを除外する
1 2 3 4 5 6 7 8 9 10 11 12 |
add_action('pre_get_posts', 'wp3min_exclude_multiple_cats'); function wp3min_exclude_multiple_cats($query) { if (!is_admin() && $query->is_main_query() && $query->is_home()) { // 複数カテゴリーを除外 $exclude_cats = array( get_cat_ID('未分類'), get_cat_ID('下書き'), get_cat_ID('非公開') ); $query->set('category__not_in', $exclude_cats); } } |
配列に複数のカテゴリーIDを指定することで、複数のカテゴリーを一度に除外できます。
2. カテゴリースラッグで指定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
add_action('pre_get_posts', 'wp3min_exclude_by_slug'); function wp3min_exclude_by_slug($query) { if (!is_admin() && $query->is_main_query() && $query->is_home()) { // カテゴリースラッグから除外する場合 $cats = get_categories(array( 'slug' => array('uncategorized', 'drafts') )); $exclude_ids = array(); foreach ($cats as $cat) { $exclude_ids[] = $cat->term_id; } $query->set('category__not_in', $exclude_ids); } } |
この方法では、カテゴリー名ではなくスラッグを使って除外するカテゴリーを指定しています。サイト間での移行や多言語サイトの場合に便利です。
3. アーカイブページや検索結果でも除外する
1 2 3 4 5 6 7 8 9 |
add_action('pre_get_posts', 'wp3min_exclude_for_all_listings'); function wp3min_exclude_for_all_listings($query) { if (!is_admin() && $query->is_main_query()) { // ホーム、アーカイブ、検索結果のすべてで適用 if ($query->is_home() || $query->is_archive() || $query->is_search()) { $query->set('category__not_in', array(get_cat_ID('未分類'))); } } } |
条件を拡張することで、ホームページだけでなく、アーカイブページや検索結果でも特定カテゴリーを除外できます。
4. カスタム投稿タイプと組み合わせる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
add_action('pre_get_posts', 'wp3min_custom_post_types_filter'); function wp3min_custom_post_types_filter($query) { if (!is_admin() && $query->is_main_query()) { // カスタム投稿タイプ「product」のアーカイブページで // カスタムタクソノミー「product_cat」の「sale」を除外 if ($query->is_post_type_archive('product')) { $tax_query = array( array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => 'sale', 'operator' => 'NOT IN', ), ); $query->set('tax_query', $tax_query); } } } |
カスタム投稿タイプとカスタムタクソノミーを使ったサイトでも、同様の方法でフィルタリングできます。
除外方法 | メリット | デメリット |
---|---|---|
カテゴリーID指定 | 処理が最も高速 | サイト移行時にIDが変わる可能性 |
カテゴリー名指定 | わかりやすく直感的 | 多言語サイトでは名前が異なる可能性 |
スラッグ指定 | サイト間の移行に強い | 処理が少し複雑になる |
タクソノミークエリ | 複雑な条件設定が可能 | 最も処理が重くなる可能性 |
応用例:ユーザーによって表示を変える
より高度な使い方として、ログインユーザーによって表示するカテゴリーを変更することもできます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
add_action('pre_get_posts', 'wp3min_user_based_content'); function wp3min_user_based_content($query) { if (!is_admin() && $query->is_main_query() && $query->is_home()) { // ログインしていないユーザーには「メンバー限定」カテゴリーを表示しない if (!is_user_logged_in()) { $query->set('category__not_in', array(get_cat_ID('メンバー限定'))); } // 一般ユーザー(購読者)には「プレミアム」カテゴリーを表示しない elseif (current_user_can('subscriber') && !current_user_can('editor')) { $query->set('category__not_in', array(get_cat_ID('プレミアム'))); } // 管理者や編集者にはすべてのカテゴリーを表示 } } |
この方法を使えば、会員制サイトやサブスクリプションモデルのサイトで、ユーザーのランクやステータスに応じたコンテンツを表示できます。
パフォーマンスへの配慮
pre_get_posts フックはWordPressのクエリ実行前に処理されるため、パフォーマンスへの影響は最小限ですが、次の点に注意することでさらに最適化できます:
- カテゴリーIDを直接指定する: get_cat_ID()関数の呼び出しを避けることで、パフォーマンスが向上します。
12// より高速な方法(IDを直接指定)$query->set('category__not_in', array(1)); // 未分類カテゴリーのIDは通常1 - 必要な条件のみに制限する: 不要な条件チェックを減らすことで、処理速度が向上します。
- キャッシュプラグインとの併用: ページキャッシュを使うことで、動的な除外処理の負荷を軽減できます。
まとめ
「pre_get_posts」フックを使った特定カテゴリーの除外方法を紹介しました。このテクニックを使うことで、以下のようなことが可能になります:
- 未分類カテゴリーを表示から除外し、サイトの見た目を整理する
- 特定の用途のカテゴリー(下書き、内部用など)を一般公開ページから隠す
- ユーザーに応じたコンテンツフィルタリングを実装する
- サイト全体の一貫性と専門性を高める
WordPressのフックを理解して活用することで、プラグインをインストールせずに様々なカスタマイズができます。これにより、サイトのパフォーマンスを維持しながら、必要な機能だけを追加できるのです。
埼玉県川越市を拠点とする私たちは、このようなWordPressのカスタマイズ技術を活用して、お客様のサイトを最適化しています。細かなカスタマイズの積み重ねが、使いやすく効果的なWebサイトを生み出します。
よくある質問
Q: このカスタマイズはプラグインと競合しませんか?
A: 一般的なプラグインと競合することはほとんどありませんが、投稿一覧を大幅に改変するプラグインとは競合する可能性があります。その場合は、フックの優先度(第3引数)を調整することで解決できることが多いです。
Q: カテゴリーだけでなく、タグで除外することもできますか?
A: はい、可能です。以下のようにクエリパラメータを設定します:
1 2 |
// 特定のタグを除外する $query->set('tag__not_in', array(get_tag_ID('非公開'))); |
Q: 管理画面の投稿一覧でも同じように除外できますか?
A: 可能ですが、管理業務に影響を与える可能性があるため注意が必要です。管理画面での適用は以下のように行えます:
1 2 3 4 5 6 7 8 9 |
add_action('pre_get_posts', 'wp3min_admin_posts_filter'); function wp3min_admin_posts_filter($query) { // 管理画面の投稿一覧の場合 if (is_admin() && $query->is_main_query() && isset($_GET['post_type']) && $_GET['post_type'] == 'post') { // ここでクエリを変更 $query->set('category__not_in', array(get_cat_ID('アーカイブ'))); } } |
Q: 特定のカテゴリー「だけ」を表示することもできますか?
A: はい、「category__not_in」の代わりに「cat」パラメータを使用します:
1 2 |
// 「お知らせ」カテゴリーのIDが5の場合 $query->set('cat', 5); |
複数のカテゴリーを表示したい場合は「category__in」パラメータを使用できます。
WordPressサイトの機能追加やカスタマイズでお悩みの方は、WordPressカスタマイズ・プラグイン開発サービスをご利用ください。また、フックを使った高度なカスタマイズについてもっと知りたい方は、WordPress顧問エンジニアサービスで詳しくご相談いただけます。