WordPressによるWEBサイト開発

WEBサイト作成

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





おすすめ記事一覧

大統領選挙で考えたギャップにハマるということ 1

ギャップにキュンとするというのは人間の本能みたいなもので、ジョコウィの私利私欲のない素朴なおじさん像と、その実強力なリーダーシップを発揮する実務派という内面が、一見普通の人だが実はスゴイというギャップ好きのインドネシア人に大ウケして、大衆は一種の集団催眠状態にあるようです。

情報の質のレベル 2

見える化された結果を共有化することで問題点が共通認識されますが、共有化が進むことで情報の持つ希少価値が薄れて困る人間がいる場合、有益な情報を独占することでポジションを高めようという政治力が働きます。

インドネシアのスタバの店員にありがたい人生の教訓を教わった件 3

いつものスタバでいつものアイスコーヒーを注文していると、だいたいなじみの店員が「今日は珍しい時間に来たねー」とか「今日もいつものアイスでいいのかなー」とか馴れ馴れしくフレンドリーに話しかけてきます。

宗教によって異なる「死んだらどうなる」の考え方 4

キリスト教もイスラム教もともにユダヤ教から派生した宗教であり、それぞれイエス・キリスト(本人が神)またはアッラーという唯一無二の神を信じます。

株価操作なんてインドネシア株では当たり前 5

株価は売り注文と買い注文により変動し、大量の売り注文を買う注文がたくさん入れば、他の投資家達は「俺も俺も」と続くことで株価が上がります。

心臓に毛が生えたインドネシア人のずうずうしい転職活動を応援してみた 6

インドネシア人は秘密の話は誰かに暴露しないと精神の安定を保てない人が多いため、内緒の話に情報の希少性は少なく信憑性も低いことが多いので、「ここだけの話」という枕詞付きで聞かされる話は話半分に聞いておいたほうがいいかもしれません。

日系企業のインドネシアでの存在意義 7

今のまま日本の人口減が続けば、内需は縮小の一途をたどるわけで、そうなると日本国内市場だけで生き残るのは難しいと判断する国内企業が、海外市場に活路を見出そうとするのは必然です。

チャンスはあるが勝てる分野を見つけるのが難しい 8

実際にインドネシアに住んでみて、自分で動いて人と話しをして、現地の事情を少しずつ理解していくにつれて、インドネシアで起業することが意外と手強いことに気づき、その難しさの原因は、高い送料と関税であったりローカル企業との競争であったり、就労ビザ(IMTA)や外国人技能開発基金(DPKK)などのランニングコストの高さであったりします。

インドネシアのシステムインテグレーション業界 9

先日JETRO(日本貿易振興機構)さんと、インドネシアの中小企業のIT投資について意見交換させていただく機会をいただいたのですが、そこで「システム投資のコストメリットはどのように説明できるのか」という、システムインテグレーターの存在価値にも関わる重要な問題提起がありました。

肉体と精神と心と魂 10

「Body and Soul」といえば、昨日の内閣改造に伴う人事で内閣府政務官に内定した自民党の今井絵理子参議院員がメンバーだったSPEEDのデビュー曲であり、インドネシアの老舗女性ファッションブランド名でもあります。

ジャカルタのラーメン市場 11

僕がインドネシアに初めて来たのが1997年10月、インドネシア語は分からないし、仕事は辛いし、周囲の人間は理不尽だし、一時期日本に帰りたくて仕方がない時期がありましたが、当時自分をかろうじてインドネシアに繋ぎ止める心の支えとなっていたのが、協栄プリンスビル(今のWisma Keiai)の日本食レストラン「五右衛門」であり、ここでキムチラーメンを食べることが唯一の楽しみと言っても過言ではありませんでした。

ブランド力、技術力、資金力の3要素 12

1998年のジャカルタ暴動後、ルピアが暴落し海外からのドル建て債務を抱えた国内企業が利子の支払いに苦しんでいた頃、僕は外貨が獲得できるインドネシアでの新しいビジネスを探していました。

日本とインドネシアの間でのタイムマシン経営が通じなくなっている件 13

先進国と後進国との間にある流行のタイムラグを利用して、先進国での成功例を後進国で実践するビジネスモデルをタイムマシン経営といいますが、インターネットの普及に伴い情報がフラット化してしまい、モノと情報のタイムラグが限りなく小さくなった今、先駆者である中小零細同業他社が乱立し市場が出来上がったところに、後発の大手が参入し先発零細を駆逐していく、という典型的な負けパターンにはまります。

サリナデパートとマクドナルド 14

本日5月10日を最後にインドネシアのマクドナルド第1号店であるサリナデパート店(Sarinah)が閉店になりますが、ジャカルタのショッピングモールが新しいコンセプトでモダンにリニューアルされ続ける中で、僕がインドネシアに来たばかりの20数年前には、若者の待ち合わせ場所の定番でもあったサリナデパートやブロックMのパサラヤ(Pasaraya)などは完全に時代に取り残されてしまいました。

不景気の歴史 15

僕がインドネシアに来てからこれまで何度か経済不況を見てきましたが、今回の新型コロナウィルスの感染拡大により、間違いなく景気後退しますので、数年後にはこれがコロナショックとかコロナ不況とか呼ばれるようになるのかもしれません。

日本のバブル経済崩壊後とインドネシアの通貨危機後 16

自分が大学に入学したのがバブル経済末期の1991年、土地も株価もMAX爆上げして、三菱地所がアメリカの象徴であるロックフェラーセンタービルを買収し、ジュリアナ東京でワンレンボディコン(登美丘高校ダンス部のバブリーダンスみたいなやつ)のお姉さん達が扇子振って踊っている時期でした。

内需と外需の自国経済に及ぼす影響 17

公共事業投資を行っても、お金が企業内や個人の貯蓄に滞留してしまい国内消費が増えないのが日本の状況であり、国内消費は増えても消費材の輸入品比率が高く、国内資産が海外に流出しているのがインドネシアの状況です。

2019年の総選挙を前にインドネシア政治史のおさらい 18

来年の大統領選挙(Pemilu Pilpres Pileg Indonesia 2019)に向けての選挙運動(Kampanye)を解禁するにあたり、投票用紙に印字される順番はジョコウィ現職大統領・マフル副大統領候補組が1番、プラボウォ大統領候補・サンディアガウノ副大統領候補組が2番と決まりました。

コーヒーをもっと楽しくもっと美味しく 19

インドネシアは北回帰線と南回帰線をはさむコーヒーベルトに位置するコーヒー栽培に適した国で、1602年の東インド会社の進出を契機にオランダの植民地支配が300年以上続き、その間アラビカ種のコーヒーが持ち込まれ、気候のいい高原地帯で栽培が開始されました。

インドネシア人の悪魔祓い 20

人間誰しも自分の中に悪魔が潜んでおり、それが何らかのきっかけで表面に出て来るという考え方自体には、背景に宗教が有るか無いかの違いだけで、基本的に理解できる話であり、それを信じるか信じないかは別として、そういう考えがあることを認めることは大切なことだと思います。

-WEBサイト作成

© 2020 バテラハイシステム Powered by STINGER