我正在尝试让AJAX评论在WordPress中运行。到目前为止,我已经编写了一个PHP处理程序和一个脚本。
我的脚本(从here修改):
jQuery(document).ready(function($){
var commentform = $('#commentform');
commentform.prepend('<div id="comment-status"></div>');
var statusdiv = $('#comment-status');
commentform.submit(function(){
//serialize and store form data in a variable
var data=commentform.serialize();
//Add a status message
statusdiv.html('<p>Processing...</p>');
//Extract action URL from commentform
var formurl=commentform.attr('action');
//Post Form with data
$.ajax({
type: 'POST',
url: formurl,
dataType: 'JSON',
data: data,
error: function(XMLHttpRequest, errorThrown)
{
statusdiv.html('<p class="ajax-error" >Oops, an error occured</p>');
},
success: function(data)
{
statusdiv.html(data);
$('#commentform #comment').val('');
}
});
return false;
});
});
我的PHP处理程序:
function ajaxify_comments( $comment_ID, $comment_status ) {
$comment = get_comment( $comment_ID );
$response = $comment->comment_content;
echo json_encode( $response );
die();
}
add_action( 'comment_post', 'ajaxify_comments', 20, 2 );
我的PHP处理程序ajaxify_comments()
被挂钩到comment_post
,它会在注释保存到数据库后立即触发。该函数获取注释文本并将响应(注释文本)返回给我的AJAX脚本。如果一切都成功,评论文本将显示在屏幕上。如果不成功,则会显示错误消息。
我的问题
如果我提交评论,评论将保存到数据库中,评论文本将显示在屏幕上。这位有效!我的问题是如果我在没有刷新页面的情况下发表第二条评论 - 我总是得到“哎呀,发生错误”。我做错了什么?
更新
在@ adeneo建议使用内置AJAX钩子的WordPress后,我想出了一个新的脚本和PHP处理程序......
脚本:
jQuery(document).ready(function($) {
var path = ac.path;
var security = ac.security;
var ajax_url = ac.ajax_url;
var commentform = $('#commentform');
commentform.prepend('<div id="comment-status"></div>');
var statusdiv = $('#comment-status');
commentform.submit(function(){
$.ajax({
type: 'POST',
url: ajax_url,
dataType: 'JSON',
data: {
'action': 'ac',
'security': security
},
success:function(data) {
statusdiv.html(data);
$('#commentform #comment').val('');
},
error: function(data){
statusdiv.html('<p class="ajax-error">Oops, an AJAX error occured</p>');
}
});
return false;
});
});
PHP处理程序
function ajaxify_comments() {
check_ajax_referer( 'ajax_ac_nonce', 'security' );
$response = 'blah';
echo json_encode( $response );
die();
}
add_action( 'wp_ajax_ac', 'ajaxify_comments' );
为了完整起见,值得让你知道我也有:
wp_enqueue_script( 'ac-script', plugins_url( '/js/script.js', __FILE__ ), array( 'jquery' ), 1.0, true );
$path = get_bloginfo( 'stylesheet_directory' );
// set the nonce security check
$ajax_nonce = wp_create_nonce( 'ajax_ac_nonce' );
wp_localize_script(
'ac-script',
'ac',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'path' => $path,
'security' => $ajax_nonce,
)
);
我的问题现在变为:如何将提交的评论数据提供给我的PHP处理程序?我猜我需要手动将评论数据保存到数据库中?我首先需要在我的PHP函数中提供这些数据,但不知道该怎么做?