Ajax、jquery、phpを使ってvisit/page viewsカウンタを作成しています。私は、ajaxによるデータ操作にnonceの使用を推奨する記事をいくつか読んでいますが、nonceの使用を統合する必要があるかどうかわかりません。簡単なカウンター?
私のコードはこのように見えます。
jquery
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {action: 'countHits', status: 'true'},
});
php
//ajax functions
add_action('wp_ajax_countHits', 'countHits');
add_action('wp_ajax_nopriv_countHits', 'countHits');
function countHits() {
if($_POST['status'] != "") {
$status= $_POST['status'];
if(!isset($_COOKIE['UNIQUEUSER'] && $status == 'true'){
$uniqueUser= get_option('stats');
$uniqueUser['uniqueUser']+=1;
update_option('stats', $uniqueUser);
}
die();
}
非常に単純なので、ajaxリクエストごとにnonceを使用する必要がありますか(私のjqueryには、true用にfalse用に1つを返す2つの別々のリクエストがあります)。私はそれをしに行きますか?
requiredは「それなしでは動作しません」という意味です。それはうまくいくでしょうが、問題はセキュリティとベストプラクティスです。たとえ必要ではないとしても、安全な側でプレーして常にそれを実行することをお勧めします。
PHPの値(admin Ajax URLやnonceなど)を wp_localize_script
で渡して、次のようにJavaScriptをエンキューする必要があります。
function enqueue_wpse_114600()
{
wp_register_script(
'my-ajax' // Handle
, get_template_directory_uri() . '/js/ajax.js'
, array( 'jquery' )
);
wp_enqueue_script( 'my-ajax' );
wp_localize_script(
'my-ajax', // Handle
'my_ajax', // Object name
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'ajax_validation' )
)
);
}
JSは次のようになります。オブジェクト名、この場合はmy_ajax.any_value_you_passed
で渡された値にアクセスします。
jQuery( document ).ready( function( $ )
{
var data = {
action: 'countHits',
security: my_ajax.ajaxnonce
};
$.post(
my_ajax.ajaxurl,
data,
function( response ) {
if( !response.success )
{
// No data came back, maybe a security error
if( !response.data ) console.log( 'AJAX ERROR: no response' );
else console.dir( response.data.error );
}
else console.dir( response.data );
}
);
});
そしてあなたのAjaxアクションで、 check_ajax_referer
でナンスをチェックし、結果を返送するための関数 wp_send_json_*
を使用してください(単純なtrue
またはcomplex)オブジェクト)。
function countHits()
{
check_ajax_referer( 'ajax_validation', 'security' );
$ok = something();
if( !ok )
wp_send_json_error( array( 'error' => __( 'Not ok.' ) ) );
else
wp_send_json_success( $ok );
}