皆さん、Wordpress 使ってますか?2.6 がリリースされ、gears 対応となりましたが・・・それはさておき Wordpress にはプラグインと言う機能追加のためのインターフェースが用意されています。
そんなプラグインですが、イチから作り方の書いてある日本語記事は少なく、「Wordpress を使ってはいるけれど、プラグインは誰かが作ったものを探しているか、見つからなければあきらめている。作り方など知ってるわけないでしょ?ばかなの?しぬの?」という方も割合多いのではないでしょうか。
と言うわけで、今回からしばらく Wordpress プラグインの作り方を連載していきます。
こんな感じで。
- Wordpress プラグインの動作原理
- プラグインをクラスにまとめる
- 翻訳の原理
- 管理画面の設定に設定画面を追加
- 設定内容をデータベースに保存
- どのタイミングでなにが呼ばれるのか
今回は1回目ですので「Wordpress プラグインの動作原理」についてお話します。
アクションとフィルタ
Wordpress には”アクション”と”フィルタ”と言う二つの機能があります。
アクションとは、決められたタイミングに関数やメソッドを実行させるためのインターフェースです。
フィルタもアクションと同様の動作をしますが、アクションとは違い、フィルタの元となる関数やメソッドの返り値をフィルタリングするための値をして受け取って処理します。
Wordpress から見るとアクションもフィルタも任意の関数やメソッドが、フックした関数やメソッドを関数やメソッド内の任意のタイミングで実行させているに過ぎません。
出力する内容を編集(フィルタリング)したいならフィルタ、そうでないならアクション、と言う程度のアバウトな感覚でよいと思います。
フックさせるには
フックとは横から殴るわけではなく、あるトリガに対して関数やメソッドを引っ掛ける(フック)事を言います。
フックした関数やメソッドは、フックされた関数やメソッドが実行されるタイミングで実行される事となります。
アクションもフィルタも Wordpress 本体(以下: wp コア)の随所にトリガとなる場所があります。しかも、トリガとなる場所は任意で増やすことが出来てしまいます。
このトリガと実際に実行される関数やメソッドをフックするために、wp コアでは二つの関数が提供されています。
アクションの場合「ここがトリガですよ」を表すのは do_action()、「○○トリガを通過したらこれを実行して(フック)」を表すのは add_action() です。
例えば Wordpress のデフォルトテーマの footer.php には wp_footer() と言う関数が書かれていますね。
この wp_footer() をトリガにして hogehoge() を実行させたい!と思ったならば以下のように記述します。
add_action( 'wp_footer', 'hogehoge' );
これだけで wp_footer() が実行されるときに hogehoge() も実行されるわけです。
ちなみに add_action() は call_user_func() をラップしているのでインスタンスのメソッドや静的なクラスのメソッドを指定する事も可能です。
僕は global 空間に関数を増やしたくないのでいつも静的なクラスのメソッドを呼び出しています。
オブジェクトを複数生成する必要性がないのでインスタンスも作りません。
その場合は
add_action( 'wp_footer', array( 'hogehoge', 'hugahuga' ) );
と書くことで hugahuga::hogehoge() が呼び出されます。
プラグインの動作原理
このように任意の場所に置かれたトリガに対して任意の関数やメソッドをフックさせるのがプラグインの基本的な動作原理となります。
設定画面にプラグイン用の設定ページを追加するのもアクションで行います。
要するに最低限アクションとフィルタさえ理解していればプラグインは作れるわけです。
フィルタの実践
実際に簡単なプログラムをトリガにフックさせてみましょう。
記事本文に含まれるアンカータグの href 属性を記事末尾にリストとして表示させてみます。
アクションもフィルタと大差なく、トリガが置かれている関数から値が渡されるか渡されないかの違いだけです。
class links { public static function display( $arg ){ echo $arg; if( !preg_match_all( "/href=\"([^\"]+)\"/iu", $arg, $matches ) ) return; $links = array( '<h4>Links</h4>', '<ul>' ); foreach( $matches[1] as $href ) $links[] = "\t<li>{$href}</li>"; $links[] = '</ul>'; echo implode( "\n", $links ); } } add_filter( 'the_content', array( 'links', 'display' ) );
links::display() は the_content() の返り値(記事本文)を受け取り、受け取った値の中に含まれる全ての href 属性を探します。
見つからなかった場合は the_content() から渡された値だけを表示するにとどまりますが、もしひとつでも href 属性が見つかった場合はその URI をリストとして記事末尾に追加します。
上記のソースをテーマの index.php の一番上に貼り付けてみて下さい。
記事の末尾に Links と共に URI がリスト表示されれば成功です。
ね、簡単でしょう?
- 新しい: コモンズ・マーカーの使い方
- 古い: ext.jsのグリッドを1行しか選択できないようにする
コメント:0
トラックバック:8
- この記事のトラックバック URL
- http://spais.jp/php/wordpress-%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b91/2008-07-27/trackback
- トラックバックの送信元リスト
- Wordpress プラグインの作り方(1) - SPaiS より
- pingback - SPaiS - コモンズ・マーカーの使い方 より 2008 年 7 月 27 日
[...] の一つ前の記事から注釈をつけ始めました。 [...]
- pingback - SPaiS - Wordpress プラグインの作り方(2) より 2008 年 7 月 30 日
[...] 前回は「Wordpress プラグインの動作原理」について書きました。 Wordpress プラグインの作り方、2回目の今日は「プラグインをクラスにまとめる」です。 プラグインを作る際、Global な空間 [...]
- pingback - SPaiS - Wordpress プラグインの作り方(4) より 2008 年 8 月 27 日
[...] ミングで任意の関数やメソッドを実行させたい場合は、Wordpress の随所にちりばめられているトリガにフックさせます。 フックの詳しい説明はWordpress プラグインの作り方(1)をご覧下さい。 [...]
- pingback - プログラム » Blog Archive » WordPressのプラグイン作成(1) より 2008 年 10 月 12 日
[...] Wordpress プラグインの作り方 http://spais.jp/php/wordpress-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B91/2008-07-27 [...]
- pingback - やじゅろぐ » WordPressプラグインに挑戦してみたい より 2008 年 10 月 21 日
[...] SPaiS – Wordpress プラグインの作り方(1) [...]
- pingback - wordpress プラグインの作り方 | PHP RSS JavaScript メモ より 2008 年 12 月 28 日
[...] SPaiS – Wordpress プラグインの作り方(1) [...]
- pingback - cocoa*life - WP-Analog: IE6で閲覧すると右上に「アナログ」と表示されるWordPressプラグイン 〜 初めてのWordPressプラグイン作り より 2009 年 1 月 5 日
[...] WordPressのプラグイン作りのポイントは、アクションとフィルタです。 SPaiS – Wordpress プラグインの作り方(1)というサイトに詳しく記されています。 [...]
- pingback - | エゾスタイル より 2009 年 4 月 3 日
[...] SPiSより [...]