icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【WordPress】$_GETパラメータでtax_queryを切り替え、カスタムタクソノミ絞り込みを行う方法

更新: 2025/05/15 3615文字

今回はWordPressカスタマイズでよく使う(かもしれない)、カスタム投稿&カスタムタクソノミ話題です。お仕事でもつかったことがあるんですけど、『GETメソッドでパラメータ渡して、絞り込むカスタムタクソノミ(カテゴリーみたいなやつ)を切り替えられたら便利かな』というような発想でした。さっそくやり方を確認していきましょう。

カスタムタクソノミ切り替えて絞り込み機能を作る~下準備は?

カスタム投稿・カスタムタクソノミを使えるようにテーマ設定する

下準備として上記のコードをfunctons.php内に書きました。オブジェクト型になっていますが、中身はよくあるカスタム投稿追加のコードです。register_post_type(カスタム投稿タイプの登録)・register_taxonomy(カスタム投稿タイプのタクソノミ(カテゴリみたいなやつ・分類))が実行されます。

今回は投稿タイプ名foodinfo(labelが食べ物情報)と、foodinfoに対して割り当てられるfoodinfo-cat(これがタクソノミ・カテゴリ名)というのを設定しました。

作った投稿タイプfoodinfoのタクソノミ(foodinfo-cat)を設定し、テスト用の記事を作成する

カスタム投稿・カスタムタクソノミを使えるようにしたあとは、設定とテスト記事作成します。カスタムタクソノミ『foodinfo-cat』の設定は以下の通りです(name/slug)。わかりやすく食べ物にしました。

name slug
カレー curry
どんぶり don
麺類 men
寿司 sushi

あとは、設定したカスタムタクソノミごとにテスト記事を作っていきます。

任意の固定ページで、カスタム投稿一覧出力するパーツをロード(get_template_part)

準備はまだあります。archiveをそのまま使ってもいいんですけど、管理人は『特定の固定ページで、カスタム投稿アーカイブ用のパーツをロードする』という方法をとることにしました。以下のコードを、テーマのpage.phpに追加。the_content()の下に書いたので、本文の下にアーカイブが出ます。

<?php if(is_page(4582)){
  get_template_part('parts/customArchive');
}?>

is_page(4582)は、idが4582番の固定ページの場合』という意味で、この固定ページをカスタム投稿アーカイブ用にします。そこでテーマ内に作った『parts/customArchive.php』を、get_template_partでロードします。

(WPインストールディレクトリ内でやる場合)query_varsフックでパラメータ登録する

WordPressのインストールディレクトリ・テーマ内でやるとき、『urlパラメータを使おうとして$_GETからとってきたけど、その変数が空になっていた』みたいなことはなかったでしょうか。それはパラメータが登録されていないからです。例えば『https://〇〇〇.com?cat=☆☆』みたいなパラメータを使いたい場合、function.phpに以下のようなコードを書きます。

function set_query_vars_page( $query_vars ) {
    $query_vars[]= 'cat';
    return $query_vars;
}
add_filter('query_vars', 'set_query_vars_page');

query_varsフックをつかって『cat』というパラメータを使えるようにしました。

$_GETパラメータでtax_queryを切り替え、カスタムタクソノミ絞り込みを行うコード例

で、先ほど用意したparts/customArchive.phpの中身は、このような形になりました。

軽くポイント解説すると、まず『$terms =get_terms('foodinfo-cat');』でカスタムタクソノミ一覧とれるけど、オブジェクト階層が深いので、ループ回してarray_pushで$tarmArrにスラッグだけ入れて、$_GET['cat']がセットされてて、かつ$tarmArr内にその値がある場合に、tax_queryに渡す配列($taxQueryArgs)の中身が設定されるという形です。

$_GET['cat']が無い、あっても$tarmArr内にある値とマッチしない場合は、$taxQueryArgsは空なのでカスタムタクソノミ絞り込みが行われません。tax_queryを変数にしてるんですけど、中身が少しわかりやすいかなと思います。

あとはよくあるWordPressの記事出力コードですが、最近引用符でくくったのを連結するのがめんどいので、ヒアドキュメント型で書いています。

また、わかりやすく普通に書いていますけど、このコードも上記のカスタム投稿登録みたいに、オブジェクト型にして書くことができます(プロパティにセットして、インスタンス化しechoみたいな感じで)。

カスタムタクソノミ絞り込みあり/無し 表示例

では、さっそく表示確認をしてみましょう。まずはパラメータなしで一覧の固定ページにアクセスしてみます。 この状態では絞り込みがされず、全部の記事がでます。

『〇〇/cms/customarchive/?cat=men』にアクセスしたとき。麺類で絞り込みができてます。

『〇〇/cms/customarchive/?cat=don』にアクセスしたとき。どんぶり物がでてきました。

個別の投稿のテンプレートは、そのままテーマのsingle.phpを流用。重要ポイントですけど、カスタム投稿設定したばっかりでsingle.phpアクセスして404で記事が出ないみたいなことがあります。この場合は『パーマリンク設定→パーマリンク構造で、一回更新かけてやると、カスタム投稿にもパーマリンクが反映される』みたいな形で解決できることがあります。

あとがき・まとめ

  • WordPressのカスタムタクソノミでも、$_GETパラメータで切り替えて絞り込みを行うことができる
  • タクソノミのスラッグだけの配列作っておくと、判定がシンプルになった
  • WP_queryに渡す変数にtax_queryそのまま渡すと階層が深くなるが、変数にして分離しておくとわかりやすいかも

まとめると、こんなところでしょうか。カスタムタクソノミ絞り込みといいつつ、WordPressのいろんなテクニックが満載になってしまった記事でした。


【カテゴリ】- WordPressファンクションetc
【タグ】-

関連記事