複数のカテゴリ(ターム)に属する投稿を抽出してアーカイブに表示する方法

wordpress

たとえば、全国の飲食店を紹介するサイトをWordPressで構築するとします。

そのときに、カテゴリに都道府県を作成し、カスタムタクソノミーで料理のジャンル(ラーメンとか焼き肉とか)のタクソノミーを作ったとします。
で、投稿(カスタム投稿タイプでもOK)で飲食店情報を登録していきます。
カテゴリで都道府県を選択して、カスタムタクソノミーでその店のジャンルを選択して登録します。

こうやっていくと、
たとえば、東京都の飲食店一覧は、カテゴリーアーカイブで表示できますし、
ラーメン店一覧は、カスタムタクソノミーのアーカイブで表示できるのですが、

じゃあ、東京都のラーメン店一覧など、複数のタクソノミーに属した投稿一覧はどうやって表示すればいいの?ってことです。

ちょっと分かりづらいので、食べログで説明すると、

たとえば、東京都の飲食店一覧のこのページ
http://tabelog.com/tokyo/

に、料理ジャンルからお店を探すってメニューがあって、ためしに、『焼肉』をクリックすると、東京都の焼き肉屋さん一覧が出てきますよね。
これはつまり、東京都と焼肉というふたつのカテゴリで絞り込んだ結果を表示してるってことですよね。

こういうのをWordPressで構築するにはどうすればいいかってのをやります。

複数カテゴリ(ターム)の抽出には、query_postsを使います。

例として、都道府県をカテゴリーで作成し、カスタムタクソノミーでジャンルを作成します。
東京の焼き肉屋さんで抽出するとします。

<?php 
//query_posts用の配列を作成
$list = array( 
'post_type' => array('post'),//投稿タイプを 
'showposts' => 5,//表示件数 
'category_name' => tokyo,//スラッグで 
'genre'=> yakiniku,//スラッグで ); 
?> 
<?php query_posts($list); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> //いつものループ

 

複数カテゴリ(ターム)の抽出には、query_postsを使います。

post_typeには、投稿タイプを指定します。
投稿の場合は、postですし、カスタム投稿タイプの場合は、カスタム投稿タイプの名前を入れればOKです。

showpostsでは、表示件数を指定します。
query_postsでのページングがどうも僕にはうまくできないので、9999とでも入れておけば、全部表示できます^^;

category_nameには、カテゴリーのスラッグを入力します。
この場合は、東京なので、tokyoというスラッグを入れてます。
ちなみに、スラッグに、’tokyo’って、シングルクォーテーションって必要でしたっけ?(文法あやふや。)
もし、エラー出たら、’tokyo’に修正してみてください。
テスト面倒なんでしてません。。。

‘genre’は、カスタムタクソノミー名です。
こちらもスラッグで指定します。
こっちもシングルクォーテーション必要なら入れてください。

本題はここから

上に書いたようなことなら、けっこう色々なサイトで説明してくれていて、WordPressのテンプレートタグ/query postsの解説ページにも載ってます。

でもですね。

上記コードだと、プログラム内に、tokyoとかyakinikuとかターム名が入っちゃっているので、じゃあ実際に、全国の飲食店紹介サイトに実装したいってなった場合に、どうすんの?ってなりますよね。
まさか、都道府県✖料理ジャンル名の組み合わせ毎にテンプレートを作成して分岐させるわけにもいきません。

ターム名は変数で指定したい

<?php 
//query_posts用の配列を作成 
$list = array( 
'post_type' => array('post'), 
'showposts' => 5, 
'category_name' => $area, 'genre'=> $cooking_genre, ); 
?>

できれば、こんな感じで、ターム名は変数で指定するようにしたいですね。
でもって、アーカイブページにアクセスする前に、なんらかの方法でデータを渡して、変数にターム名を入力したいところです。

そうすれば、アーカイブテンプレートひとつで、複数カテゴリの絞り込み結果を表示するテンプレートが作れます。

ターム名に変数を使った、複数カテゴリに属する投稿の絞り込み表示を実装するよ

ちなみに今回作成しているテンプレートは、category.phpです。
カテゴリーに都道府県を作成しているので、ベースは都道府県ごとの投稿一覧の表示で、上記で紹介した食べログのように、リンクをクリックすることで、料理ジャンル毎に絞り込めるという機能を作ります。

URLにパラメーターをつけてリンクする。

http://hogehoge.com/tokyo/
たとえば、上記URLで、東京の飲食店一覧を表示しているとします。

で、東京都内の焼き肉屋さんに絞り込みたいという場合に、下記URLでリンクします。
http://hogehoge.com/tokyo/?genre=”yakiniku”

ラーメンで絞り込みたいという場合は、
http://hogehoge.com/tokyo/?genre=”ramen”

とこんな感じで、URLにパラメーターをつけて、『焼肉で絞り込む』『ラーメンで絞り込む』とかのリンクを作って、上記URLでリンクします。

パラメーターの値をGETする。

で、category.php内で、上記のパラメーターの値をGETしてやります。

URLのパラメーターをGETするには、$_GET[‘パラメーター名’]を使います。

今回は、パラメーター名に『genre』を使っているので、

$_GET[‘genre’];

となります。
ついでにこれを変数にいれてやります。

$genre_name = $_GET[‘genre’];

これでジャンル名には変数を使えるようになったので、

<?php 
//URLのパラメーター「?genre=」の値をGETして変数へ格納。 
$genre_name = $_GET['genre'];

//query_posts用の配列を作成
$list = array( 
'post_type' => array('post'), 
'showposts' => 5, 
'category_name' => tokyo, 
'genre'=> $genre_name, ); 
?>

となり、あとは、tokyoというターム名も、$areaへ格納できればOKです。

現在のカテゴリーIDを取得して、変数へ格納

http://hogehoge.com/tokyo/?genre=”yakiniku”
たとえば、上記URLにアクセスしている場合、ベースとなっているのは、tokyoというカテゴリアーカイブですので、

$area = get_query_var( ‘cat’ );

とすることで、現在、表示しているページのカテゴリIDを取得することができます。
query_postsの配列で、カテゴリの抽出に、category_nameを使っていましたが、’cat’ => $areaとすることで、カテゴリIDでの抽出が可能になるので、最終的なコードは、下記となります。

<?php 
//URLのパラメーター「?genre=」の値をGETして変数へ格納。
$genre_name = $_GET['genre']; //現在のカテゴリーIDを取得して、変数へ格納。 
$area = get_query_var( 'cat' ); //query_posts用の配列を作成 
$list = array( 
'post_type' => array('post'), 
'showposts' => 5, 
'cat' => $area, 
'genre'=> $genre_name, ); 
?>

このコードをcategory.phpに実装しておき、あとはいつものループで、投稿一覧を表示するようにしておけば、

http://hogehoge.com/tokyo/
のように、パラメーターがない場合は、東京に属するすべての飲食店一覧が表示されますし、

http://hogehoge.com/tokyo/?genre=”ジャンルのスラッグ”
とパラメーターをつけると、東京に属していて、かつ、指定したジャンルに属する飲食店一覧が表示されます。

まとめ

いかがでしたでしょうか?

以上でできましたでしょうか?

これができると、けっこう大規模なサイトも構築できるようになります。
ただ、アーカイブページが大量にできあがるので、Googleに品質の低いページや重複コンテンツ扱いされて、評価が下がるという可能性はあります。
rel=”canonical”とかうまく使うという手もあるかもしれませんが、僕の場合、いまのところウェブマスターツールに警告などは届いていません。

とりあえずサイト全体のバランスと相談しながら、うまいこと使ってみてくださいな。

コメント