使用数据表服务器端脚本 Wordpress 在调用 ajax 函数时获取 400 错误请求

Getting 400 Bad Request when calls ajax function using datatables server side scripting Wordpress

我正在创建一个插件以使用数据table 服务器端脚本从自定义 table 获取数据。

在查询中我得到了正确的响应,但在 ajax 函数调用中收到 400 个错误请求

请求URL:http://localhost/Project_name/wp-admin/admin-ajax.php 请求方法:POST 状态码:400 错误请求 远程地址:[::1]:80

我的ajaxjs文件

$(document).ready(function() {
var dataTable = $('#employee-grid').DataTable( {
        "processing": true,
        "serverSide": true,
        dataType: "json",
        contentType: "application/json",
        "ajax":{
            "url" : 'admin-ajax.php',
            "type": "POST",
            "data": {action: 'my_action'},
            error: function(){  // error handling
                $(".employee-grid-error").html("");
                $("#employee-grid").append('<tbody class="employee-grid-error"><tr><th colspan="3">No data found in the server</th></tr></tbody>');
    $("#employee-grid_processing").css("display","none");},
        success: function(data){
            alert(data);
        }
    },
        "columns": [
            {"data": "employee_name"},
            {"data": "employee_salary"},
            {"data": "employee_age"}                       
        ], "columnDefs": [
            //{"orderable": false, "targets": 12}
            ]
        } );
    } ); 

在 ajax 文件中还添加了 wp_ajax_my_action 和 wp_ajax_nopriv_my_action 操作。

ajax文件函数文件

add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

function my_action() {

global $wpdb;

## Read value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value

## Search 
$searchQuery = " ";
if($searchValue != ''){
    $searchQuery = " and (reportNo like '%".$searchValue."%' or  ) ";
}


$totalRecordwithFilter = $records['allcount'];

## Total number of records without filtering
$sel = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee');
$totalRecords = count($sel);


## Total number of records with filtering
/* $sel = mysqli_query($con,"select count(*) as allcount from employee WHERE 1 ".$searchQuery);
$records = mysqli_fetch_assoc($sel); */

$resultCount = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee where '.$searchQuery);
$totalRecordwithFilter = count($resultCount);



## Fetch records
//$empQuery = "select * from employee WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row.",".$rowperpage;
$empRecords = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . 'employee where '.$searchQuery.' order by ' . $columnName . ' ' . $columnSortOrder . ' limit ' . $row . ',' . $rowperpage);
$empRecords = mysqli_query($con, $empQuery);
$data = array();

foreach ($sel as $row) {
    $data[] = array(
            "emp_name"=>$row->employee_name,
            "salary"=>$row->employee_salary,
            "age"=>$row->employee_age
        );
}

## Response
$response = array(
    "draw" => intval($draw),
    "iTotalRecords" => $totalRecords,
    "iTotalDisplayRecords" => $totalRecordwithFilter,
    "aaData" => $data
);

echo json_encode($response);

exit();
}

更新 当我检查你使用的参数在你的 POST 方法中不存在时,你需要添加它们并检查它们是否存在

你应该像这样用你的 ajax 函数传递 POST 参数

data: {
    action: 'search_enrollment_by_scode',
    draw : 'draw',
    row : 'start',
    rowperpage : 'length',
    columnIndex : 'order',
    columnName : 'columns',
    columnSortOrder : 'order',
    searchValue : 'search',

}

注意:您应该添加有效数据或变量

您的 PHP 文件

<?php 
add_action( 'wp_ajax_my_action', 'my_action' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action' );

function my_action() {

global $wpdb;

## Read value
// you need to check that you have this data or not
// you just add action data not any of bellow list
if ($_POST['draw']) {
        $draw = $_POST['draw'];
.
.
.
.
.
.
.

    echo json_encode($response);
}
else
{
    echo json_encode('Data is invalid or not complete');
}
exit();
}
 ?>

试试这个,然后替换 "url" : 'admin-ajax.php',

中的 ajaxurl 变量
<script type="text/javascript">
    var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>

如 Wordpress AJAX 文档中所述,您有两个不同的挂钩 - wp_ajax_(action) 和 wp_ajax_nopriv_(action)。它们之间的区别是:

wp_ajax_(action):如果 ajax 调用是从管理面板内部进行的,则会触发此操作。 wp_ajax_nopriv_(action):如果从网站前端进行 ajax 调用,则会触发此事件。