wordpressで自作プラグインの作成方法

wordpressにはプラグインという仕組みが取り入れられています。これは各テーマに入っている「functions.php」でできることを全てのテーマに適応させるためのシステムです。どのwordpressテーマでも使えるため、非常に便利です。しかし、その作成にはいくつか注意点があります。

wordpressプラグイン作成にあたって

エラーの検出

まず、wordpressをインストールしたディレクトリにある「wp-config.php」で、「define('WP_DEBUG', false);」になっていれば「define('WP_DEBUG', true);」にします。そして「php.ini」で「error_reporting = E_ALL」を指定します。レンタルサーバだと大抵、管理画面から変更できるようになっています。他に「display_errors = On」や「display_startup_errors = On」も設定しておきます。

これらは何のための設定かというと、隠れているエラーを全て吐き出させるための指定なのです。エラーはその重要度が低いと、初期状態で非表示になっています。開発にあたってはこれをまず表示させます。非推奨などの関数も分かるためです。関数が削除されて使えなくなると、最悪wordpressの記事が表示されなくなってしまいます。ということで非推奨を利用しないのは、将来を見据えての対策です。

同じ関数やクラス名を使わないようにする

同名のものがあると、「Fatal error: Cannot declare class Management, because the name is already in use in~」などと表示されます。「致命的なエラー:クラスManagementを宣言できません。名前は既に使用されているためです。」といった意味になります。

関数名などは適当につけることが多いのですが、他のプラグインやテーマなどで使われているものと被らせないようにするため、長めで重複しなさそうなものを選択しなければなりません。接頭辞(プレフィックス)をつけてユニークな名前にしてしまうのが最も簡単です。よくプラグイン同士の相性が悪いなどと表現されますが、上記を含めてglobal変数や定数などの同名で不具合を招くこともあると思います。

ファイル先頭に改行や空白を入れない

「プラグインの有効化中に1文字の予期しない出力が生成されました。 “headers already sent” メッセージや RSS フィードの問題、その他の不具合に気づいた場合、このプラグインの停止または削除を試してください。」などと表示される場合、プラグインのファイル先頭に改行や空白などが入っているかも知れません。その場合は、その部分を削除して下さい。

wordpressプラグインの特徴

プラグインは有効化すると、wordpressの管理画面を含めてすべてのページで読み込まれます。これはテーマのfunctionsでも同様です。試しにプラグインやテーマのfunctionsの冒頭で、長い文字列をechoして見てください。その文字列が出てきます。ただ、これを確認するときはファイルのバックアップを取っといて下さいね。今の編集画面ではおそらく問題が出てくると編集できなくなりますので。そのため、いつでもFTPなどでファイルをアップロードできる体制をとって置くと良いでしょう。

そしてもっと言えば、不要なプラグインを有効化しているだけで、wordpressの動作が重くなるということでもあります。そのため、使わないものは無効にしておきましょう。

また、プラグイン同士は場合によって相互に影響を及ぼすことがあります。例えば、カテゴリー関連のプラグインを使っている状態で、wordpressテーマ内においてcategory関連のテンプレートタグを記述した際に、うまく値を取得できないという現象を招くことがあります。更に同じ名前の関数やクラスなどが存在しているとエラーになります。

wordpressプラグインの作り方

phpファイルに以下を記述して、プログラムを書きます。適当な名前をつけたフォルダに出来上がったファイルを入れてアップロードすればワードプレスへのインストールは終わりです。インストール先は、「wp-content/plugins/」ディレクトリです。コードに問題がなければ、有効化することで動きます。ファイルには他にも「Plugin URI」「Description」「Author」「Version」などを記入しますが、自分や身近の人だけで使う場合、これらは必ず必要というわけではありません。また、「AAA」の部分は適当で構いません。

/*
Plugin Name: AAA
*/

プラグインの内容は?

基本的にワードプレステーマに同梱されているfunctionsへ記述する内容と同じです。フックなどを利用して好きなコードを入力します。

