我有一个投票系统,其中一个帖子列表是使用存档模板打印出来的。每个帖子的投票按钮都有html数据属性,其中包含vote-id
以及vote-nonce
.
单击投票按钮时,将发出一个AJAX调用,其中包含投票id和投票nonce。这些应该在服务器端进行验证,但它们似乎失败了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)
最合适的回答,由SO网友:cybmeta 整理而成
要验证Ajax请求中的nonce,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();
}
}