メインループでの投稿一覧や wp_list_categories() によるカテゴリー一覧で特定のカテゴリーを除外したい場合、通常はカテゴリーID(数値)で指定することになりますが、今回はカテゴリースラッグを指定して特定のカテゴリーを除外する方法になります。
スラッグを指定してカテゴリーのオブジェクトを取得する関数 get_category_by_slug() を使って実現します。
カテゴリースラッグで除外したい場面と解決策
開発環境と本番環境のカテゴリーIDが異なる場合
開発環境で仮の投稿やカテゴリーを使っている場合は本番環境とはIDが異なってしまうかもしれません。その場合はスラッグによる除外指定のほうが便利なことがあります。
使用するカテゴリースラッグが決まっている場合
あらかじめ使うカテゴリーが決まっている場合、またはカテゴリースラッグが決まっている場合もスラッグでの除外を使いたいことがあります。
スラッグを元にカテゴリー情報を取得可能な get_category_by_slug()
関数get_category_by_slug()
を使うとスラッグを元に該当するカテゴリーの情報を取得できます。
つまり、除外するのに必要なIDが取得できるということです。
get_category_by_slug( 'カテゴリースラッグ' );
参考リンク
WordPress Codex – get_category_by_slug()
WordPress.org – get_category_by_slug()
メインループの投稿一覧から除外する場合
メインループの操作を行う場合、qurey_posts()
での操作は推奨されていません。
そのため、アクションフックpre_get_posts
によるクエリ操作で実現します。
次の例は投稿一覧ページでの特定カテゴリーをスラッグで除外している一例です。
exampleというスラッグが付けられたカテゴリーを除外します。
functions.php で関数を定義してクエリ操作する
function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ) { return; } if ( $query->is_home() ) { $exclude_cat = get_category_by_slug( 'example' )->cat_ID; $query->set( 'cat', -$exclude_cat ); return; } } add_action( 'pre_get_posts', 'my_pre_get_posts' );
2~4行目:管理画面とメインクエリ以外では何もせず終了します。
5行目:条件分岐タグでクエリ操作を適用するページを絞り込んでいます。
6行目:exampleというスラッグを元に該当するカテゴリーのIDを取得して変数に格納。
7行目:6行目の変数に – を付けて除外指定する。
5行目の条件分岐タグを変更することで他のページにも対応できます。
参考リンク
WordPress Codex – 条件分岐タグ
WordPress Codex – pre_get_posts
WordPress.org – pre_get_posts
wp_list_categories() によるカテゴリー一覧から除外する場合
カテゴリーの一覧を表示するwp_list_categories()
においてもget_category_by_slug()
で取得したIDを使って除外します。
example というスラッグを持つカテゴリーを除外する場合は次のようになります。
$exclude_cat = get_category_by_slug( 'example' )->cat_ID; $args = array( 'exclude' => $exclude_cat, ); wp_list_categories( $args );
固定ページの場合も同様にページスラッグで除外することができます。使う関数は異なりますがやっていることはほぼ同じです。以前の記事で紹介していますので参考にしてみてください。
参考リンク
WordPress Codex – wp_list_categories()
WordPress.org – wp_list_categories()