アーカイブテンプレートを使用して投稿のリストを印刷する投票システムがあります。各投稿の投票ボタンには、vote-id
およびvote-nonce
を含むHTMLデータ属性があります。
投票ボタンがクリックされると、投票IDと投票ノンスを含むAJAX呼び出しが行われます。これらはサーバー側で検証されるべきですが、wp-verify-nonce
に失敗しているように見えます。投稿されたデータをデバッグしてエコーすると、元のデータと同じであることが確認されます。
AJAX PHP機能:
function submit_vote() {
$vote_id = intval($_POST['vote_id']);
$vote_nonce = sanitize_text_field($_POST['vote_nonce']);
$action = sanitize_text_field($_POST['vote_nonce']);
if ( !wp_verify_nonce($vote_nonce,'vote-nonce-' . $vote_id))
die(-1);
$response = json_encode( array( 'success' => true ) );
die($response);
}
add_action( 'wp_ajax_submit_vote', 'submit_vote' );
ノンジェネレーション:
wp_create_nonce( 'vote-nonce-' . get_the_ID() );
AJAX JavaScript呼び出し:
jQuery(document).ready(function(){
jQuery(".post-voting").click(function(){
vote_nonce = jQuery(this).data('vote-nonce');
vote_id = jQuery(this).data('vote-id');
jQuery.post(
vote_ajax.url,
{
action: 'submit_vote',
vote_id: vote_id,
vote_nonce: vote_nonce
},
function( data ) {
alert( jQuery.parseJSON(data) );
}
);
});
});
Ajaxリクエストは空のレスポンスで死んでいるように見えます(-1ではありません)。
Ajaxリクエストでナンスを検証するには、check_ajax_referrer()
の代わりに wp_verify_nonce()
を使用します。
ナンスを作成します。
$nonce = wp_create_nonce( 'vote-nonce-' . get_the_ID() );
JavaScriptでそれを含める:
jQuery(document).ready(function(){
jQuery(".post-voting").click(function(){
vote_nonce = <?php echo $nonce; ?>
vote_id = jQuery(this).data('vote-id');
jQuery.post(
vote_ajax.url,
{
action: 'submit_vote',
vote_id: vote_id,
vote_nonce: vote_nonce
},
function( data ) {
alert( jQuery.parseJSON(data) );
}
);
});
});
Ajaxコールバックをチェックインしてください。
add_action( 'wp_ajax_submit_vote', 'submit_vote' );
function submit_vote() {
$vote_id = intval( $_POST['vote_id'] );
$vote_nonce_name = 'vote-nonce-' . $vote_id;
// By default, check_ajax_referer dies if nonce can not been verified
if( ! check_ajax_referer( $vote_nonce_name, 'vote_nonce', false ) ) {
wp_send_json_error();
} else {
wp_send_json_success();
}
}