我终于明白了。
第一个错误是处理同一个函数两次。我在函数之后调用了它一次,在ajax操作中又调用了一次。因此,在使用ajax调用时,函数执行了两次。在OP的示例中,这根本不是问题,因为它被简化为只做一件事,但在我的实际代码中,它做得更多,并可能导致丢失不需要的数据。
此外,我只需要停止ajax并获得自定义响应,仅此而已。以下是我所做的:
1. 我改变了这一点:
smk_remove_post();
对此:
add_action(\'parse_query\', \'smk_remove_post\');
在特殊操作中需要时,最好稍后运行该函数。
2. <接下来,我修改了ajax处理程序:我删除了这一行smk_remove_post();
并将ajax操作从wp_ajax_smk_remove_post_ajax
到wp_ajax_smk_remove_post
:
function smk_remove_post_ajax(){
wp_die( \'ok\' );
}
add_action(\'wp_ajax_smk_remove_post\', \'smk_remove_post_ajax\');
3. 我已重命名查询字符串
reaction
到
action
. 在url中更改了它,函数:
4. 最后修改了jQuery脚本。因此它使用了管理ajax。php并将url作为数据发送:
url: ajaxurl,
data: _this.attr(\'href\'),
以下是最终代码:
Link:
<a href="http://example.com/?action=smk_remove_post&id=1226&_nonce=7be82cd4a0" class="smk-remove-post">Remove post</a>
PHP code:
function smk_remove_post(){
if( !empty( $_GET[\'action\'] ) && \'smk_remove_post\' == $_GET[\'action\'] && !empty( $_GET[\'id\'] ) ){
if( current_user_can(\'edit_others_posts\') && !empty($_GET[\'_nonce\']) ){
if( wp_verify_nonce( esc_html( $_GET[\'_nonce\'] ), \'smk_remove_post\' ) ){
// Delete the post
wp_delete_post( absint( $_GET[\'id\'] ), true );
}
}
}
}
add_action(\'parse_query\', \'smk_remove_post\');
function smk_remove_post_ajax(){
wp_die( \'ok\' );
}
add_action(\'wp_ajax_smk_remove_post\', \'smk_remove_post_ajax\');
Javascript:
function smk_remove_post(){
$(\'.smk-remove-post\').on( \'click\', function( event ){
event.preventDefault();
var _this = $(this);
jQuery.ajax({
type: "GET",
url: ajaxurl,
data: _this.attr(\'href\').split(\'?\')[1],
success: function(response){
console.log(response); // ok
_this.text(\'All great, the post is removed.\');
}
});
});
}
smk_remove_post();
Edit:也是对上述代码的一个小更新。删除站点路径需要处理查询字符串,否则可能会产生意外问题。我已将此添加到
data href
:
.split(\'?\')[1]