*

WordPrss カスタムポストタイプのカテゴリリスト出力、ソースコード付


ちわ、秋田@豊作(@housakuakita‎)です。

あるサイトを WordPress で構築しているのですが、ありがたい事にスタッフが皆忙しく、このサイトのややこしい部分は秋田が担当しております。

そんなこんなで今日もワードプレスネタ。ちょっと高度です。

medium_2186228674
photo credit: Nikolay Bachiyski via photopin cc

カスタムポストタイプのカテゴリリスト

今回のサイト、色々なイベントを紹介するサイトなので、カレンダー機能を持ったプラグイン「Event Organiser」を使って作っています。

なかなか便利なプラグイン。色々な事が出来るので重宝しています。

イベント会場のリストを出したい

イベントを登録する時に、イベント会場を登録するのですが、イベント会場のデーターベースが自動的に出来上がります。このイベント会場の一覧を表示させたいな〜と思ったのですが、イベント会場の一覧表示が無い。無いなら作るしか無い。って事で作ってみました。

プラグインにして、ショートコードで書きました。プラグインの作り方は「自作プラグインのススメ WordPress をより深く、安全にカスタマイズする為に」を参考にして下さい。

イベント会場(カスタムポストタイプカテゴリ)のデータ

イベント会場のデータは、テーブル「wp_terms」と「wp_eo_venuemeta」に格納されています。

「wp_terms」は WordPress 標準のテーブルで、投稿のカテゴリやタグ等の名称やスラッグ(URLを形成する文字列)が登録されています。ここに「会場名」「スラッグ」が格納され、「Event Organiser」独自のテーブルである「wp_eo_venuemeta」にそれ以外の住所情報等が記録されています。

テーブル「wp_terms」だけだと、どればカテゴリでどればイベント会場か?を明示的にする事が出来ないので、「wp_eo_venuemeta」から「wp_terms」に紐づいた ID を引き、「wp_terms」の情報を取得します。

あとは HTML にして返してあげればおしまい。

カスタムポストタイプの場合「wp_posts」からデータを「post_type」で抽出し、「wp_term_relationships」の「term_taxonomy_id」を引き、それを利用して「wp_term_taxonomy」から「term_id」を抽出、そのデータから「wp_terms」の情報を取得。ちょっとややこしいですけどこうなります。

イベント会場の場合は

<br />
$venue_sql = "select distinct eo_venue_id from wp_eo_venuemeta";<br />
$sql = "select * from wp_terms where term_id in (".$venue_sql.");";<br />
$row = $wpdb->get_results($sql, OBJECT);<br />

カスタムポストタイプが「item」の場合

<br />
$posts_id_sql = "select distinct ID from wp_posts where post_type = 'item'";<br />
$term_taxonomy_id_sql = "select distinct term_taxonomy_id from wp_term_relationships where object_id in (".$posts_id_sql.")";<br />
$term_id_sql = "select distinct term_id from wp_term_taxonomy where term_taxonomy_id in (".$term_taxonomy_id_sql.")";<br />
$sql = "select * from wp_terms where term_id in (".$term_id_sql.");";<br />
$row = $wpdb->get_results($sql, OBJECT);<br />

こんな感じで抽出を行います。

具体的に書いてみると

イベント会場の場合は

<br />
function venuesFunc() {<br />
	global $wpdb;<br />
	$rtn = "";</p>
<p>	//施設情報を引く<br />	$venue_sql = "select distinct eo_venue_id from wp_eo_venuemeta";<br />
	$sql = "select * from wp_terms where term_id in (".$venue_sql.");";<br />
	$row = $wpdb->get_results($sql, OBJECT);</p>
<p>	$rtn .= "</p>
<div id="venues">\n"; foreach ($row as $term) { $rtn .= "</p>
<div id="venue">\n"; $rtn .= "<br />\n"; $rtn .= "<a href="/events/venues/&quot;.$term->slug.&quot;">"; $rtn .= $term->name; $rtn .= "</a>\n"; $rtn .= "<br />\n"; $rtn .= "</div>
<p><!-- /venue -->\n"; } $rtn .= "</div>
<pre><!-- /venues -->\n";
	return $rtn;
}
add_shortcode('venues', 'venuesFunc');

カスタムポストタイプが「item」の場合

