WordPressによるWEBサイト開発3 – プラグインの開発

ここでは通常のクライアントアプリのプラグイン開発と比較した上で、WordPress投稿本文中の「おはよう」という文字列を「Selamt pagi!」に変換する簡単なWordPressプラグインを作ってみます。

Asprovaのプラグイン開発

Standard EXE(オートメーションクライアント)はAsprovaの関数を任意のタイミングで呼び出しますが、DLL(プラグイン)はAsprovaのアクセスポイントのタイミングでフックされ呼び出されるイベントドリブン型です。

プラグインDLLはAsprova起動時にロードされ、AsDefaultクラスのAutoRegistration関数に、プラグインキー(アクセスポイント)に対応するフックとエントリ関数をマッピングすることで、イベント発生時にエントリ関数を実行します(「COMインターフェイスを通したAsprovaの機能の拡張」より)。

この例ではKeyHookGeneric(追加したコマンドが起動するタイミング)のアクセスポイントでプラグイン関数を実行します。

Option Explicit
Public Function AutoRegistration(plugInManager As ASPPlugInManager, module As ASPModule) As Boolean
    'このモジュールのコメントを設定します
    module.Comment = "APS Extended Functionality PlugIns (VB)"

    'プラグインオブジェクトを保持する変数を定義します
    Dim plugIn As ASPPlugIn

    'オーバータイムを計算しカレンダーテーブルにセット
    Set plugIn = plugInManager.AddASPlugIn("オーバータイムを土曜出勤に組み込む", "Factory1.OverTime", "AddOverTime", ASPlugInKeyName.KeyHookGeneric)

    'プラグインに対するコメントを設定します。
    plugIn.Comment = "オーバータイムを平日残業2時間と土曜2シフト出勤に割り振る。"

    'プラグイン呼び出し順(同一プラグインキーのプラグインが複数あったときのため)
    plugIn.Order = 1

    '自動登録が正常に行われたという事でTrue を返します。
    AutoRegistration = True
End Function

Factory1というプロジェクトのOverTimeクラスのAddOverTime関数を、Asprovaコアシステム内ロジックにあるKeyHookGenericというアクセスポイントのタイミングで実行するという意味になります。

WordPressのアクションフックとフィルターフック

WordPress本体(コアシステム)のロジック内に、do_actionとかapply_filterとかでキーが仕込んであるので、開発するプラグイン関数の中に、キーと紐付けするためのadd_actionとかadd_filterという命令を記述します。

WordPress本体でロジックが実行され動作するときには必ずアクションが起動され、出力がされる時には必ずフィルターが起動されます。

  • アクションフック(動作)
    1. WordPress本体 do_action($key, $args);
    2. プラグイン関数 function 関数1(){処理実行}
    3. フック add_action($key, 関数1);
  • フィルターフック(出力)
    1. WordPress本体 apply_filter($key, $value);
    2. プラグイン関数 function 関数2(){処理実行}
    3. フック add_filter($key, 関数2)

例えばアクセスポイントthe_contentで関数を実行させるプラグインを開発する場合、/wp/wp-content/plugins以下のプラグインフォルダの中に以下を実現するphpファイルを格納されます。

  1. プラグイン関数(function)
  2. フック(add_filter関数でWordPressアクセスポイントとプラグイン関数のマッピング)

WordPress本体のアクセスポイントにはapply_filters()関数でフックが埋め込まれていますので、アクセスポイントのタイミングでプラグインが実行されます。

これはテーマファイルであるfunctions.phpに関数を追加したのと同じことを、プラグインという形でパッケージ化していることになります。プラグインはテーマから分離されているのでテーマを替えても機能します。

functions.phpからアクセスポイントinitのタイミングで関数を実行

ユーザーのログインの有無はis_user_logged_in()関数で判断し、ログインしていない場合はauth_redirect()関数でログイン画面にリダイレクトさせます。

この処理をfunctions.phpからWordPress起動時に実行させれば全ページに適用され、header.phpにページの種類や投稿IDによってログインの有無をチェックさせれば会員制ページになります。

