「All-in-One Event Calendar」のイベント表示
前回は、以下の記事で「All-in-One Event Calendar」のイベントをメインページに表示する方法を紹介しました。
すると、以下のように、「All-in-One Event Calendar」を使って入力したイベント(ai1ec_event)のコンテンツが、通常の投稿と一緒に自分のWordPressのメインページに表示できました。
前回もお話ししたように、私は、「ちょいプラ素材」のブログのWordPressテーマに、わいひらさんが無償で公開されている「Simplicity2」を使っています。
このWordPressテーマ「Simplicity2」の環境では、メインページに表示されるコンテンツには、「アイキャッチ画像」や「タイトル」と合わせて、以下のように、「本文」の一部が表示されます。
今回は、この「本文」の部分に、「All-in-One Event Calendar」のイベントの「日時」や「場所」の情報を表示してみます。
「All-in-One Event Calendar」のイベント情報を取得するには?
とは言うものの、当初は、「All-in-One Event Calendar」のイベント情報をどうすれば取得できるのか見当もつかず、途方に暮れていました。
いろいろ悩んでいた私は、とりあえず、「All-in-One Event Calendar」のサポートフォーラムの投稿に目を通しました。
すると、以下の投稿に目が留まりました。
質問している「peturkirke」さんは、「All-in-One Event Calendar」のイベント情報を取得するためにカスタムフィールド名を知りたがっています。
I am trying to get your plugin to work together with another plugin, and in the other plugin i need to specify the field names of your plugin as for example event_title, start_time, end_time, but i cant find the field names in your plugin.
でも、「peturkirke」さんの望んでいる情報は得られず、このスレッドは、クローズしています。
その後も、ネット上の情報をいろいろ探してみましたが、有益な情報は得られませんでした。
「ドンぴしゃ!」の情報は見つかりませんでしたが、いろいろ調べるうちに、以下の2つの方法なら、「All-in-One Event Calendar」のイベント情報を取得できそうな感じがしてきました。
-
プラグインでpublic宣言されているクラスや関数は、globalで扱えるらしいので、「All-in-One Event Calendar」のクラスや関数をうまく使えば、イベント情報が取得できるのではないか?
-
「All-in-One Event Calendar」のイベントは、カスタム投稿なので、イベントのデータが保存されている「All-in-One Event Calendar」専用のテーブルに直接アクセスすれば、イベント情報が取得できるのではないか?
1.は、「All-in-One Event Calendar」のソースコードを読み込んでいけば、ひょっとしたらうまくいくかもしれませんが、ちょっと自信がありません。
なので、今回は、2.の「All-in-One Event Calendar」のデータテーブルから直接、情報を取得する方法を採用します。
「MySQL」の予備知識
データベースの中の「All-in-One Event Calendar」専用のテーブルにアクセスすることにしたので、まず、「MySQL」のことを簡単に理解しておきましょう。
WordPressでは、ブログの記事の内容やその記事に貼った写真の保存先情報など、ブログの情報を「MySQL」というデータベースに保存しています。
私は、今回の記事を書くまで、「MySQL」のことをきちんと知らないでいました。
こんなこと知らなくても、WordPressを使って、ブログを書くことはできますからね。
「世界中で広く利用されているリレーショナルデータベース」
くらいのことは知っていますが、「リレーショナル」という言葉が、なんとなく取っ付きにくかったので、あまり、積極的に学んだことはありませんでした。
ところが、今回、ネットでいろいろ調べてみると、「リレーショナルデータベース」は、そんなに難しいものではありませんでした。
以下、私流の「リレーショナルデータベース」の理解です。
- Excelの表と同様、「行:Row」と「列:Column」から構成される、2次元のテーブルが複数集まったもの。
- 複数のテーブルは、「行:Row」や「列:Column」の要素で、互いに関連付けされている。
もう少し詳しく知りたい方は、以下、「ASCII.jp × TECH」さんのページを参考にしてください。
「Excelみたいな2次元のテーブルの集まり」ということがイメージできれば、あとは、データベースにお決まりのクエリを使って、2次元のテーブルに保存されているデータの検索・抽出・比較・並べ替えをやればいいだけです。
さらに、WordPressには、便利な$wpdbというクラスが用意されているので、このクラスを使えば、「MySQL」データベースに簡単にアクセスできます。
興味のある方は、以下、「ITかあさん」のページに目を通してみてください。
今回の記事で使うプロシージャは、$wpdbクラスのget_rowだけです。
これも、
「MySQLは、Excelみたいな2次元のテーブルの集まり。」
「ということは、しかるべきテーブルから、知りたいイベントの情報を1行(Raw)だけ取ってくればいい。」
「なので、get_rowを使えばいいんだな。」
ということがイメージできたお蔭です。
何事も、最低限の基本的な知識や勉強は必要ですね。
「All-in-One Event Calendar」専用のテーブル
「MySQLデータベースは、2次元テーブルの集まり」ということがわかった上で、さらに話を進めます。
「All-in-One Event Calendar」プラグインをインストールすると、「MySQL」データベースに専用のテーブルが作成され、「All-in-One Event Calendar」のイベントに関するデータは、この専用テーブルで管理されます。
なので、「All-in-One Event Calendar」のイベント情報を取得するには、この専用のテーブルのデータにアクセスすることになります。
「All-in-One Event Calendar」専用のテーブルはどこにある?
では、「All-in-One Event Calendar」専用のテーブルはどこにあるのでしょうか?
そこで登場するのが、「MySQL」の中身を直接見たり、編集したりすることができる、「phpMyAdmin」というツールです。
WordPressを使っている人なら、一度は、見たり聞いたりしたことがあると思います。
この「phpMyAdmin」の使い方は、以下、「DBOnline」さんのページを参考にしてください。
ということで、いきなり「phpMyAdmin」で、「MySQL」の中身をのぞいてみます。
以下の「phpMyAdmin」のログイン画面で、事前に設定しておいた、「ユーザ名」と「パスワード」を入力して、[実行]ボタンを押します。
すると、以下のように、「phpMyAdmin」のホーム画面が表示されます。
以下の記事でも書いたように、今回、「All-in-One Event Calendar」の使用感を確かめたり、カスタマイズを検討するために作った、“WordPress BAND”という架空のアマチュアバンドのホームページを例に説明します。
上の図の「phpMyAdmin」のホーム画面の青い枠のように、このホームページの「MySQL」のデータベースは、"wordpress-band"という名前で作成しました。
「phpMyAdmin」のホーム画面で、"wordpress-band"を選択すると、このデータベースには、'wp_ai1ec_'で始まる、以下、3つのテーブルがあります。
(テーブル名の先頭の'wp_'のプレフィックスは、みなさんが独自に設定した別の文字列になっているかもしれません。)
- wp_ai1ec_events
- wp_ai1ec_event_category_meta
- wp_ai1ec_event_instances
この3つのテーブルが、「All-in-One Event Calendar」専用のテーブルになります。
'wp_ai1ec_events'テーブルの中を見てみる
「All-in-One Event Calendar」専用の3つのテーブルのうち、今回、表示をしようとしているイベントの「日時」や「場所」の情報は、
- wp_ai1ec_events
のテーブルに格納されています。
ちょっと、「phpMyAdmin」を使って、'wp_ai1ec_events'テーブルの中を覗いてみましょう。
'wp_ai1ec_events'テーブルを選択すると、以下のようにテーブルの中身を見ることができます。
現時点では、「All-in-One Event Calendar」のイベントが3つ登録されていることがわかります。
また、イベントの「開始日時」「終了日時」「場所」の情報が、それぞれstart、end、venueという名前のラベルで管理されていることもわかります。
「All-in-One Event Calendar」のイベント情報取得
事前の予備知識は、ここまでです。
では、実際に、「All-in-One Event Calendar」専用のテーブル'wp_ai1ec_events'から、イベントの「日時」と「場所」の情報を取得してみましょう。
「Simplicity2」特有の話
ちょっと本題から外れますが、「All-in-One Event Calendar」のイベントの「日時」と「場所」の情報を取得するコードの説明をする前に、私が使っているWordPressテーマ「Simplicity2」特有の話をしておきます。
この記事の冒頭で、
と説明しました。
この「本文」の一部を表示する処理を「Simplicity2」では、get_the_custom_excerptという関数で実行しています。
今回の記事では、「Simplicity2」がデフォルトで表示する「本文」の部分を「All-in-One Event Calendar」のイベントの「日時」と「場所」の情報に置き換えようとしています。
なので、イベントの「日時」と「場所」の情報に置き換えるコードは、get_the_custom_excerpt関数に記述します。
実際には、子テーマ「simplicity2-child」のディレクトリ
https://○○○…wp-content hemessimplicity2-child
の下にある「functions.php」の中で、get_the_custom_excerpt関数をオーバーライドして、オーバライドした関数の処理を変更します。
もし、「Simplicity2」以外のWordPressテーマをお使いの方は、自分の使っているテーマの「functions.php」にget_the_custom_excerpt関数を追加し、メインページを表示するテンプレートから、このget_the_custom_excerpt関数をコールすることになります。
このあたりは、「Simplicity2」を開発されているわいひらさんが運営されているブログ「寝ログ」の以下の記事が参考になります。
実際のコード
「functions.php」に追加したget_the_custom_excerpt関数のコードを以下に示します。
//本文抜粋を取得する関数 「All-in-One Event Calendar」イベントのときは「日時」と「場所」を取得
function get_the_custom_excerpt($content, $length = 70, $is_card = false) {
global $post;
global $wpdb;
//このif文の中が「All-in-One Event Calendar」イベントに対する処理
if ( $post->post_type == 'ai1ec_event' ) {
date_default_timezone_set('Asia/Tokyo');
$query = $wpdb->prepare( "SELECT * FROM wp_ai1ec_events WHERE post_id = %d", $post->ID );//クエリ文
$select_result = $wpdb->get_row($query);//テーブルから対象の行(Row)を取得
$datetime = '日時:' . date("Y年n月j日 G:i", $select_result->start). '~' . date("G:i", $select_result->end);//「開始日時」「終了日時」
$place = '場所:' . $select_result->venue;//「場所」
return $datetime . "</br>
" .
$place;
}
//SEO設定のディスクリプション取得
$description = get_meta_description_blogcard_snippet($post->ID);
//SEO設定のディスクリプションがない場合は「抜粋」を取得
if (!$description) {
$description = $post->post_excerpt;
}
if (is_wordpress_excerpt() && $description ) {//Wordpress固有の抜粋文を使用するとき
return $description;
} else {//Simplicity固有の抜粋文を使用するとき
return get_content_excerpt($content, $length);
}
}
コードの解説
関数の最初で、「投稿を扱う$postクラス」と「データベースを扱う$wpdbクラス」をglobal宣言しています。
コメント文
//このif文の中が「All-in-One Event Calendar」イベントに対する処理
以降のif文の中が「All-in-One Event Calendar」のイベントに対する処理です。
if ( $post->post_type == 'ai1ec_event' )
で、「All-in-One Event Calendar」のイベントのカスタム投稿タイプかどうかを判断しています。
date_default_timezone_set('Asia/Tokyo');
は、タイムゾーンを日本標準時に設定しています。
$query = $wpdb->prepare( "SELECT * FROM wp_ai1ec_events WHERE post_id = %d", $post->ID );//クエリ文
で、「MySQL」のクエリ文を作っています。
$wpdb->prepare()
関数は、「MySQL」データベースに安全にアクセスできるよう、クエリに渡された変数をエスケープしたり、インジェクション攻撃を防いてくれたりする関数です。
なので、クエリ文を作るときには、必ず使用するようにしましょう。
FROM wp_ai1ec_events
で、'wp_ai1ec_events'テーブルを指定しています。
WHERE post_id = %d", $post->ID
で、イベントのIDを指定しています。
クエリ文を作成した後、
$select_result = $wpdb->get_row($query);//テーブルから対象の行(Row)を取得
のget_rowで、'wp_ai1ec_events'テーブルから、指定したイベントのIDの行(Row)を取得します。
後は、取得した行(Row)から$select_result->startで「開始日時」を、$select_result->endで「終了日時」を取得します。
取得した「開始日時」と「終了日時」は、PHPのdate関数で、希望する書式に変換しています。
同様に、取得した行(Row)から$select_result->venueで「場所」を取得します。
start、endとvenueは、先に「phpMyAdmin」を使って、'wp_ai1ec_events'テーブルの中を見たときに確認しておいたラベル名です。
最後に、取得・変換した「日時」と「場所」の文字列をreturn文で返します。
コメント文
//SEO設定のディスクリプション取得
から関数の最後までは、もともと「Simplicity2」で実行していたget_the_custom_excerpt関数と同じ処理です。
「All-in-One Event Calendar」のイベント以外の投稿に対しては、投稿の「本文」や「抜粋」を返すためです。
イベントの「日時」と「場所」が表示されるのを確認
上記のコードを「functions.php」に追加したら、メインページの表示を更新して確認します。
以下のように、「All-in-One Event Calendar」のイベントのコンテンツに「日時」と「場所」が表示されています。
まとめ
今回の記事では、$wpdbクラスを使って、「All-in-One Event Calendar」専用のテーブルに直接アクセスしてイベントの「日時」や「場所」の情報を取得する方法と、その情報をメインページに表示する方法を紹介しました。
WordPressの「MySQL」データベースで管理されているデータには、同様の方法で、自由にアクセスすることができます。
次回は、いよいよ表示をカスタマイズして、ポップアップ画面の日時表示を修正する方法を紹介します。
コメント
初めまして
記事を読みながら見よう見まねでトップページに投稿記事と一緒にイベントも表示されるようになり、表示内容を日付・場所に変えようとしています。
非エンジニアの私は何回HPに訪問させてもらったかわかりません。
本当に本当にお世話になってます。
いつもありがとうございますm(_ _)m
日付と場所が取得できてないようです。
データベースの名称はそれぞれ異なるのでしょうか?
もしよかったらお時間あるとき教えてください。
3105さん
このブログが参考になっているとのこと,大変うれしいです.
記事の中で記載しているデータベースの名前は,
・wp_ai1ec_events
・wp_ai1ec_event_category_meta
・wp_ai1ec_event_instances
のように,頭に”wp_”の接頭辞が付きます.
ただし,この接頭辞は,自分で自由に設定することができます.
自分のブログのルートフォルダに「wp-config.php」というファイルがあるはずです.
このファイルを開くと,
$table_prefix = ‘wp_’;
という行があります.
この行で’wp_’以外の文字列が書かれていると,データベースの名前の頭には,この文字列の接頭辞がつきます.
例えば,この行に
$table_prefix = ‘abc_’;
と書かれていれば,データベースの名前の接頭辞は,”abc_”になり,上記のデータベースの名前は,それぞれ,
・abc_ai1ec_events
・abc_ai1ec_event_category_meta
・abc_ai1ec_event_instances
に変わります.
“ai1ec_event”という名前のカスタムポストとして、
wp_queryの普通のループで読み込めますよー。
はじめまして、こちらの記事を参考にカレンダーを実装しようと思っております。まさにこちらの記事にありますように、データベースからイベントの情報を取得したいと思っています。先日All-in-One Event Calendarをインストールしたのですが、phpMyadminにこのカレンダーに関連するテーブルが見当たらず、悩んでおります。。ただ、wordpressダッシュボード→プラグインでAll-in-One Event Calendarのコードエディターを見ると”ai1ec_”から始まるものもあるので何かしら参照していると思うのですが…
もし分かりましたらご教授頂けないでしょうか。
1103さん
ちょいプラ素材の閲覧ありがとうございます。
別のサイトに最新版のAll-in-One Event Calendarをインストールしてみました。
確かに、最新バージョンでは、以下の名前のテーブルはありませんでした。
・wp_ai1ec_events
・wp_ai1ec_event_category_meta
・wp_ai1ec_event_instances
WordPressの投稿データのように、作成したイベント情報を
・wp_posts
・wp_postmeta
などのテーブルに保存する仕様に変わったのかと調べてみましたが、どのテーブルにもイベント情報は保存されていませんでした。
結果、最新バージョンのAll-in-One Event Calendarのイベント情報は、プラグイン開発者Time.ly Network Inc.のサーバーに保存されていると思います。
なので、最新のバージョンでは、このプラグインを使う際に、プラグインへのログインが必要になっています。
さらに調べてみると、以下のURLに、v.2.6.8とv.3で、大きく仕様が変更されたことをうかがわせる記載があります。
https://help.time.ly/event-calendar-wordpress-plugin/
v.3からは、無料で作成できるイベント数が100件までとなったので、パーソナルユースから見ると、ちょっと敷居が高いプラグインになりましたね。
イベント開催数が多く、イベントの運営管理をガチでやりたいサイト向けのプラグインに成長したのだと思います。
ご返信頂きありがとうございます。
また、わざわざ最新版をインストール頂いたりと、お手数をお掛けしてしまい申し訳ありません。
なるほど、、、バージョンアップをきっかけに仕様が変わってしまっているのですね、、、
今、phpmyadminのテーブル内に保存されたデータをTime.lyの[Event]→[Description]内に記載できないかと試行錯誤しているのですが、ちょっとこのプラグインだと難しそうですかね。。。
別のプラグインも調べつつ、もう少し考えてみたいと思います。
情報頂き非常に助かりました。本当にありがとうございました。
引き続き今後も管理者様の記事を参考にさせていただきます。