ただし、ファイルの先頭に改行を入れると「プラグインの有効化中に1文字の予期しない出力が生成されました。 “headers already sent” メッセージや RSS フィードの問題、その他の不具合に気づいた場合、このプラグインの停止または削除を試してください。」とワードプレスのプラグイン管理画面で表示されることがあります。その場合、ファイルの先頭から「<?php」を記述してコードを入力して下さい。

管理メニューを出してみる

「network_admin_menu」と「admin_menu」フックはそれぞれ管理画面で親と子サイトで表示するために必要です。マルチサイトではないワードプレスでは後者だけで動きますが、両方記述しても動きます。この記述がない場合、「このページにアクセスする権限がありません。」と表示されます。

add_menu_page関数はワードプレス独自のものです。管理メニューを追加して、オプションのフォームを表示させるのに必要となります。また、上記のフックで呼び出した自作のコールバックからこれを読込ませ、更に自作コールバックの「ワードプレス_Callback()」を読込んでオプションのフォームを表示させています。

「empty($_POST["check"])」は変数が空であることを確認したうえで、空にしています。PHP7からはGETやPOSTで渡された変数をそのまま処理しようとすると、「Notice: Undefined index: check in」といったエラーが表示されます。変数の値の有無は関係ないようです。php.iniで全てのエラーを出力する設定をしていない場合、或いは問題コード直前に@を挿入しているケースでは出力されませんが、内部的にはエラーが出ています。

「htmlspecialchars」は一旦$escに代入して、ヒアドキュメント内で関数として記述しています。この部分は「$esc=htmlspecialchars($_POST["check"]);」として、ヒアドキュメント内で「$esc」のみにしても動作します。

エスケープ処理は自分だけが使用するのであれば必要ありません。何かあっても自己責任で終わるからです。ただ、日ごろから癖をつけておかないと大事なところでセキュリティーをすり抜けるようなプログラムを作ってしまうかも知れません。

以下のコードは、ワードプレスの管理メニューから選択した画面において、入力した文字列をformで送信して受け取り、出力するだけの簡単なプログラムです。

<?php
/*
Plugin Name: AAA
*/
class wordpress_Menu {
public function __construct() {
add_action('network_admin_menu',[$this, 'wordpress_Management_Screen']);
add_action('admin_menu', [$this, 'wordpress_Management_Screen']);
}
public function wordpress_Management_Screen() {
add_menu_page('wordpress','wordpress', 'level_8', __FILE__, [$this, 'wordpress_Callback'], '', 101);
}
public function wordpress_Callback() {
$nt2=$nt=preg_replace('/\/$/', '', network_home_url('','https'));
$nt=$nt.$_SERVER['REQUEST_URI'];
if(empty($_POST["check"])){$_POST["check"]="";}
$esc="htmlspecialchars";
echo <<< EOM
<form action="{$nt}" method="post" style="margin-top:300px;">
<table style="margin:0 auto;"><tr><td>送信内容:</td><td>{$esc($_POST["check"])}</td></tr>
<tr><td><input type="text" name="check" value="" /></td><td><input type="submit" value="確認" /></td></tr></table>
</form>
EOM;
}
}
new wordpress_Menu;
?>

マルチサイト

ワープレのマルチサイトでデータベースと連携したプラグインを作成すると、上に述べたやりかたでは「サイトネットワークで有効化」を設定してもデータベースのテーブル作成は親サイトのみとなります。子サイトに対して個別にテーブルを作成させる場合は、子サイトごとにプラグインを有効化する必要があります。

まとめ

以上がワープレで自作プラグインを作成する上でのポイントとなります。ワープレのプラグインは基本的に記事の出力に変化を与えるものです。そのため、ワープレの独自関数を利用することが多く、フックという仕組みでこれを上書き処理することもよくあります。もちろん、ワープレの管理画面で、ワープレとは直接関係の無いプログラムを動かすこともできます。