※下に注釈有り
WordPress のカスタマイズを行っていると、WordPress がどのような SQL を発行しているか確認したい場面があったので、次のようなスクリプトを書きました。
※下に注釈有り
WordPress のカスタマイズを行っていると、WordPress がどのような SQL を発行しているか確認したい場面があったので、次のようなスクリプトを書きました。
[2013-07-12 追加] 公式プラグインディレクトリに「WP Over Network」をリリースしました。管理画面からインストールできます。とりあえずの日本語の紹介はコチラのページになります。
[2013-06-07 追記] GitHub にプラグイン化したものをアップしています。良かったらご利用ください。フォーク歓迎。https://github.com/yuka2py/wp_over_network
WordPress をネットワーク化してマルチサイトを運用する際、ネットワーク上の各ブログの記事の更新情報をホストサイトのホームページなどに一覧表示させるという要件があると思います。
@HissyNC さんの「WordPressマルチサイトネットワークから新着記事を取得するコード(修正版)」を参考にして考えてみましたが、今回はネットワークサイトの更新情報をまとめたアーカイブページを持つ必要があったため、かわりに以下のような方法を行ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?php /** * 投稿日順で、ネットワーク上の全てのブログの投稿を取得する。 * @param mixed $args * numberposts 取得する投稿数。デフォルトは 5 * offset 取得する投稿のオフセット。デフォルトは false で指定無し。指定すると、paged より優先。 * paged 取得する投稿のページ数。get_query_var( 'paged' ) の値または1のいずれか大きな方。 * @return array<stdClass> */ function get_posts_over_network( $args=null ) { global $wpdb; $args = wp_parse_args( $args, array( 'numberposts' => 5, 'offset' => false, 'paged' => max( 1, get_query_var( 'paged' ) ), ) ); extract( $args ); //ページ指定とオフセットの調整 if ( $offset === false ) { $offset = ( $paged - 1 ) * $numberposts; } //《1》ネットワーク上のブログの一覧を取得 $query = sprintf( 'SELECT * FROM %sblogs', $wpdb->prefix ); $blogs = $wpdb->get_results( $query ); //《2》各ブログの投稿データを取得するサブクエリの準備 $sub_queries = array(); foreach ( $blogs as $blog ) { $blog_prefix = ( $blog->blog_id == 1 ) ? '' : $blog->blog_id . '_'; $sub_queries[] = implode(' ', array( sprintf( 'SELECT %3$d as blog_id, %1$s%2$sposts.* FROM %1$s%2$sposts', $wpdb->prefix, $blog_prefix, $blog->blog_id ), $wpdb->prepare('WHERE post_type = %s AND post_status = %s', 'post', 'publish'), )); } //《3》クエリの組み立て $query = array(); $query[] = 'SELECT SQL_CALC_FOUND_ROWS *'; $query[] = sprintf( 'FROM (%s) as posts', implode( ' UNION ALL ', $sub_queries ) ); $query[] = 'ORDER BY post_date DESC'; $query[] = sprintf( 'LIMIT %d, %d', $offset, $numberposts ); $query = implode( ' ', $query ); //《4》問い合わせの実行 $posts = $wpdb->get_results( $query ); $foundRows = $wpdb->get_results( 'SELECT FOUND_ROWS() as count' ); $foundRows = $foundRows[0]->count; //《5》wp_query の書き換え global $wp_query; $wp_query->query_vars['posts_per_page'] = $numberposts; $wp_query->found_posts = $foundRows; $wp_query->max_num_pages = ceil( $foundRows / $numberposts ); return $posts; } |
以下に簡単に解説します。
大きなポイントは、《3》で各サイトの投稿テーブルを UNION ALL してしまうことと、《5》で wp_query を書き換えることです。《5》を行う事によって、wp_pagenavi などのプラグインでページナビゲーションの表示が可能になります。なかなか泥臭いことをやっていますね。 (; ^ω^)
上記の関数は、例えば次のようにして利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php get_header(); the_post(); ?> <section id="content-primary"> <header id="page-header"> <h1><?php the_title() ?></h1> </header> <?php $posts = get_posts_over_network(); wp_pagenavi(); ?> <?php if ( ! empty ($posts) ) : ?> <section class="post-list"> <?php foreach ( $posts as $post ) : switch_to_blog( $post->blog_id ); setup_postdata( $post ) ?> <section id="post-<?php the_ID() ?>" <?php post_class() ?>> <h2>【<?php echo get_bloginfo( $post->blog_id ) ?>】</h2> <h1><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h1> <?php echo get_the_excerpt() ?> </section> <?php restore_current_blog(); endforeach; ?> </section> <?php else : ?> <p>投稿がありません。</p> <?php endif; # End of empty( $posts ) ?> </section> <?php wp_reset_query(); get_sidebar(); get_footer(); |
このサンプルは固定ページを準備して、固定ページのテンプレートに直接上記のコードを書いて、ネットワークブログのアーカイブページとして表示させるイメージです。
これで wp_pagenavi によるページナビゲーションもちゃんと表示されます。もちろんページの移動も可能です。
§
以下は、汎用的に使えるように幾つかオプションを足して、整理したものです。ご参考まで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
<?php class network { /** * ネットワーク上の投稿データを取得します。 * @param mixed $args * numberposts 取得する投稿数。デフォルトは 5 * offset 取得する投稿のオフセット。デフォルトは false で指定無し。指定すると、paged より優先。 * paged 取得する投稿のページ数。get_query_var( 'paged' ) の値または1のいずれか大きな方。 * post_type 取得する投稿タイプ。デフォルトは post * orderby 並び替え対象。デフォルトは post_date * order 並び替え順。デフォルトは DESC で降順 * post_status 投稿のステータス。デフォルトは publish * blog_ids 取得するブログのIDを指定。デフォルトは null で指定無し * exclude_blog_ids 除外するブログのIDを指定。デフォルトは null で指定無し * affect_wp_query wp_query を書き換えるか否か。デフォルトは false で書き換えない。wp_pagenavi など wp_query を参照するページャープラグインの利用時には true とする * @return array<stdClass> */ function get_posts( $args=null ) { global $wpdb; $args = wp_parse_args( $args, array( 'numberposts' => 5, 'offset' => false, 'paged' => max( 1, get_query_var( 'paged' ) ), 'post_type' => 'post', 'orderby' => 'post_date', 'order' => 'DESC', 'post_status' => 'publish', 'blog_ids' => null, 'exclude_blog_ids' => null, 'affect_wp_query' => false, ) ); extract( $args ); //ページ指定とオフセットの調整 if ( $offset === false ) { $offset = ( $paged - 1 ) * $numberposts; } //ブログの一覧を取得 $blogs = self::get_blogs( compact( 'blog_ids', 'exclude_blog_ids' ) ); //投稿データを取得するサブクエリの準備 $sub_queries = array(); foreach ( $blogs as $blog ) { $blog_prefix = ( $blog->blog_id == 1 ) ? '' : $blog->blog_id . '_'; $sub_queries[] = implode(' ', array( sprintf( 'SELECT %3$d as blog_id, %1$s%2$sposts.* FROM %1$s%2$sposts', $wpdb->prefix, $blog_prefix, $blog->blog_id ), $wpdb->prepare('WHERE post_type = %s AND post_status = %s', $post_type, $post_status), )); } //クエリの組み立て $query[] = 'SELECT SQL_CALC_FOUND_ROWS *'; $query[] = sprintf( 'FROM (%s) as posts', implode( ' UNION ALL ', $sub_queries ) ); $query[] = sprintf( 'ORDER BY %s %s', $orderby, $order ); $query[] = sprintf( 'LIMIT %d, %d', $offset, $numberposts ); $query = implode( ' ', $query ); //問い合わせの実行 global $wpdb; $posts = $wpdb->get_results( $query ); $foundRows = $wpdb->get_results( 'SELECT FOUND_ROWS() as count' ); $foundRows = $foundRows[0]->count; //wp_query の書き換え if ( $affect_wp_query ) { global $wp_query; $wp_query->query_vars['posts_per_page'] = $numberposts; $wp_query->found_posts = $foundRows; $wp_query->max_num_pages = ceil( $foundRows / $numberposts ); } return $posts; } /** * ブログの一覧を取得する。 * 返される各ブログの情報を持つオブジェクトは、ブログ名とその Home URL を含む。 * @param mixed $args * blog_ids 取得するブログのIDを指定。デフォルトは null で指定無し * exclude_blog_ids 除外するブログのIDを指定。デフォルトは null で指定無し * @return array<stdClass> */ function get_blogs( $args=null ) { global $wpdb; $args = wp_parse_args( $args, array( 'blog_ids' => null, 'exclude_blog_ids' => null, ) ); extract( $args ); //必要に応じて、where 句を準備 $where = array(); if ( $blog_ids ) { if ( is_array( $blog_ids ) ) { $blog_ids = array_map( 'intval', (array) $blog_ids ); $blog_ids = implode( ',', $blog_ids ); } $where[] = sprintf( 'blog_id IN (%s)', $blog_ids ); } if ( $exclude_blog_ids ) { if ( is_array( $exclude_blog_ids ) ) { $exclude_blog_ids = array_map( 'intval', (array) $exclude_blog_ids ); $exclude_blog_ids = implode( ',', $exclude_blog_ids ); } $where[] = sprintf( 'blog_id NOT IN (%s)', $exclude_blog_ids ); } //クエリの組み立て $query[] = sprintf( 'SELECT * FROM %sblogs', $wpdb->prefix ); if ( $where ) { $query[] = "WHERE " . implode(' AND ', $where); } $query[] = 'ORDER BY blog_id'; $query = implode( ' ', $query ); //問い合わせの実行 $blogs = $wpdb->get_results( $query ); //各ブログの情報を取得 foreach ( $blogs as &$blog ) { switch_to_blog( $blog->blog_id ); $blog->name = get_bloginfo('name'); $blog->home_url = get_home_url(); restore_current_blog(); } return $blogs; } /** * 投稿データをブログとともにセットアップする。 * 内部的に switch_to_blog を使っているので、呼び出した後の処理が終わったら、 * restore_current_blog() を都度コールする * @param array $post 投稿データ。$post->blog_id を保持していること。 * @return void */ function setup_postdata_and_switch_to_blog( $post ) { switch_to_blog( $post->blog_id ); $post->blog_name = get_bloginfo( 'name' ); $post->blog_home_url = get_home_url(); setup_postdata( $post ); } } |
上記は、最初のサンプルとほぼ同様に、次のようにして利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php get_header(); the_post(); ?> <section id="content-primary"> <header id="page-header"> <h1><?php the_title() ?></h1> </header> <?php //ホストブログを除いた一覧の取得。wp_pagenavi を利用するため、affect_wp_query=true とする $posts = network::get_posts('exclude_blog_ids=1&affect_wp_query=true'); wp_pagenavi(); ?> <?php if ( ! empty ($posts) ) : ?> <section class="post-list"> <?php foreach ( $posts as $post ) : network::setup_postdata_and_switch_to_blog( $post ); ?> <section id="post-<?php the_ID() ?>" <?php post_class() ?>> <h2>【<?php echo $post->blog_name ?>】</h2> <h1><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h1> <?php echo get_the_excerpt() ?> </section> <?php restore_current_blog(); endforeach; ?> </section> <?php else : ?> <p>投稿がありません。</p> <?php endif; # End of empty( $posts ) ?> </section> <?php wp_reset_query(); get_sidebar(); get_footer(); |
以上です。
WordPress Advent Calendar 2012 の参加記事、18日目担当 @yuka2py ことノジマです。昨日の担当 odyssey 先輩のご担当よりの引き継ぎですよー。頑張ります。
おっと。でも今日のご担当は僕一人じゃないですか。いやん。まいりました。責任重大ですね。純粋に勢いに任せて参加表明してしまったのですが、何を書こうやら今を持って悩んでます (^_^;A 既に執筆された諸先輩方の記事を改めて眺めさせて頂きましたよ。まあいいや。自然に書こう。自然に。
§
最近忙しかったので、自分のサイトにログインしていませんでしたよ。サイトはもちろん WordPress ですよ。サイトを開いたら画面上の黒いバーがありませんね。下の方に行って「ログイン」ボタンからログインしてみたら…
「WordPress 3.5 が利用可能です ! 更新してください。」
そうか、もうそんな季節でしたか…。えいや! ままよ! 更新しちまえ!(自分のサイトがまず実験台)。おもむろに更新開始。
いつもの更新画面…更新完了。派手な更新完了画面。素晴らしい。おっと、プラグインもアップデートがいるのね。GO。まぁ、テーマもアップデートあるのね。使ってないテーマだけど、GO。プラグインの更新状況がズンズンと表示されていきますね。素晴らしい。
一通り更新完了。本題「アドベントカレンダーのブログを書く」に入ろうとしたら、更新画面が↓こんなの出てた。ヘー。なるほど。画像とか管理する例のアレが使い勝手良くなったらしい。どれどれ。
ほう。なるほど。素晴らしい。WordPress 歴の浅い僕にとっても、これは前のよりずいぶん良くなった気がしますよ。使い易いし、変わっても違和感無く使えます。素晴らしい。凝った画面に感心したところで、意地悪な僕なので、どれどれとウィンドウの横幅を変えて楽しんでみましたが、見事にこんなところまで高度にレスポンシブ対応されています。素晴らしい。なんだこれ。素晴らし過ぎる。
いやー。素晴らしい!
僕はシステムエンジニアです。ソフトウェア開発がお仕事です。色々書きますよ。色々作りますよ。でも何をするのも、思うより結構大変なんですよ。小さな事でつまづくんですよ。5分で出来ると思ってたら3日掛かることもあるんですよ(たまに逆もあるけれどw)。お客様が簡単だよね?って言う事ほど難しかったりするんですよ。で、それで、こんな画面どうですか? 見積もりしたらお客様もびっくりですよ。こんなアップグレードのフレームワークは如何ですか? 自分で作るなんてワー!タイヘーン ε=ε=ε=ヽ(|||; >д<)ノ ですよ。というか、時代に合わせて保守更新していくのだけでも大変なんですよね。
それで、なんでこんな素晴らしい WordPress が無料で使えるんだろうか?
いやいやそれ以上に、一体誰が WordPress を作ってるんだろうか?
世の中にオープンソースのプロダクトは沢山ありますよね。概ね無料で自由に使える。どの製品にも共通して言えることだけれど、誰かがその製品を作ってるんですよね。きっとすごく労力を使っていると思う。そして僕らはそれを利用させて頂いている。無料で? …いや、わかんない。ここのところ、最近は無料だと思わない方が良いように思って来ました。
いや、あんまり優等生的な事を言うつもりは無いんですよ。でも、「タダより高いものは無い」なんて昔から言うじゃないですか。だから僕らはお世話になっている WordPress さんにも積極的に対価を支払うほうが良いと思うんですよね。その方が自分も気持ち良い(はず!)。
オープンソースプロダクトのメンテナンスに携わっている人々への感謝の気持ち、これは有って然るべきものであると思うけれども、でもでも、感謝だけじゃなくって、僕らはきっと何か貢献できると思うんですよね。「私には何も出来ない」とかじゃなくって「出来るはず」だし、それって因果応報、きっと自分に帰ってくる。ちょっと具体的には、自分が作ったプラグインやテーマを単に公開するだけでも良いと思う。それが誰かに使われて、誰かの役に立てばそれが貢献。気付いたこと、覚えた事をブログに書くのも良い。きっと誰かの助けになる。それも貢献。そうやって自分も含めたユーザーが世界を広げて、広がった世界がより多くのユーザーと繋がって、そして製品がより素晴らしいものになっていくんだろーなーと思う。
とはいえ! 僕も、「じゃあアナタは何か出来ていますか?」と真剣な眼差しで問われると「う〜ん。微妙 (#^.^#)」と照れちゃう程度なので、まぁまぁ、これから♪ エンジニアだし、とりあえずはプラグインとか作って公開したいよね。いや、しちゃいますよ。ただ WordPress って「これエエんちゃうん?」と思ったアイデア、既にあったりして、しかも凄いプラグインとかだったりして、まぁ、やばいやばいw まぁ、いいや、そこも気楽に行こう。貢献しなきゃ、って焦る必要は少しもないんだから。
オレ得気分でもいい。WordPress という世界で、僕らはきっと何か出来るのですよ。(=゜ω゜)ノ
§
という感じで、ネタに悩んでいたところ、WordPress のアップグレード画面を見てて思ったことを書いちゃいました。ネタ候補は幾つかあったんですよ。でもどれもパッとしなかったので。まあこれも大した話でも無かったので、申し訳ないです。とはいえ、また感動したので書きました。「WordPress すごい!」って思うと同時に、「みんな本当にありがとうございます」と思えた。僕も改めてプラグインとか作っちゃおうとか思えたし、仕事の中でも自分に何か残るような仕事の仕方をしなきゃなーと思いました。さて、頑張ろう頑張ろう。明日元気でいるために。
ちなみに、2012/12/15日現在で、WordPress 3.5 に上げて各種プラグインを全部アップデートしたのですが、Jetpack の Photon を有効にしていると投稿本文に貼った画像が何故か 150×150 のサムネールになってしまうという現象に遭遇。とりあえず Photon を off にしました。他は概ね大丈夫みたいです。素晴らしい。Jetpack もまたアップデートされて問題が解消されるでしょうー。
さて、明日は僕もみんなも憧れの額賀さんですね。光栄です!よろしくですわよー ヽ(*´∀`)/
11/10 開催の 第17回 WordBench 神戸に参加させて頂きました。
今回僕の発表予定は無かったのですが、前日「Jetpack」という WordPress のプラグインを知って感動したので、急遽お時間を頂いてLTをさせて頂きました。Jetpack は Automattic 社謹製のプラグインで、WordPress.com で提供されている便利な機能を、自分の WordPress サイトにも導入できるユーティリティパッケージプラグインです。WordPress 業界?では有名なプラグインということですが、僕は知らなかったので感動。ちょうど2.0になったばかりとのことで、有名なものでも自分の感動を共有したく、LT発表させて頂きました。以下、発表したスライドになります(Web公開にあたって少し内容調整しています)。
上記スライドでも紹介していますので、ここでは詳細は割愛いたしますが、ニーズの高そうな機能を一つにパッケージしたこのプラグインはシンプルで良いですね。各機能の幾つかには、高機能な専用プラグインが別の開発元からリリースされているものもありますが、単体パッケージでここまで出来るのは便利ですし、メンテナンス性も高いように思います。Automattic 社謹製というのも、安心ですね。
注目すべき機能の1つとして、「Photon CDN」をスイッチ ON でとても簡単に利用できるようになっています。この Photon CDN は単純なCDN機能だけではなく、画像のリサイズ、トリミング、そしてフィルターの適用など、オリジナル画像に様々な加工を施した画像を取得できるようになっています。アイデア次第で色々な事ができるのではないでしょうか? WordPress サイトからの利用のみ許可されているようですが、(たぶん)無償で利用できるサービスです。是非一度その機能の概要だけでもご確認ください。
今回の全体のプログラムは以下のような内容でした。
今回、私的に楽しみにしていたのは、冒頭の Initializer/Boilerplate のセッションです。Initializer は知っていたのですが、Boilerplate というのは初耳。憧れの @pictron2009 氏による解説で、概要を知ることが出来ました。Initializer も Boilerplate も Web フロントエンドを利用する際のベースできるファイルセットです。「Boilerplate」の方がプレーンで、どのようなコンテキストでも必須となるであろうものを集積しています。このセットの内容が、最新の Web フロントエンドの開発セットのベストプラクティスではないかとの事です。採用しないまでも、このファイルセットが選ばれた意義、意味合いを考察することで最新の Web の流れを感じ取ることが出来そうに思います。
「Initializer」は Boilerplate ベースのプロジェクトで、より実践的です。Boilerplate から一歩進み、プレーンHTML5、レスポンシブWebデザイン、Twitter Bootstrap の利用という3つのコンテキストから、自分のプロジェクトに適合するファイルセットを選択してダウンロードできます。また、幾つかのコンポーネントは要否を選択もできます。
Initializer は前々から使おうと思っていたのですが、WordPress を最近弄っていたこともあり、なかなか機会が無く使えていません…。と思っていたんですが、Boilerplate ベースの WordPress テーマもあると教えて頂きました。なんと! 次の WordPress のテーマ作成の際には是非検討してみたいと思っています。
@bren_boss さんの WordPress 3.5 の変更点の紹介も面白かったですね。細かな変更点が多いようですが、個人的には「メディアライブラリ」の改良に期待!という感じです。また管理画面のメニューから「リンク」が割愛されるようです。機能的には残っているらしいとのことですが、管理画面のメニューから割愛されるということで、今後の利用や活用には注意が必要かも知れませんね。
次いで GPL ライセンスの話題。難しいトピックですが、@bren_boss さん、@uemera さん、@nipper_onside さん等が頑張って解説してくださいました! 僕的な理解の要約は以下の通りです。もし間違ってる部分あればご指摘頂けたら嬉しいです。
ライトニングトークは、僕(@yuka2py)と上村さん(@uemera)です。僕のは上に書いたとおりです。上村さんによる WordBench 神戸の歴史紹介も興味深かったです。
11月3日、大阪の天満研修センターで行われた「WordCamp Osaka 2012」にスタッフとして参加、また僭越ながら僕も「エンジニアの為の WordPress入門 〜WordPressはWebAppプラットフォームです〜」というタイトルで登壇をさせて頂く機会も頂きまして、とても有意義な一日となりました。この記事では当日の僕の周りの様子などを簡単にまとめさせて頂きました。
朝 8:00 集合。列車の遅延でギリギリ到着となった僕 (^_^;A。でも、なんとか滑り込みセーフ。既に大勢のスタッフの方で熱気ムンムン。程なくセンター内に移動してスタッフ説明会。僕の役割はサービスカウンターでのお客様からのご質問対応などです。スタッフTシャツを着て持ち場に移動。既にサービスカウンターなどのセットアップは完了していて、前日からご準備頂いていた実行委員やスタッフの皆さんに感謝です! そして開場。最初は少しずつでしたが、やがてドババっとお客様が入場されて来て凄いなー状態。しかし、受付の皆さんの尽力でスムーズに入場は進んだ模様です。さすが!
やがてサービスカウンターにも質問者の方が…。どのセッションを聞いたら良いのか、という内容から、現実に目の前に WordPress 案件が入って来てどのように対処したものか?という具体的な質問までありまして、頑張ってお答えいたしました。少しでもお役に立てたのであれば良いなーと思っています。
11時頃までサービスカウンターをお手伝いして、一旦スタッフルームへ。11:50から自分の担当のセッションがあったので、その準備です。あと1枚出来ていないスライドがあります。色々手直ししたいところも有るのですが、とりあえずその未完成の1ページはなんとか完成させないと…。セッションでどうしても伝えたい一番大事な言葉を、その1枚に込めました。完成したスライドは我ながら結構なボリューム。40分の持ち時間でお話できるのかしら?
それからしらばらく待機。このような大きなイベントで登壇させて頂くのは初めてなので緊張です…。同じ時間帯に登壇される他のスピーカーの皆さんがいらっしゃいましたので、ちょっとだけご挨拶。でも緊張でお話もそこそこに。トイレに行ったり、座ったり、立ったりと落ち着きません。余計に緊張するので、セッションのリハなどは止めておきました。MacBook Air はパタリと閉じて、僕もちょっぴり目を閉じて。
やがて、前のセッションが終わったようです。観念してセッションの部屋へ移動。途中、行列が出来ている部屋。「すごいなー」と横見しつつ奥の部屋へ。ドア付近まで来て、違うな、と気付きます。そこは大部屋、僕小部屋…。あれ?と思ってフロアマップを見ると、どうやらさっき通り過ぎた行列の部屋が僕の担当みたいです。びっくり…。自分では、かなりニッチな層を対象にしたセッションだと思っていたので、シケシケではないかと心配していたぐらいだったので…。
すみませーん…と列の間を割って部屋に入ったら、部屋の中に友人のたきぐちさんが司会担当で居てくれてだいぶホッとしました。まぁ、もう喋るしかない。諦めも肝心。そう思って MacBook をセットアップしていると、少しずつ気持ちも落ち着いて来ました。まあ、なんとかなるでしょう!
お話したスライドは以下になります。
この資料では、WordPress のカスタマイズを、 エンジニア寄りの視点で、解説させていただきます。WordPressのカスタマイズはこれからだけど、PHPには精通されている方、一般的なWebアプリケーションフーレムワークでの開発の知識のある方などを主な対象として、当初つまずきやすいと思われる箇所や、私個人が疑問に思った箇所、気付くのに時間が掛かった箇所などを紹介させていただいています。
内容が盛りだくさんだったので、だいぶ急いで喋ったつもりですが、それでも時間オーバー。運営スタッフ各位にご迷惑をお掛けしたと思います。また、後半かなり駆け足となりましたので、聞きに来ていただいた来場者の皆さんにも大変申し訳なく思っています。この場をお借りしてお詫び申し上げます。もしよければ、スライド資料を改めてご一覧いただけたらと思います!
とは言え、思ったよりは上手く喋れたと思います。後の動画配信で鼻水を出す事は必須だとは思いますが、それでも、もっとグダグダになるかと思っていたので、ワリとマシでした。ここ最近 WordBench 神戸などでお話させていただいていたからかなーと思います。
自分のセッションを終えてからはしばらく放心状態。セッションの時間をオーバーしてしまったこともあり、聞いてくださった方の感想はほとんど聞けなかったのが残念。僕のセッションを聞いていただいた皆様、もし良かったら良いものも悪いものも、どこかで感想いただけたら嬉しいです。
セッション後の僕は基本的にはお役御免ということだったので、1つだけ他のセッションに聴講させて頂きました。
「おすすめ開発ツール談義」
http://2012.osaka.wordcamp.org/timetable/302-5/
NetBeans も Dreamweaver も使った事があったので、この日聞きたかったのは「Coda」の話。僕も1年位前から Mac の人なので、Coda の噂はチラホラ気になっていました。ただ僕は Android の開発もあるのでとりあえず Aptana を利用中。なので、この機会に、Coda の良さを知りたかった次第ですが、この日はとてもラッキーでした。スペシャルゲストとして Coda 2 開発元のパニックの長谷川さんも登壇されて Coda の魅力が紹介されていました。短い時間でしたので、機能の全体を俯瞰することは出来ませんでしたが「CSS に強い」というのはハッキリと分かることができました。是非試用してみたい!と思ったのですが…むむむ、使用期間が7日間しかなくて、私のお小遣いで買うにはちょっと高く、しばらくは我慢しないとな…と思っています。試用期間がエディタが体に馴染むか分かるぐらい…たとえば3ヶ月ぐらいあれば嬉しいなぁ…とボソっとつぶやいておきます。 (;゚∀゚)
主題に戻って、NetBeans も Dreamweaver も Coda も Eclipse も、そして Emacs も vim も、エディタはどれも得意分野が異なっていて、それぞれの分野で優秀で、面白いですね。どれも優劣では無いように思います。そんな中、Coda はこれまで想像していた通り、新しく僕の優れたパートナーの一つになってくれる予感がしました。なので、なんとか早い時期に使ってみたいなーと思います。
他のセッションも拝見したいものは沢山あったのですが、今回聴講者として参加できたのはこのセッションだけとなりました。残念ですが、おそらく、後日 WordCamp Osaka 2012 の公式サイトになどに動画やスライドなどが掲載されるかと思っていますので、そちらで聴講させて頂くつもりです。
数ヶ月前。実行委員のたきぐちさんから WordCamp Osaka 2012 での登壇を依頼された時は嬉しい反面、僕につとまるものか心配していました。実際、資料の準備はだいぶ前から始めましたが、なかなかまとまらずに困り果て、そして結局当日のギリギリに何とか仕上げることが出来たという体たらくでしたが、それでもお引き受けして良かったです。僕にとってはとても新しい経験になりました。
WordPress と出会ったのは1年ぐらい前。それ以前の僕とは視界がだいぶ違っていることに、自分自身で気付いています。開発者としてもそうですし、デザイナーとしても、プランナーとしても、そしてもちろん僕という人間にとっても。それは WordPress という製品だけでなく、それを取り巻くコミュニティの存在があったからこそです。ずっと机に向かいがちだった僕ですが、最近は少し窓の外を気にして、ドアを開けて、表を歩くことに興味を抱けるようになりました。今日よりも明日、もうちょっと遠くまで出掛けてみたいなー、と今はそう思っています。
そんな僕にとって、今回の WordCamp Osaka 2012 は、ちょうど良い冒険でした。臆病な僕なのですが、これからはより、いつも同じ道を歩くのではなくて、少しでも別の道を、顔を上げて、そして出来るだけにこやかに歩いていきたいなーと思っています。
…ということで、一緒に歩いてくれる人、募集中ですw(可愛い方 優遇ですw)