function ItemCategoriesFunc() {
	global $wpdb;
	$rtn = "";

	$posts_id_sql = "select distinct ID from wp_posts where post_type = 'item'";
	$term_taxonomy_id_sql = "select distinct term_taxonomy_id from wp_term_relationships where object_id in (".$posts_id_sql.")";
	$term_id_sql = "select distinct term_id from wp_term_taxonomy where term_taxonomy_id in (".$term_taxonomy_id_sql.")";
	$sql = "select * from wp_terms where term_id in (".$term_id_sql.");";
	$row = $wpdb->get_results($sql, OBJECT);

	$rtn .= "</pre>
<div id="ItemCategories">\n"; foreach ($row as $term) { $rtn .= "</p>
<div id="ItemCategorie">\n"; $rtn .= "<br />\n"; $rtn .= "<a href="/item_category/&quot;.$term->slug.&quot;">"; $rtn .= $term->name; $rtn .= "</a>\n"; $rtn .= "<br />\n"; $rtn .= "</div>
<p><!-- /ItemCategorie -->\n"; } $rtn .= "</div>
<pre><!-- /ItemCategories -->\n";</p>
<p>	return $rtn;<br />
}<br />
add_shortcode('ItemCategories', 'ItemCategoriesFunc');<br />

こんな感じ。

まとめ

固定ページを作りショートコードを書き込みます。

イベント会場の場合は [venues]

カスタムポストタイプが「item」の場合は [ItemCategories]

と記述する事により、それぞれのカテゴリへリンクされた文字列が出力されます。functions.php に書いても良いですが、PC、スマホ、携帯と別テーマを使っている場合には、それぞれの funtions.php に書き込まなければなりませんので、プラグインとしておいたほうが便利かと思います。

もっとスマートなやり方があるかもしれませんが、今回はこう作り込みしました。

関連記事

熊本へ行こう ロンドン100連発[150/100]

土曜日の深夜からベトナムはホーチミンに行って来ました。 旅の目的...

記事を読む

くまモンに会おう ロンドン100連発[149/100]

昨晩はスポーツジムの催し物で、少し歌って来ました。地下鉄のギタリスト土...

記事を読む

熊本で食べよう ロンドン100連発[148/100]

今日は久しぶりに人前で歌います。あまり練習できていないので、少し申し訳...

記事を読む

熊本城へ行こう ロンドン100連発[147/100]

熊本城に行ったのは・・・もう一月も前、時の経つのは早いものですね。 ...

記事を読む

ブログ全体 WordPress を SSL 化しました

ポケモン GO! 金銀のポケモンがリリースされましたね。 しかし・・...

記事を読む

新着記事

沖縄へ行こう!行こうシリーズ[158/100]

2019年行こうシリーズの第一弾。だけど昨年12月15日に沖縄のガズレ...

記事を読む

新年明けましておめでとうございます。2019年

新年明けましておめでとうございます。 2018年が終わり、2019年...

記事を読む

自分の時間を売り渡し切った後の、擦り切れた時間で本当に楽しめるの?

秋田、起業したのが1995年〜なので、かれこれ23年スタッフやお客様に...

記事を読む

年末なので贅沢に2ポチ(Pixel3 & MacBookPro)しました | 和歌山城へ行こう 行こうシリーズ[157/100]

和歌山城で歌ってきました〜 行こうシリーズ(ロンドン100連発)...

記事を読む

ガズレレウクレレ「開封の儀」と「ストラップピン取り付け」

本日ガズさんののウクレレが届きました〜パチパチ〜   ...

記事を読む

コメント/トラックバック

トラックバック用URL:

コメントフィード




管理人にのみ公開されます

*

沖縄へ行こう!行こうシリーズ[158/100]

2019年行こうシリーズの第一弾。だけど昨年12月15日に沖縄のガズレ...

新年明けましておめでとうございます。2019年

新年明けましておめでとうございます。 2018年が終わり、2019年...

自分の時間を売り渡し切った後の、擦り切れた時間で本当に楽しめるの?

秋田、起業したのが1995年〜なので、かれこれ23年スタッフやお客様に...

年末なので贅沢に2ポチ(Pixel3 & MacBookPro)しました | 和歌山城へ行こう 行こうシリーズ[157/100]

和歌山城で歌ってきました〜 行こうシリーズ(ロンドン100連発)...

ガズレレウクレレ「開封の儀」と「ストラップピン取り付け」

本日ガズさんののウクレレが届きました〜パチパチ〜   ...

→もっと見る

PAGE TOP ↑