公共/非管理员用户的AJAX更新失败

时间:2019-07-29 作者:Graeme Bryson

我构建了一个函数,根据<select> 输入,生成一个新的数据表(TablePress插件),并通过AJAX将其插入页面。

作为管理员,该功能非常适合我,但一旦我注销,它就会失败。我已经浏览了这方面的类似问题,并尝试了任何适用的解决方案,但我还没有解决这个问题。

在开发工具的网络选项卡中,我可以看到admin-ajax.php, 返回200状态代码。作为非管理员,它将返回302并无限期挂起(永久加载.gif)。

为了调试,我尝试简化以下实现:

HTML — Form with select input

<form id="submitProvider" method="POST">
    <select name="providerList">
        <option>Provider 1</option>
        <option>Provider 2</option>
        <option>Provider 3</option>
    </select>
    <button type="submit">Submit</button>
</form>

PHP — plugin file containing function

// Load dependencies
add_action(\'wp_enqueue_scripts\', \'plugin_scripts\');
function plugin_scripts() {
    wp_enqueue_script( \'js_ajax_handler\', plugin_dir_url( __FILE__ ) . \'js/ajax-handler.js\', array(\'jquery\'), \'1.0.0\', false );
    wp_localize_script( \'js_ajax_handler\', \'my_ajax_object\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
}

// AJAX: Generate/update provider table
add_action(\'wp_ajax_nopriv_updateTable\', \'updateTable\');
add_action(\'wp_ajax_updateTable\', \'updateTable\');

// Return output on POST with updated \'child-shortcode\'
function updateTable() {

    if (isset($_POST[\'providerList\'])) {
        $selectedProvider = $_POST[\'providerList\'];

        // Output table
        TablePress::$controller = TablePress::load_controller( \'frontend\' );
        $output .= tablepress_get_table( array(
            \'filter\' => $selectedProvider,
            \'id\' => \'1\'
        ) );

        // Success
        wp_send_json(array(\'status\' => \'success\', \'html\' => $output));
    }

    // Fail
    wp_send_json(array(\'status\' => \'fail\'));

    wp_die();

}

JS — AJAX handler

jQuery(document).ready(function($) {
    $(\'#submitProvider\').submit(function(e){
        e.preventDefault();
        $.ajax({ 
            cache: false,
            url: my_ajax_object.ajax_url,
            type: \'POST\',
            data: {
                \'action\': \'updateTable\',
                \'providerList\': $("[name=\'providerList\']").val()
            },
            error: function() {
                $("#table-container").html("Unable to load provider data"); 
            },
            beforeSend: function() {
                $(\'#table-container\').html("<img src=\'/icon__loading.gif\'>");
            },
            success: function(data){
                if(data.status == \'success\'){
                    $("#table-container").html(data.html);
                }
            },
            complete: function(data) {
                // Place/replace action buttons on successful completion
                exportTableButtons(); 
            },
        });
    });
});
如果您有任何建议,我将不胜感激。我不知道为什么在本地化脚本并使用wp_ajax_nopriv_updateTable.

1 个回复
SO网友:Graeme Bryson

好吧,我找到了另一个答案,最终解决了这个问题。我有一个功能(在functions.php) 它吊销了我使用自定义权限创建的某些用户类型的管理员访问权限,这些用户类型阻止了对admin-ajax.php. 旧/新功能如下:

Old function

// Revoke dashboard access
add_action(\'admin_init\', \'restrict_access_admin_panel\');
function restrict_access_admin_panel(){
  global $current_user;
  get_currentuserinfo();
  if ($current_user->user_level <  4) {
    wp_redirect( get_bloginfo(\'url\') );
    exit;
  }
}

New function

// Revoke dashboard access
add_action( \'admin_init\', \'restrict_access_admin_panel\' );
function restrict_access_admin_panel(){
    if ( !defined( \'DOING_AJAX\' ) && !current_user_can(\'administrator\') ){
        global $current_user;
        get_currentuserinfo();
        if ($current_user->user_level <  4) {
            wp_redirect( get_bloginfo(\'url\') );
            exit;
        }
    } 
}

相关推荐

如何从JavaScript访问自定义POST元数据

我已经为我的WooCommerce产品创建了自定义元字段。然而,我使用的插件(高级Woo搜索)是用JavaScript编写的,我需要访问PHP变量。我用过wp_localize_script() 这样做。然而,在前端,没有显示我的数据。以下是我的PHP代码: function js_enqueue_scripts() { global $post; $text2 = get_post_meta( $post->ID, \'_load_speed_field\',