WordPressにイベントカレンダーを追加するには、いろいろなプラグインがあります。
なんかがいい感じですが、クライアントさんにお渡しするには、シンプルでわかりやすい必要があります。
ほとんどのイベントカレンダーが日本語化されていないので、そもそもそこがハードルになります。
その点、My Calendarは日本語なんですが、カレンダーそのものは専用ページに出力されるようになっていて、テンプレート内での出力ができなかったりするんですよね。
いろいろ試したのですが、以前からお世話になってる、Biz Calendar さんがシンプルイズベストでやっぱりいいな~と思うのです。
https://wordpress.org/plugins/biz-calendar/
http://residentbird.main.jp/bizplugin/plugins/bizcalendar/
それに、Biz Calender はウィジェットしか使えない、と思われてますけれど、実はテンプレート中にも配置できます。
たとえば、page.phpなんかに、
と書き加えておくと、それがカレンダーに早変わり! (ただし、一つの画面に一つだけしか表示できないので、サイドバーにもBiz Calenderをおいている場合は、どちらかが表示されません。)
見た目もシンプルで、デザインもCSSで上書きすればわりと自由に変更できますし。
でも、イベントは固定ページで人力で作らないといけないので、イベントカレンダーとしてはイマイチ。
というわけで、投稿で「イベント」カテゴリを選択したら、Biz Calendarにリンクが表示されるように、Biz Calendar本体を改造します。
まずは本体改造の前に、カスタムフィールドを用意します。
ここでは、手軽にAdvanced Custom Fields プラグインを利用することにします。 http://www.advancedcustomfields.com/
作成するカスタムフィールドは、二つ。
まずは、Biz Calenderに表示するイベントのタイトル。
フィールド名はevent-titleで、フィールドタイプはテキストです。
次に、投稿にカテゴリを用意します。 名前はイベントで、スラッグはeventとします。
さて、プラグインBiz Calendar本体の改造に入ります。
まずは、biz-calendar.php の class BC{ } の中に、以下の関数を追加します。
この関数は、上述で追加したカテゴリの投稿を取得して、追加したカスタムフィールドの値を配列にして返します。
public static function get_event_posts(){ $cat = get_category_by_slug('event');//eventというスラッグのカテゴリのカテゴリ情報を取得 $args = array( 'post_type' => 'post', 'category' => $cat->term_id, ); $eventposts = get_posts($args);//eventカテゴリの投稿を取得 $ret = array(); foreach($eventposts as $epost){ $eventDate = get_post_meta($epost->ID , 'event-date' , true);//イベント日 $eventTitle = get_post_meta($epost->ID , 'event-title' , true);//イベントタイトル if ($eventTitle){ $e['title'] = $eventTitle;//イベントタイトル }else{ $e['title'] = $epost->post_title;//イベントタイトルが設定されていなければ、投稿のタイトルを取得 } $e['date'] = $eventDate; $e['url'] = get_permalink( $epost->ID );//投稿へのリンクURLを取得 $ret[] = $e;//イベント日とタイトルとURLごとで配列に格納 } return $ret; }
次に、同じくbiz-calendar.php の localize_js() 関数に、
$option["events"] =self::get_event_posts();
を追加します。5行目です。
public static function localize_js(){ $option = self::get_option(); $option["plugindir"] = plugin_dir_url( __FILE__ ); $nh= self::get_national_holiday(); $option["events"] =self::get_event_posts(); $option["national_holiday"] = $nh["national_holiday"]; wp_localize_script( 'biz-cal-script', 'bizcalOptions', $option ); }
こんどは、calendar.jsを編集します。
まずは、var getDateType = function(date, day) に以下の6-12行目を追加します。
ここで、カレンダーの日付の日に、投稿で設定されたイベントがあるかどうかを取得します。
もともと、Biz Calender にはイベントを設定できる機能があるのですが、投稿のイベントカテゴリを優先するようにしています。
var getDateType = function(date, day) { var fulldate = getFormatDate(currentSetting.year, currentSetting.month, date); // 投稿のイベント日 var events = currentSetting.options.events; for(var i=0; i次に、var getDateTag = function(date, day) に以下の7~18行目を追加します。
ここで、カレンダーの日付と投稿のイベントが紐付けられます。var getDateTag = function(date, day) { if (date == undefined || date == "") { return ""; } var fulldate = getFormatDate(currentSetting.year, currentSetting.month,date); var events = currentSetting.options.events; var info = ""; for(var i=0; i" + events[i]["title"] + ""; } } if (info != "") { return info; } ・ ・ ・ ・
これで、投稿で作成した記事をイベントとしてカレンダーに表示させることが出来るようになります。
(CSSもいじってます。)実際に投稿してみる
投稿をひらくと、以下の項目が出てきます。
イベント日は、2015-07-07 のように 半角で年月日を - で区切って入力します。
15-7-7 のように、西暦二桁を省略したり、 0 を省くことは出来ません。
複数行で入力することで、複数日を設定することが出来ます。
イベントタイトルを設定すると、そのタイトルが投稿ページヘのリンク付きで、カレンダーに表示されます。最後に
本当は、Biz Calendarにフックがついていたら利用したかったのですが、なかったので本体そのものを改造することに。
Biz Calenderにフック追加してもらうか、いっそ、イベントを表示できるようにしてくれたらなぁ。なんて思いつつ。当然ですが、プログラムそのものを改変してしまうので、プラグイン本家のアップグレードで上書きされてしまう点に注意が必要です。
なので、プラグインのフォルダ名そのものを、biz-calendar 以外に変えてしまうほうが安全ですね。