我构建了一个函数,根据<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
.