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

公開日: : 最終更新日:2014/11/15 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'];
<p>//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"とかうまく使うという手もあるかもしれませんが、僕の場合、いまのところウェブマスターツールに警告などは届いていません。

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

関連記事

TablePressにも対応!横長テーブルのスマホ対応はFooTableで決まり。【WordPressプラグイン】

グーグルが「スマホ対応ができているかどうかを4/21からランキング決定要因に加えるよ~。」と異例の事

記事を読む

投稿記事内でスマホ用とPC用で出力するコンテンツを条件分岐させる方法

前回は、テーブル表示をPC・スマホ両方に対応させるレスポンシブ化する方法をご紹介しましたが、今回も引

記事を読む

スクリーンショット 2014-11-16 12.07

【WordPress】「下書きを保存しています…」と表示されたまま投稿画面で記事の保存ができなくなる。

先日、いつも通りこのブログを更新しようと記事を書いていたところ、WordPressの投稿画面で、

記事を読む

【WordPressプラグイン】画像アップロード時に自動で透かしを入れられる『Easy Watermark』で画像の不正利用を防ごう!

サイトやブログに画像をアップする際に、著作権フリーの無料素材画像などならともかく、自分で撮影した

記事を読む

eye010

Advanced Custom Fieldsでカテゴリにカスタムフィールドを追加し表示する方法

カテゴリーやタグ、カスタムタクソノミーのアーカイブで、カテゴリ毎に独自のテキストや画像などを表示

記事を読む

facebook-76531_640

【WordPress】Stinger3にFacebookのOGP設定をしたよ。

当ブログもたまにツイッターでシェアしてくれたり、フェイスブックでいいね!してくれたりする記事があ

記事を読む

host2

サーバー移転時にDNSの浸透を待たずに新旧サーバーに自在にアクセスする方法

今回は、独自ドメインでwebサイトを運用している方向けのTIPSです。 サーバーの引越時などに、新サ

記事を読む

education-614155_640

【WordPress】内部リンクをはてなのブログカード風のサムネイル付きリンクにデザインするショートコード

はてなブログで使われているブログカードみたいなデザインで、WordPressで内部リンクを貼るこ

記事を読む

【WordPress】記事ごとにアドセンスの表示・非表示を設定し、代替広告を表示するカスタマイズ

先日、ブロガーの桃音さんにアドセンスの警告が来たということで話題になっていました。  

記事を読む

【WordPress】iframeを使わずにはてなのブログカード風に外部リンクをデザインするショートコード

先日、WordPressで自分のブログ内のほかの記事に内部リンクを貼る場合に、はてなブログなんかでよ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


第一滝本館外観
登別温泉の第一滝本館にて日帰り入浴 ※1,500坪の敷地に35の湯船の大浴場!

北海道旅行5日目に札幌駅前のトヨタレンタカーでプリウスをレンタルして日

ドゥーブルプレート
小樽の洋菓子店「LeTAO(ルタオ)」で極上スイーツ「ドゥーブルプレート」をいただきました。

札幌から少し足を延ばして小樽まで。 小樽のレトロでかわいい町をぶ

「すすきの」で北海道料理をリーズナブルに味わえる海鮮居酒屋『海さくら』

登別温泉に日帰りで行った次の日はお昼までゆっくり寝て、ランチにラマイの

スープカレー(ポーク)
RAMAI(ラマイ)札幌中央店で食べた初スープカレーが美味すぎた!

札幌発祥の道産子のソウルフード『スープカレー』を食べてきましたよ。

すすきの「禅」で海鮮しゃぶしゃぶと北海道の地酒を堪能

札幌・すすきのの狸小路あたりにあるしゃぶしゃぶ・すき焼き専門店「禅」で

→もっと見る

PAGE TOP ↑