第一件事第一wp_ajax_{action}
或wp_ajax_nopriv_{action}
回调,全局$post
默认情况下,变量为null
因为WordPress还没有设置它。您可以使用以下简单回调进行确认:
add_action( \'wp_ajax_test\', function(){
global $post;
var_dump( $post );
wp_die();
} );
访问
/wp-admin/admin-ajax.php?action=test
你应该看到
NULL
显示在页面上。如果你没有看到
NULL
, 然后,可能是某个插件或自定义代码进行了查询,从而更改了
$post
变量
现在是一个解决方案,因为您通过点击按钮发出AJAX请求,而该按钮位于一个元框中,我想它位于编辑后屏幕上(wp-admin/edit.php
), 然后是解决$post
仍然是一个NULL
在您的wp_ajax_change_status
回调,是从AJAX脚本(JavaScript)发送帖子ID。
在post edit屏幕上,post ID存储在隐藏的input
名为的字段post_ID
如下所示,并存储当前正在编辑的帖子的ID:
<input type=\'hidden\' id=\'post_ID\' name=\'post_ID\' value=\'123\' />
因此,您可以使用该值并将其发送到AJAX回调。E、 g.:
jQuery.ajax({
url: \'/wp-admin/admin-ajax.php\',
data: {
action: \'change_status\',
post_id: jQuery( \'#post_ID\' ).val() // send the post ID
},
type: \'post\'
});
然后在AJAX回调中(即
ew_change_status()
函数),您可以检索提交的帖子ID,如下所示:
$post_id = filter_input( INPUT_POST, \'post_id\' );
在AJAX回调中,确保检查当前用户是否可以编辑帖子。E、 g.:
if ( ! current_user_can( \'edit_post\', $post_id ) ) {
wp_die();
}
使用
nonce (因为您正在编辑帖子)。例如
a) 在元框中,创建一个隐藏的input
用于存储nonce:
// Creates an <input> with the `id` and `name` "my_security".
<?php wp_nonce_field( \'change-post-status\', \'my_security\' ); ?>
b)在AJAX请求中包括nonce:
jQuery.ajax({
url: \'/wp-admin/admin-ajax.php\',
data: {
action: \'change_status\',
post_id: jQuery( \'#post_ID\' ).val(),
security: jQuery( \'#my_security\' ).val()
},
type: \'post\'
});
c)在AJAX回调中,验证nonce:
check_ajax_referer( \'change-post-status\', \'security\' );
因此,您的
ew_change_status()
可能看起来像:
function ew_change_status() {
check_ajax_referer( \'change-post-status\', \'security\' );
$post_id = filter_input( INPUT_POST, \'post_id\' );
if ( ! $post_id || ! ( $post = get_post( $post_id ) ) ) {
wp_die( \'No such post, or invalid ID.\' );
}
if ( ! current_user_can( \'edit_post\', $post_id ) ) {
wp_die( \'You can not edit this post.\' );
}
... your code here ...
wp_die();
}