ワードプレスには背後で通信してサイトを動的に書き換えるデータを保存する等の事を可能とする、AJAXの仕組みが組み込まれています。このAJAXを安全に実行する為にnonce(正規の通信かどうかを保証するカギのようなもの)を送信しチェックすることが推奨されています。
JAVASCRIPT(JS)でnonceを送信するAJAX通信を実装する
JAVASCRIPT(JS)でnonceを送信するAJAX通信を行うコードは下記のようになります。
<script> jQuery.ajax({ type: "POST", url: "<?php echo admin_url( 'admin-ajax.php'); ?>", data: "action=アクション名&nonce=<?php echo wp_create_nonce('任意のキー'); ?>", success: function(msg){ alert(msg); } }); </script>
admin_url( ‘admin-ajax.php’) 関数でAJAX通信の為にデータを投げるURLを取得出力しています。
action=アクション名 の部分のアクション名が次に実装される処理の本体のPHPプログラムと紐づきます。こちらは半角英数の自由な名称にされてください。
nonce=<?php echo wp_create_nonce(‘任意のキー’)でnonceが生成されます。任意のキーの部分にテーマやプラグインのスラグなどnonceを生成する種を入力します。この種がワードプレスのwp-config.phpにあるサルトで暗号化され送信されます。
AJAXの実行コード部分でnonceの整合性をチェックする
上記のAJAX送信のJAVSCRIPTでデータを受け取った処理側のPHPプログラムは下記のようになります。
function ajax_functo_call () { if ( ! check_ajax_referer('任意のキー', 'nonce', false)) { die(); } //AJAX の処理 echo "aaa"; die(); } add_action( 'wp_ajax_アクション名', 'ajax_functo_call' ); add_action( 'wp_ajax_nopriv_アクション名', 'ajax_functo_call' );
wp_ajax_アクション名で先ほどのJSで送信されたaction=アクション名の部分とajax_functo_callが紐づきます。
wp_ajax_nopriv_アクション名 はユーザーがログインしていなくてもAJAXを実行できるようにするコードです。(ユーザーがログインしている場合にのみ必要なAJAXでしたらこの行は不要です)
if ( ! check_ajax_referer(‘任意のキー’, ‘nonce’, false)) { で正しいnonceが送信されたかを検証して、不正なnonceの場合はdie(); で処理を中断します。
ワードプレスのAJAXアクションはハッカーが脆弱性を利用するのに、非常によく使われる関数です。この為、コードの作成者はこのnonceの仕組みを使い、ワードプレスのAJAX通信のセキュリティーを向上することがWordpress公式から推奨されています。
WordPress ワードプレスのPHPコーディング、サイトのカスタマイズや修正のご依頼・ご相談はWPドクターまでお気軽にお送りください