ここでは通常のクライアントアプリのプラグイン開発と比較した上で、WordPress投稿本文中の「おはよう」という文字列を「Selamt pagi!」に変換する簡単なWordPressプラグインを作ってみます。
-
-
インドネシアのIT業界|市場動向・セキュリティ課題・日系企業の戦略
インドネシアのIT業界はインターネット技術の発展により急速に成長している。インドネシアでは違法コピーが多く、KMS認証クラックがマルウェアの標的になりやすい。インドネシアのサイバー攻撃は元社員による怨恨が原因であることが多い。
続きを見る
この記事でわかること
- WordPressのアクションフックとフィルターフックを使って投稿本文の文字列を置換できる。
- WordPressプラグインで管理画面を作成し、ユーザーが変換文字列を設定できるようにする。
- プラグインを作成する際には、PHPファイルをUTF-8 BOMなしで保存する必要がある。
- WordPressのアクセスポイントにフックを追加することで、特定のタイミングでカスタム関数を実行できる。
- 管理画面からの入力を利用して、動的にコンテンツを変更するプラグインを開発できる。
Asprovaのプラグイン開発
Factory1というプロジェクトのOverTimeクラスのAddOverTime関数を、Asprovaコアシステム内ロジックにあるKeyHookGenericというアクセスポイントのタイミングで実行するという意味になります。
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
WordPressのアクションフックとフィルターフック
WordPress本体のアクセスポイントにはapply_filters()関数でフックが埋め込まれていますので、アクセスポイントのタイミングでプラグインが実行されます。
これはテーマファイルであるfunctions.phpに関数を追加したのと同じことを、プラグインという形でパッケージ化していることになります。プラグインはテーマから分離されているのでテーマを替えても機能します。
-
-
WordPressで業務系システムは可能か?参照系との違い・MVC構造・カスタム投稿タイプ
WordPressは参照系システムに向いている。WordPressはMVCフレームワークではないが、MVCのような動きをする。WordPressのカスタム投稿タイプはfunctions.phpで定義できる。
続きを見る
アクセスポイントthe_contentで関数を実行させるプラグインを開発する場合、/wp/wp-content/plugins以下のプラグインフォルダの中に以下を実現するphpファイルを格納されます。
WordPress本体(コアシステム)のロジック内に、do_actionとかapply_filterとかでキーが仕込んであるので、開発するプラグイン関数の中に、キーと紐付けするためのadd_actionとかadd_filterという命令を記述します。
WordPress本体でロジックが実行され動作するときには必ずアクションが起動され、出力がされる時には必ずフィルターが起動されます。
- アクションフック(動作)
- WordPress本体 do_action($key, $args);
- プラグイン関数 function 関数1(){処理実行}
- フック add_action($key, 関数1);
- フィルターフック(出力)
- WordPress本体 apply_filter($key, $value);
- プラグイン関数 function 関数2(){処理実行}
- フック add_filter($key, 関数2)
- プラグイン関数(function)
- フック(add_filter関数でWordPressアクセスポイントとプラグイン関数のマッピング)
functions.phpからアクセスポイントinitのタイミングで関数を実行
WordPressにアクセスしたユーザーがログインしているか否かを、wp-settings.phpのdo_action('init')のタイミングでプラグインを実行させることで分岐させることができます。
-
-
WordPressの起動2|読み込まれるコアファイルの順番
WordPressの起動時に読み込まれるコアファイルの順番を理解できる。index.phpがWordPressのエントリーポイントとして機能する。wp-config.phpはWordPressのインストール時に自動生成される環境設定フ…
続きを見る
functions.phpは、WordPressテンプレートファイルの中でもユーザー関数を集めた色違いですが、WordPress起動時にwp-settings.phpの中でインクルードされロードされます。
-
-
WordPress企業サイト開発|テーマ構成・テンプレート階層・タグ活用・CSS装飾まで
WordPressテーマの構成とテンプレート階層を理解できる。子テーマを用いたテンプレートファイルのカスタマイズ方法を学べる。HTMLタグの種類とその役割を知ることができる。
続きを見る
ユーザーのログインの有無はis_user_logged_in()関数で判断し、ログインしていない場合はauth_redirect()関数でログイン画面にリダイレクトさせます。
この処理をfunctions.phpからWordPress起動時に実行させれば全ページに適用され、header.phpにページの種類や投稿IDによってログインの有無をチェックさせれば会員制ページになります。
<?php
if(!is_user_logged_in()){
auth_redirect();
}
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のタイミングで投稿本文の文字列を置き換える
後はプラグイン画面からおはようSelamat pagi!を有効化にするだけですが、phpファイルはUTF-8 BOMなしにしないと、プラグインメニューが文字化けします。
やるべきことはthe_contentというアクセスポイントのタイミングで、実行させたい自前の関数を定義し、add_filter()関数でマッピングすることです。
メタ情報・プラグイン関数・フィルターフックを記述した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( ']]>', ']]>', $content );
echo $content;
}
<?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');
?>
管理画面の作成(アクセスポイントadmin_menu)
次に管理画面のテキストボックスに入力された値をパラメータとして受け取り変換するよう修正します。
「おはよう」と入力した場合に変換される文字を、管理画面からパラメータとして渡し自由に変更できるようにします。WordPress Codexによると管理メニューを作るには以下の3つが必要です。
- メニューを作成するコードを含んだ関数を作る
- "admin_menu"フックで作った関数を登録する
- メニューがクリックされたときに表示されるページの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');
よくある質問|WordPressプラグイン開発
本稿の内容に沿って、繰り返し出る問いを短く整理します。
WordPressで投稿本文の文字列を置換するにはどうすればいいですか?
WordPressで投稿本文の文字列を置換するには、the_contentというアクセスポイントのタイミングで自作の関数を定義し、add_filter()関数でマッピングします。これにより、投稿本文中の特定の文字列を別の文字列に変換することができます。
WordPressプラグインで管理画面を作成するにはどうすればいいですか?
WordPressプラグインで管理画面を作成するには、admin_menuフックを使用してメニューを作成する関数を登録します。メニューがクリックされたときに表示されるページのHTML出力を作成し、ユーザーが入力した値をパラメータとして受け取るようにします。
WordPressプラグインで文字化けを防ぐにはどうすればいいですか?
WordPressプラグインで文字化けを防ぐためには、PHPファイルをUTF-8 BOMなしで保存する必要があります。これにより、プラグインメニューが正しく表示され、文字化けを防ぐことができます。