web-dev-qa-db-ja.com

javaScriptが別ファイルにある場合のajaxとnonce

私はnonceがどのようにajaxリクエストと連携するのかについて少し混乱しています。私はこれを使うことになっているようです: https://codex.wordpress.org/Function_Reference/check_ajax_referer

リクエストは次のようになります。

<?php
//Set Your Nonce
$ajax_nonce = wp_create_nonce( "my-special-string" );
?>

<script type="text/javascript">
jQuery(document).ready(function($){
    var data = {
        action: 'my_action',
        security: '<?php echo $ajax_nonce; ?>',
        my_string: 'Hello World!'
    };
    $.post(ajaxurl, data, function(response) {
        alert("Response: " + response);
    });
});
</script>

しかし、このアプローチはあなたのJavaScriptがあなたのPHPと混在していることを前提としているように思われます。これは私が避けたいやり方です。プラグイン用のajaxリクエストを書くときは、リクエストを分離するためにadmin_url( 'admin-ajax.php')を使います。

この状況でどのように私は一回だけを使うでしょうか? admin_url( 'admin-ajax.php')ビット内で渡しますか?

1
karl

スクリプトをローカライズして、nonceとajaxのURLをスクリプトに渡すことができます。
スクリプトのローカライゼーションについてさらに詳しく

function wpse_206839() {

    // Register our script just like we would enqueue it - for WordPress references
    wp_register_script( 'my-special-script', 'directory/my-special-script.js', array( 'jquery' ), false, true );

    // Create any data in PHP that we may need to use in our JS file
    $local_arr = array(
        'ajaxurl'   => admin_url( 'admin-ajax.php' ),
        'security'  => wp_create_nonce( 'my-special-string' )
    );

    // Assign that data to our script as an JS object
    wp_localize_script( 'my-special-script', 'specialObj', $local_arr );

    // Enqueue our script
    wp_enqueue_script( 'my-special-script' );

}
add_action( 'wp_enqueue_scripts', 'wpse_206839' );

これにより、私たちはJSのnonceにconsole.log( specialObj.security );としてアクセスできるようになります。

2
Howdy_McGee