WordPressのプラグイン作成に関わりそうな情報をメモ書きしています。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.ディレクトリ、ファイル構成
- 2.プラグインヘッダー
- 3.プラグイン開始、停止時に実行する関数を登録
- 4.nonceの利用方法
- 5.バリデーション、サニタイズ
- 6.プラグインのオプションを取得、保存
・すべてのWordPressプラグインはwp-content/plugins/ディレクトリ内に保存するので他のプラグインと重複しないように注意する。
●プラグインのファイル構成
・プラグインが利用するファイルを含めて一つのディレクトリ内に構成することを推奨。
例)
/プラグイン名/
プラグイン名.php メインのプラグインPHPファイル
uninstall.php プラグインをアンインストールするファイル
js/ JavaScript用のディレクトリ
css/ スタイルシート用のディレクトリ
includes/ 他のPHPをインクルードするディレクトリ
images/ 画像用のディレクトリ
・このプラグインのヘッダーを基にWordPressはプラグインの情報を取得し、管理画面に表示する。
例)
<?php
/*
Plugin Name: ・・・
Plugin URI: http://example.com/wordpress-plugins/・・・
Description: ・・・・
Version: 1.0
Author: ・・・・
Author URI: http://example.com
Text Domain: ・・・・
License: ・・・・
*/
・”Plugin Name”は必須情報、残りの項目はオプション。
・プラグインが有効化されたときに実行される関数を登録。
構文
register_activation_hook($file, $function)
$file:wp-content/pluginsディレクトリにあるメインプラグインファイルへのパス。$function:プラグインが有効化されたときに実行される関数。
・プラグイン有効時にプラグインがサポートするWordPressのバージョンかどうかチェックしたり、デフォルトのオプション設定をするなどに利用される。
例)
メインプラグインファイルのパス:wp-content/plugins/myplugin/myplugin.php
‘myplugin_activate’関数がメインプラグインファイルに定義されている場合
register_activation_hook( __FILE__, ‘myplugin_activate’ );
●register_deactivation_hook
・プラグインが停止されたときに実行される関数を登録。
構文
register_deactivation_hook($file, $function)
・”number used once”の略。
・オプションの保存、投稿のフォーム、Ajaxリクエストなどのリクエストでシークレットキーを生成することによって不正なアクセスを停止するのに使用される。CSRF(cross site request forgery)による攻撃から守る。
・このシークレットキーは、リクエストを生成する前に生成され、リクエスト内に渡される。そして他の処理が行われる前に同じキーがとうかチェックされる。
●フォームでnonceを利用 wp_nonce_field
構文
wp_nonce_field( $action, $name, $referer, $echo )
$action:アクション名
$name:Nonce の名前
$referer:認証用のrefereフィールドを設定するか否か。デフォルトtrue。
$echo:hiddenフィールドをフォームに出力するか否か。デフォルトtrue。
・フォームにhiddenフィールドとして追加するためのnonceを取得または表示する。
nonceフィールドはフォームの内容が現在のサイトから来たものであり、他のサイトからではないということを認証するために使われる。
例)フォームにnonceを追加した例
<form method="post"> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> <!-- some inputs here ... --> </form> ↓ (生成されるHTML) <form method="post"> <input type="hidden" id="name_of_nonce_field" name="name_of_nonce_field" value="q12d・・・" /> <input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" /> </form>
●nonceをチェック wp_verify_nonce
構文
wp_verify_nonce( $nonce, $action )
$nonce:認証したいフォーム内で使われたnonce
$action:nonceを作成したときに指定したaction名。
・nonceが正しく設定されていて有効期限が切れていないかを確かめる。
例)フォーム送信後のnonceのチェック
<?php if (isset( $_POST['name_of_nonce_field'] ) || ! wp_verify_nonce($_POST['name_of_nonce_field'], 'name_of_my_action' )) { print 'Sorry, your nonce did not verify.'; exit; } else { // process form data }
●URLにnonceを利用 wp_nonce_url
構文
wp_nonce_url( $actionurl, $action, $name )
$actionurl:nonceアクションを追加するURL
$action:nonceアクションの名前
$name:nonceの名前
・URLのクエリ文字列にnonceを追加したURLを生成
例)
<?php
$link = ‘sample.php?action=delete&id=3’;
?>
<a href=”<?php echo wp_nonce_url($link, ‘delete_action’,
‘nonce_url_check’ ); ?>”>Delete</a>
↓
生成されるリンクのURL
http://example.com/wp-admin/sample.php?action=delete&ID=3&nonce_url_check=9kga・・
※フォームの場合と同様にwp_verify_nonce()を使ってnonceをチェックできます。
(1)エスケープ関数
命名
esc_xxx_e
・esc
エスケープ関数のプレフィックス
・xxx
エスケープする対象。html、attr、textarea、js、sql、url、url_raw
・_e又は__
_e:echoする
__:リターンする
●esc_html
・「<」、「>」、「&」、「”」、「’」のHTML特殊文字をエンコードし、HTMLブロックをエスケープする。
$html = esc_html( ‘<a href=”http://www.example.com/”>A link</a>’ );
↓
<a href="http://www.example.com/">A link</a>
●esc_attr
・HTML特殊文字をエンコードし、alt、value、titleなどのHTML属性値をエスケープする。
例)
<input type=”text” name=”fname” value=”<?php echo esc_attr( $fname ); ?>”>
●esc_textarea
・HTML特殊文字をエンコードし、テキストエリア要素値をエスケープする。
<textarea name=”description”><?php echo esc_textarea( $text ); ?></textarea>
●esc_url
・テキストや属性などのURLを無害化する。
・無効なキャラクタを除外し、危険なキャラクタを削除する。
・アンド記号(&)とシングルクォート(‘)はそれぞれ(&, ')という形に変換される。
<a href=”<?php echo esc_url( home_url( ‘/’ ) ); ?>”>Home</a>
●esc_js
・JavaScript内のテキスト文字列をエスケープする。
<script>
var esc='<?php echo esc_js( $text ); ?>’;
</script>
●esc_sql
・SQLクエリーに適切に用いるためにエスケープした値をリターン。
・$wpdb->escape()のエイリアス
●_eと__
//エスケープし、変換したテキストを表示
esc_html_e($text);
//エスケープするが表示はしない
$text = esc_html__($text);
(2)サニタイズ関数
・データベース内に保存する前にサニタイズする場合などに使用。
●sanitize_text_field
・ユーザーが入力、またはデータベースから取得した文字列を無害化する。
・無効なUTF-8をチェックし、独立した'<‘文字をエンティティーへ変換し、タグをすべて除去し、改行・タブ・余分な空白を削除し、オクテット(’%’に続く2桁の16進数)を除去
●sanitize_email
・メールアドレスで許可されていない文字を除去。
(3)除去しないHTMLタグを指定
●wp_kses
・悪意あるスクリプトを除去。
・すべての信頼できないHTML(投稿文、コメント文など)はwp_kses()を通す事を推奨。
・事前に指定したHTMLタグと属性のみを許可するようにできる。
例)
aタグのclass属性は許可されていないので除去される。
$allowed_tags = array( 'a' => array( 'href' => array(), 'title' => array() ), 'br' => array(), 'em' => array(), 'strong' => array(), ); $html = '<a href="#" class="・・">link</a>. echo wp_kses( $html, $allowed_tags );
(1)概要
・プラグイン用のオプション以外にテーマ用のオプションの保存にも利用される。
・add_option()、update_option()、get_option()、delete_option()を使ってオプションを追加、更新、取得、削除できる。
・すべてのデータは、カスタムな名称のもとにwp_optionsテーブル内に保存される。
・オプションの名前はWordPress全体で一意でなければならない。
プラグイン毎にプレフィックスをつけるなどして重複しないようにする。
(2)単一のオプション毎に保存、取得、削除
1)追加、更新
・add_option()、update_option()でオプションを作成して保存できる。
・update_option()は、すでに存在していた場合は更新する。
例)
add_option(‘myplug_extraction_length’, ‘255’, ”, ‘yes’ );
2)取得
get_option(‘myplug_extraction_length’);
3)削除
delete_option(‘myplug_extraction_length’);
(3)オプションの配列を保存
オプションを配列としてまとめて保存できる
1)作成、保存
$myplug_options_ary = array( 'myplug_mode' => 'debug', 'myplug_max' => '20', 'myplug_min' => '1' ); update_option('myplug_options', $myplug_options_ary);
2)取得
$myplug_options_ary = get_option(‘myplug_options’ );
$myplug_mode = $myplug_options_ary[‘myplug_mode’];
$myplug_max = $myplug_options_ary[‘myplug_max’];
$myplug_min = $myplug_options_ary[‘myplug_min’];