あるサイトを WordPress で構築しているのですが、ありがたい事にスタッフが皆忙しく、このサイトのややこしい部分は秋田が担当しております。
そんなこんなで今日もワードプレスネタ。ちょっと高度です。
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/".$term->slug."">"; $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/".$term->slug."">"; $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 に書き込まなければなりませんので、プラグインとしておいたほうが便利かと思います。
もっとスマートなやり方があるかもしれませんが、今回はこう作り込みしました。
コメント