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

2012/05/24

WordPress

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

ジャカルタ

インドネシアのITサービス

インターネット技術の急速な発展と普及により、優秀なIT人材を輩出することで知られるジャカルタのビヌス大学(BINUS)やバンドゥンのバンドゥン工科大学、インドネシアコンピューター大学(UNIKOM)の学生の多くがインターネット・WEB業界やソフトウェア業界を志望するようです。

続きを見る

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に関数を追加したのと同じことを、プラグインという形でパッケージ化していることになります。プラグインはテーマから分離されているのでテーマを替えても機能します。

WordPress

WordPressによるWEBサイト開発1 - MVCモデル的な設計

投稿される情報をユーザー単位に時系列に保存し、「会計システム」「インドネシアの税法」というようなカテゴリ、または「PPN」「WordPress」というようなタグ単位にフィルタして表示できるのがWordpressの最大の強みであり、これらカテゴリやタグなどの投稿記事の切り口(分類)をタクソノミーと呼んでいます。

続きを見る

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')のタイミングでプラグインを実行させることで分岐させることができます。

WordPressの起動

WordPressの起動2 - WordPress起動時に読み込まれるコアファイルの順番

index.phpはWordPressのエントリーポイントでwp-blog-header.phpを通して環境設定ファイルwp-load.phpを呼びwp-config.phpの中でDB接続情報を読み込み、WordPressメイン関数を実行実行してtemplate-loader.phpの中でテンプレートを選択します。

続きを見る

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

WordPress

WordPressによるWEBサイト開発2 - テンプレート階層とテンプレートタグ

WordPressを使った企業サイト開発のためには、テーマを構成するテンプレートファイルの構成、ページを構築するHTMLタグの書き方、テーマの中で使用される関数の分類、そしてテーマの見た目を装飾するスタイルシートの書き方についての理解が必要になります。

続きを見る

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');