<?php
if(!is_user_logged_in()){
	auth_redirect();
}
?>

WordPressにアクセスしたユーザーがログインしているか否かを、wp-settings.phpのdo_action(‘init’)のタイミングでプラグインを実行させることで分岐させることができます。

functions.phpは、WordPressテンプレートファイルの中でもユーザー関数を集めた色違いですが、WordPress起動時にwp-settings.phpの中でインクルードされロードされます。

function my_require_login(){
	global $pagenow;
	if(!is_user_logged_in() && $pagenow !=='wp-login.php'){
		auth_redirect();
	}
}
add_action('init', 'my_require_login');

プラグインからアクセスポイントthe_contentのタイミングで投稿本文の文字列を置き換える

メタ情報・プラグイン関数・フィルターフックを記述したPHPファイルを/wp/wp-content/plugins/yamazou-plugin/selamat-pagi.phpにアップします。

/wp-includes/post-template.phpにコンテンツを表示するthe_content関数がありますが、ここにthe_contentというアクセスポイント(フック)がapply_filters()関数によって埋め込んであります。

/**
 * Display the post content.
*/
function the_content( $more_link_text = null, $strip_teaser = false) {
	$content = get_the_content( $more_link_text, $strip_teaser );
	$content = apply_filters( 'the_content', $content );
	$content = str_replace( ']]>', ']]&gt;', $content );
	echo $content;
}

やるべきことはthe_contentというアクセスポイントのタイミングで、実行させたい自前の関数を定義し、add_filter()関数でマッピングすることです。

<?php
/*
Plugin Name:おはようSelamat pagi!
Description:おはようをSelamat pagi!に変換
Author:yamazou
*/
/*プラグイン関数*/
function selamat_pagi($content){
 return str_replace('おはよう','Selamat pagi!',$content);
}

/*フック*/
add_filter('the_content','selamat_pagi');
?>

後はプラグイン画面からおはようSelamat pagi!を有効化にするだけですが、phpファイルはUTF-8 BOMなしにしないと、プラグインメニューが文字化けします。

管理画面の作成(アクセスポイントadmin_menu)

「おはよう」と入力した場合に変換される文字を、管理画面からパラメータとして渡し自由に変更できるようにします。WordPress Codexによると管理メニューを作るには以下の3つが必要です。

  1. メニューを作成するコードを含んだ関数を作る
  2. “admin_menu”フックで作った関数を登録する
  3. メニューがクリックされたときに表示されるページのHTML出力を作る
/*メニューを作成する関数*/
function selamat_pagi_admin_menu(){
  add_menu_page(
    'おはようSelamt pagi!',      //page_title
    'おはようSelamt pagi!設定',  //管理画面メニュー
    'administrator',            //アクセス権限
    'selamat_pagi_admin_menu',  //file
    'selamat_pagi_edit_setting' //プラグイン関数名
  );
}
add_action('admin_menu','selamat_pagi_admin_menu');

/*メニューとフォームのマッピング*/
function selamat_pagi_edit_setting(){
  if(isset($_POST['ohayou'])){
    update_option('selamat_pagi_plugin_value',$_POST['ohayou']);
  }
  $ohayou=get_option('selamat_pagi_plugin_value');

/*管理画面のメニューがクリックされたときの入力フォーム*/
echo<<<EOD
<h4>おはようSelamat pagi!</h4>
<form action="" method="post">
  <input type="text" name="ohayou" value="{$ohayou}" />
  <input type="submit" value="save" />
</form>

EOD;
}

次に管理画面のテキストボックスに入力された値をパラメータとして受け取り変換するよう修正します。

/*
Plugin Name:おはようSelamat pagi!
Description:おはようをSelamat pagi!に変換
Author:yamazou
*/

/*「おはよう」を「Selamat pagi!」に変換*/
function selamat_pagi($content){
	$ohayou=get_option('selamat_pagi_plugin_value');
	return str_replace('おはよう',$ohayou,$content);
}
add_filter('the_content','selamat_pagi');