WordPress のプラグインは php で作成します。WordPress の各種動作は php の関数で定義されており、それらをフック(独自の関数を追加)することでプラグインが機能します。
プラグインによくあるのは「エントリ本文の特定の文字列(=プレースホルダ)を置き換え(て様々な処理をす)る」ものです。例えば WordPress の基本機能では、エントリ内に <!–more–> と記述すると、エントリ一覧ではその位置までエントリ本文が表示され、続きを読むリンクが追加されます。このような動作をプラグインで実現することができます。以下では、WordPress のプラグインの作成方法を順に説明します。
アクションとフィルタ
プラグインはアクションとフィルタを利用します。それぞれに用意されたフックに、独自の関数を追加することでプラグインとして動作します。現状ではコーディング上、アクションとフィルタは同じものですが、将来のバージョンでは変更があるかもしれないため、目的に応じて使い分けるようにしましょう。
アクション
ユーザが行うと思われるほぼすべてのイベントがフック用に用意されています。アクションはデータベースに対する変更や、変更に伴う任意の処理を行う場合に使います。
アクションの追加:
add_action('アクション用フック', '独自の関数' {, プライオリティ});
フィルタ
フィルタは、データベースに対する変更は行いません。データが表示される際に加工を行い、ユーザーに見えるものを変更します。フィルタ用に用意されているフックは、ほとんどがテンプレートタグです。
フィルタの追加:
add_filter('フィルタ用フック', '独自の関数' {, プライオリティ});
プライオリティ
add_action,add_filter の第3引数「プライオリティ」には実行の優先順位を指定します。フックには複数の関数が関連付けられており、それらの実行の順序を制御しないと不都合がある場合に指定します。通常は省略して良いです。
- デフォルトは10です。
- 0が最優先で、順にプライオリティが下がっていきます。
- 一つのフックに同じプライオリティのアクション,フィルタがある場合は、追加された順に実行されます。
アクション,フィルタの削除
フックに追加されたアクションやフィルタ(の関連付け)を削除するには以下の関数を使います。
アクション,フィルタの削除:
remove_action('アクション用フック', 'アクション用関数');
remove_filter('フィルタ用フック', 'フィルタ用関数');
自分で追加した以外の関数も削除できます。削除はアクション,フィルタの動作を十分理解したうえで行ってください。
プラグインの作成
WordPress には、エントリ本文を出力する the_content というテンプレートタグがあります。例として、これをフックしてテキストファイルをインクルードさせるプラグインを作成します。
php なら readfile(),include() を使えばファイルをインクルードできますが、WordPressではエントリ本文に php を記述して動作させることはできません。Exec-PHP のように php をエントリ本文中で動作可能にするプラグインはありますが、それは嫌という場合に応用できるでしょう。
プラグイン関数(フィルタ、アクション)
プラグインの処理は、以下の通りです。
- 本文中からプレースホルダを検索します。
- プレースホルダで指定されたファイルの内容を取得します。
- プレースホルダをファイルの内容に置換します。
function hoge_include($content)
{
$pattern = '\[include:([\w\-\/]+\.txt)\]';
if(! preg_match_all('/'.$pattern.'/', $content, $files))
return $content;
for($i=0; $i<count($files[0]); $i++) {
$text = file_get_contents(TEMPLATEPATH.'/'.$files[1][$i]);
$content = str_replace($files[0][$i], $text, $content);
}
return $content;
}
エントリ本文中のプレースホルダ [include:ファイル名.txt] を記述した場所に"ファイル名.txt"の内容をそのまま出力します。php ファイルの場合は php の処理を実行する必要があるので、簡単のため今回はテキストファイルのみをインクルード対象とします。
$pattern = '\[include:([\w\-\/]+\.txt)\]';
プレースホルダ[include:ファイル名.txt]の簡易的な正規表現です。
if(! preg_match_all('/'.$pattern.'/', $content, $files))
preg_match_all は、$content 中の $pattern に一致する部分をすべて $files に格納します。preg_match では初めの1件しか検索しないので注意してください。$files は2次元の配列です。
$files[$j][$i] とした場合:
- $j … 正規表現内のどの部分に相当するかを指定します。
- $files[0][$i] … 正規表現全体=プレースホルダ。
例: [readfile:hoge.txt] - $files[1][$i] … 正規表現内の1つめのカッコ()に相当する部分=ファイル名。
例: hoge.txt
- $files[0][$i] … 正規表現全体=プレースホルダ。
- $i … 何件目の検索文字列かを指定します。
for($i=0; $i<count($files[0]); $i++) {
count($files[0]) は正規表現全体に相当する部分の数、つまり検索件数です。
$text = file_get_contents(TEMPLATEPATH.'/'.$files[1][$i]);
$files[1][$i] は正規表現内のファイル名に相当する部分です。TEMPLATEPATH 以下のパスから成るテキストファイルの内容を file_get_contents で $text に取得します。
$content = str_replace($files[0][$i], $text, $content);
$content 内の $files[0][$i] に相当するプレースホルダを $text に置換します。
プラグインファイルの作成
- 作成したプラグインをWordPressに認識させるために、ファイルの先頭に以下のようなコメント形式でプラグインの情報を記述します。
/* Plugin Name: プラグイン名 Plugin URI: プラグインの配布URL Description: プラグインの説明 Author: プラグインの作者名 Author URI: プラグイン作者のURL Version: バージョン */
- 作成したプラグイン関数を、フックするテンプレートタグに関連付けます。
add_filter('the_content', 'hoge_include');これだけで the_content に hoge_include が追加されます。特に問題がないため、第3引数の優先度は省略しています。
プラグインの登録
-
プラグインファイルを http://~/wp-content/plugins 以下にアップロードします。
例: プラグイン名: hoge_include,プラグインファイル名: hoge_include.php -
http://~/wp-admin の[管理画面|プラグイン]を開くと、hoge_include が自動で検出され、一覧に表示されています。hoge_include の"使用する"をクリックします。



[...] triplexxx.jp/archives/112 [...]
[...] って使ってくれる多くのユーザがいて成り立つんだからね。 追記の追記 WordPressのプラグインを作成する | TRIPLEXXXを参考にとりあえずやってみる。 やっぱり本体に手を入れるのではなく [...]
[...] http://triplexxx.jp/archives/112 カテゴリー: WordPress タグ: プラグイン コメント (0) トラックバック (0) コメントをどうぞ トラックバックURL [...]