Event Organiserでハマったこと

[Event Organiser](https://ja.wordpress.org/plugins/event-organiser/)という個人的には、Google Calenderとかより使い勝手が良いのではないかと思うプラグインがあるのですが、プラグインを導入した際にハマったことがあるので、メモしておきます。

## プラグインの特徴（所感）

- カレンダー自体は固定ページに`[eo_fullcalender]`とかcontact form 7みたいなソースをはっつければ表示される
- デフォルトでviewとしては問題ないcssが存在している（解除又は、上書き可能。フルスクラッチで記述するのは結構面倒くさい）
- 各イベントは投稿ページベースで生成する（別途イベント用のダッシュボードが生成）。その際、編集画面でどの期間イベントがあるのか、また、終日なのか時間制なのか、さらに開催場所なども設定できる。
- プラグインだけ有効化すると、イベントページ詳細を選択した時に、`single.php`がトリガーとして呼ばれる。よって、カレンダー一覧に戻る動線などが確保できなくなる
- 上記の自体を避けるために、`single.php => single-event.php`に変更すると、イベント詳細ページは`single-event.php`で表示されるようになる
- event organiser用のメソッドが[沢山用意](http://codex.wp-event-organiser.com/index.html)されているが、フォーラムが充実していないため、カテゴリの取得などわかりくい

## その1 自作のパンくずのメソッドでバグる
極論、`<?php breadcrumb(); ?>`を書かなければいいのですが、UIのことを考え一様表示させています。
そのまま表示させると、投稿詳細ページとイベント詳細ページでバグが起きてコンテンツページが真っ白になってしまうので、functions.phpに以下のソースを（とりあえず）付け足して回避。

```php:breadcrumbs

# パンくずリスト
function breadcrumbs(){
	global $wp_query;
	$sep=' <span>&raquo;</span> ';
	if(!is_front_page()){
		// Start the UL
		echo '<ul>'."\n";
		// Add the Home link
		echo '<li><a href="'.get_bloginfo('url').'">Home</a></li>'."\n";

		if(is_category()){
			$catTitle = single_cat_title( "", false );
			$cat = get_cat_ID( $catTitle );
			echo "<li>".$sep."Information</li>\n";
			echo "<li>".$sep. preg_replace('@'.quotemeta($sep).'$@','',get_category_parents( $cat, TRUE, $sep)) ."</li>\n";
		}else if(is_archive() && !is_category()){
			echo "<li>".$sep."Archive</li>\n";
		}else if(is_search()){
			echo "<li>".$sep."Search</li>\n";
		}else if(is_404()){
			echo "<li>".$sep."Not found</li>\n";
      /* ここから */
		}else if(eo_get_events()){
			$event_category = get_the_category();
			$event_category_id = get_the_ID( $event_category );
			echo '<li>'.$sep. get_category_parents( $event_category_id, TRUE, $sep);
			echo the_title('','', FALSE) ."</li>\n";
      /* ここまで追加 */
		}else if(is_single()){
			$category = get_the_category();
			$category_id = get_cat_ID( $category[0]->cat_name );
			echo '<li>'.$sep. get_category_parents( $category_id, TRUE, $sep);
			echo the_title('','', FALSE) ."</li>\n";
		}else if(is_page()){
			$post = $wp_query->get_queried_object();
			if($post->post_parent==0){
				echo "<li>".$sep.the_title('','', FALSE)."</li>\n";
			}else{
				$title = the_title('','', FALSE);
				$ancestors = array_reverse( get_post_ancestors( $post->ID ) );
				array_push($ancestors, $post->ID);
				foreach($ancestors as $ancestor){
					if($ancestor!=end($ancestors)){
						echo '<li>'.$sep.strip_tags( apply_filters( 'single_post_title', get_the_title( $ancestor ) ) ) .'</li>'."\n";
					}else{
						echo '<li>'.$sep.strip_tags( apply_filters( 'single_post_title', get_the_title( $ancestor ) ) ) .'</li>'."\n";
					}
				}
			}
		}
		echo "</ul>\n";
	}
}
```
`$category = get_the_category();`をしてしまうと、イベントのカテゴリもその中に突っ込まれてしまうので、`eo_get_events()`をその前の、else ifで条件分岐させて、回避。（ただしこれが正しいかはわからない...） これで、投稿・イベント詳細ページ両者を表示させることができる。  

`breadcrumsb` を記述しないで、[WP SiteManeger](http://www.wp-sitemanager.com/)とかのパンくず使えば楽なんだけど、なるべくカスタマイズしたいと思いやってみたものの撃沈。

## その2 イベント投稿のカテゴリやタグを引っ張ってこれるらしいが、お目当てのメソッドがわからない
ので、チュートリアルから直接以下のソースをasideの部分にコピペして記述

```php:single-event.php
		<aside id="aside">
			<?php
			 $events = eo_get_events([
			         'numberposts'=>10, // イベントの投稿表示件数
			         'event_start_after'=>'today', // いつからイベントの投稿を一覧で表させるか
			         'showpastevents'=>true,
			    ]);

			  if($events):
			     echo '<ul>';
			     foreach ($events as $event):
			          //Check if all day, set format accordingly
			          $format = ( eo_is_all_day($event->ID) ? get_option('date_format') : get_option('date_format') );
			          printf(
			             '<li><a href="%s"> %s </a> %s </li>',
			             get_permalink($event->ID),
			             get_the_title($event->ID),
			             eo_get_the_start($format, $event->ID,null,$event->occurrence_id)
			          );
			     endforeach;
			     echo '</ul>';
			  endif;
			 ?>
		</aside>
```
これで、サイトが表示されている日から、10件分のイベントをasideに表示することができる。

## 3. 結論
とりあえず、使えるけど、カスタマイズにまだまだ勉強が必要。
情報あったら共有いただけると幸いです。