使用AJAX按钮在帖子中更新状态、元数据

时间:2019-03-06 作者:samjco

因此,我尝试单击我在元框中制作的自定义按钮,以启动AJAX。除了获取帖子ID和刷新页面之外,其他所有工作都可以完成。我试过使用global $post; $post_id = $post->ID$post_id = $_POST[\'post_id\'];$post_id = get_the_ID(); , 这些都不管用。

我最终想要完成的是:点击按钮后,弹出一个“你确定吗?”是/否。如果单击“是”,更改状态功能将启动并刷新状态已更改的帖子页面。

我正在使用一个Ajax Get,其URL位于我的按钮后面:/wp admin/admin Ajax。php?操作=ew\\u change\\u状态

参考号:Trying to load content of a post via AJAX

这是我的职能。php代码:

add_action( \'wp_ajax_change_status\', \'ew_change_status\' );


function ew_change_status() {

    //$post_id = $_POST[\'post_id\'];
    //$post_id = get_the_ID();

    global $post; 
    global $user_ID; 

    $post_id = $post->ID;
    var_dump($post_id);

    remove_filter( current_filter(), __FUNCTION__ );

   //Show popup
   // ...

   // Update Status
  $my_post = array(
      \'ID\'           => $post_id,
      \'post_status\'   => \'status-pending\',
  );

   // Update custom field with User Id      
   update_post_meta($post_id, \'post_key\', $user_ID);

   //echo "Updated";

   // Update the post into the database
   wp_update_post( $my_post );

    //wp_redirect(); //Same Page?
    //exit;

}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

第一件事第一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();
}