ATNDを使って参加しているイベントを表示するウィジェットを作った(wordpress)
イベント支援ツールのATNDをご存知でしょうか?
[ssl url='http://atnd.org/' title='イベント開催支援ツール:ATND(アテンド)']
いろいろと開かれている勉強会に使われているサービスなので、知ってる方も多いと思います。
シンプルな操作性、参加者一覧の見やすさなどで良い事ずくめなのですが、
・自分が参加しているイベントを忘れる
・参加してからあとで開催場所等を確認しようとしても検索しにくい
(まぁEvernoteにでも放り込んでおけばいいんですけど、ついつい忘れてしまう…)
自分のブログ(WordPress)に参加してるATND一覧を表示できたら解決するんじゃないのか?
というわけで、自分が参加してるATNDを表示するウィジェットを作ってみました。
以下の内容をfunction.phpに突っ込めば動きます。
[php]
class wp_atnd_widget extends WP_Widget {
function wp_atnd_widget() {
'description' => '任意のTwitterアカウントで登録した参加中のATNDを表示させます'
);
parent::WP_Widget(false, $name = 'ATND');
}
//管理画面入力フォーム
function form( $instance ) {
$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '' ) );
$title = strip_tags($instance['title']);
$text = esc_textarea($instance['text']);
?>
}
//登録内容のアップデート
function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['filter'] = isset($new_instance['filter']);
return $instance;
}
// 登録内容の表示
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters( 'widget_title', empty($instance['title']) ? '' : $instance['title'], $instance, $this->id_base);
if ( !empty( $title ) ) {
?>
}
define( 'ATND_REQUEST_URL', 'http://api.atnd.org/events/' );
$twiiterAccount = 'okb_m'; // ☆自分のTwitterアカウントを入れてください☆
$url = ATND_REQUEST_URL . '?twitter_id=' . $twiiterAccount;
$resultXml = $this->atnd_request_xml($url);
if(false !== $resultXml){
$xml = new SimpleXMLElement($resultXml);
$maxcount = $xml->results_returned;
$today = date( "Y-m-d", time());
// HTMLとCSSはご自分のテーマに合わせてカスタマイズしてください
$output = '
- ';
for($index = 0 ; $index < $maxcount ; $index++){
$eventdate = substr($xml->events->event[$index]->started_at,0,10);
if(strtotime($today) < strtotime($eventdate)){ // 今日の日付と比較して、新しいイベントのみ表示
$output .= $this->atnd_view($xml->events->event[$index]);
}
}
$output .= '
echo $output;
}
}
// XMLからイベントのURLとタイトルを取り出す
function atnd_view($xml)
{
$html = '
return $html;
}
// ATNDAPIを使ってXMLを取得する
function atnd_request_xml($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // エラーが表示されても出力しない
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 結果を文字列で返す
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // タイムアウト時間
$result = curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
if (200 == $http_status) {
return $result;
}
return false;
}
}
add_action('widgets_init', create_function('', 'return register_widget("wp_atnd_widget");'));
[/php]
追記
@deeeki さんにメソッドのクラス化を指摘されたので、修正。
いろいろと注意点
・Twitterで参加してるイベントのみ対応(他のIDは対応してない)
・取得件数を10件にしているので、10件以上登録されていると出ない
(最新から10件なので、古い終わったイベントは表示されない)
・イベントがキャンセルされても表示される(別のXML取得要求を出す必要があったので、また後日…)
キャンセル待ちが表示されて、キャンセルは非表示になったので対応いらなかった(追記)
・ATNDから取得できるXMLが、イベント順じゃなくて登録された順に取得されるので、ちょっと余計な処理が…
・atnd_viewって関数化しなくてもよかった…
まとめ
最初は、自分が表示させたいがために作っていたんですが、自分で作っている内に、有名ブロガーさんがブログに自分が参加するイベントを表示するように入れておくと、そのブロガーさんとオフラインで会える可能性があっておもしろいんじゃないかなー?とふと思いました。
以上、自己満ブログでしたー
参考リンク
- [ssl url='http://api.atnd.org/#events-url' title='ATND API リファレンス']
- [ssl url='http://blog.jugedred.net/2011/06/20/175906/' title='PHPで「curl_init()」のエラーが出た時の対処法
- [ssl url='http://neoinspire.net/archives/124' title='php cUrl でプロキシを通す方法']
- [ssl url='http://www.ibm.com/developerworks/jp/xml/library/x-xmlphp1.html' title='PHP 開発者のための XML: 第 1 回 PHP での XML を 15 分で学ぶ']