ワードプレスには背後で通信してサイトを動的に書き換えるデータを保存する等の事を可能とする、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ドクターまでお気軽にお送りください