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

wordpress

あるサイトを 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 に書き込まなければなりませんので、プラグインとしておいたほうが便利かと思います。

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

コメント

タイトルとURLをコピーしました