后者似乎只接受x-www-form-urlencoded
这不完全是真的。
WordPressadmin-ajax.php
从中执行操作$_REQUEST[\'action\']
和$_REQUEST
等于:
array_merge($_POST, $_GET);
但很多人没有意识到的是
$_GET
在PHP中是
not 数据是使用HTTP GET方法发送到页面的,事实上,您可以使用任何HTTP方法(POST、PUT、DELETE…)以及任何内容类型
$_GET
将始终包含传递给url查询字符串的数据。
这意味着如果你向wp-admin/admin-ajax.php?action=awesome_action
无论您使用的HTTP方法和HTTP内容类型如何,都会始终达到“awesome\\u action”。
简而言之,如果您能够用url发送action参数,那么可以使用admin-ajax.php
要发送任何JSON数据和HTTP方法your 解决问题。
但是这很容易使用php://input
流动
示例
首先,我将编写一个函数,使用curl发送JSON内容类型的HTTP请求(因为我不想在这里编写角度代码):
/**
* @param string $url Url for for the request
* @param string $data JSON-encoded data to send
*/
function mySendJson($url, $data)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // PUT HTTP method
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
\'Content-Type: application/json\', // JSON content type
\'Content-Length: \' . strlen($data))
);
return curl_exec($ch);
}
很简单。
现在,出于测试目的,我将在前端页脚中放置一个函数,该函数使用上面的函数发送JSON内容类型的HTTP请求,并期望返回一些JSON:
add_action(\'wp_footer\', function() {
$ajax_url = admin_url(\'admin-ajax.php?action=json-test\');
// some dummy json data
$data = array("name" => "Giuseppe", "country" => "Italy");
$json = json_encode($data);
// Using curl we simulate send HTTP request with json content type
// in your case is Angular that perform the request
$json_response = mySendJson($ajax_url, $json);
echo \'<pre>\';
print_r(json_decode($json_response, true));
echo \'</pre>\';
});
现在,什么时候
admin-ajax.php
它将查找附加到的任何回调
\'wp_ajax_json-test\'
挂钩(或
\'wp_ajax_nopriv_json-test\'
) 对于未登录的用户。
让我们为这些挂钩添加一个自定义函数:
add_action(\'wp_ajax_json-test\', \'myWpAjaxTest\');
add_action(\'wp_ajax_nopriv_json-test\', \'myWpAjaxTest\');
功能
myWpAjaxTest()
将具有JSON内容类型的HTTP请求发送到时,WordPress将调用
admin-ajax.php
.
让我们写下来:
function myWpAjaxTest() {
// Retrieve HTTP method
$method = filter_input(INPUT_SERVER, \'REQUEST_METHOD\', FILTER_SANITIZE_STRING);
// Retrieve JSON payload
$data = json_decode(file_get_contents(\'php://input\'));
// do something intersting with data,
// maybe something different depending on HTTP method
wp_send_json(array( // send JSON back
\'method\' => $method,
\'data_received\' => $data
));
}
感谢
php://input
(
docs) 最后一个函数
解析发送到的JSON数据admin-ajax.php
对其进行操作发回JSON响应(因为wp_send_json
uses json content type)最后,如果您查看主题页脚,您会发现如下内容:Array
(
[method] => PUT
[data_received] => Array
(
[name] => Giuseppe
[country] => Italy
)
)