WordPress默认的REST API端点大多仅支持JSON格式的数据交互,当需要实现XML文件接收功能时,我们需要手动自定义API端点,完成从请求接收、数据解析到文件存储的全流程处理。

自定义端点的基础准备
首先我们需要确认WordPress的REST API功能已开启,同时准备好开发环境,确保有修改主题functions.php文件或者自定义插件的权限,后续的端点注册代码都会放在这些位置。
注册自定义端点
使用register_rest_route函数注册自定义端点,需要指定命名空间、路由地址、处理方法以及支持的请求方法,这里我们支持POST请求来接收XML文件。
<?php
// 注册自定义REST API端点
add_action('rest_api_init', function() {
register_rest_route('custom/v1', '/receive-xml', [
'methods' => 'POST',
'callback' => 'handle_xml_upload',
// 关闭默认权限校验,后续手动处理
'permission_callback' => '__return_true'
]);
});
?>
权限校验处理
虽然上面暂时关闭了默认权限校验,但实际开发中需要添加自定义的权限验证逻辑,比如校验请求头中的认证令牌,避免端点被恶意调用。
<?php
// 自定义权限校验函数
function check_xml_upload_permission(WP_REST_Request $request) {
$auth_token = $request->get_header('X-Auth-Token');
// 这里替换为实际的令牌验证逻辑
if ($auth_token === 'valid_token_here') {
return true;
}
return new WP_Error('rest_forbidden', '无权限访问该端点', ['status' => 403]);
}
?>
之后把register_rest_route中的permission_callback改为check_xml_upload_permission即可。
XML文件接收与解析逻辑
接下来实现处理XML文件的核心回调函数,首先需要获取请求中的XML内容,然后解析XML数据,最后完成文件存储或者数据处理。
获取请求中的XML内容
POST请求的XML内容通常放在请求体中,我们可以通过WP_REST_Request对象的get_body方法获取原始内容。
<?php
// 处理XML上传的回调函数
function handle_xml_upload(WP_REST_Request $request) {
// 获取请求原始内容
$xml_content = $request->get_body();
if (empty($xml_content)) {
return new WP_Error('no_xml_content', '未接收到XML内容', ['status' => 400]);
}
// 解析XML内容
libxml_use_internal_errors(true);
$xml_obj = simplexml_load_string($xml_content);
if ($xml_obj === false) {
$errors = libxml_get_errors();
$error_msg = 'XML解析失败:';
foreach ($errors as $error) {
$error_msg .= $error->message . ' ';
}
libxml_clear_errors();
return new WP_Error('xml_parse_error', $error_msg, ['status' => 400]);
}
// 处理解析后的XML数据
return process_xml_data($xml_obj);
}
?>
XML数据存储与处理
解析完成后的XML对象可以根据业务需求进行处理,比如提取节点数据存储到数据库,或者将原始XML内容保存为文件。
<?php
// 处理解析后的XML数据
function process_xml_data($xml_obj) {
// 提取XML中的示例节点数据,根据实际XML结构调整
$file_name = isset($xml_obj->file_name) ? (string)$xml_obj->file_name : 'default.xml';
$file_content = isset($xml_obj->content) ? (string)$xml_obj->content : '';
// 保存XML文件到WordPress上传目录
$upload_dir = wp_upload_dir();
$save_path = $upload_dir['path'] . '/' . sanitize_file_name($file_name);
// 写入文件
$write_result = file_put_contents($save_path, $xml_obj->asXML());
if ($write_result === false) {
return new WP_Error('save_failed', 'XML文件保存失败', ['status' => 500]);
}
// 返回成功响应
return rest_ensure_response([
'code' => 'success',
'message' => 'XML文件接收并处理成功',
'file_path' => $upload_dir['url'] . '/' . sanitize_file_name($file_name)
]);
}
?>
常见问题与注意事项
- XML解析时需要开启
libxml_use_internal_errors(true),避免解析错误直接抛出导致接口报错,方便捕获错误信息返回给调用方。 - 接收的XML内容需要做安全校验,避免恶意XML内容造成XXE等安全漏洞,必要时可以禁用外部实体加载。
- 如果XML文件体积较大,需要调整WordPress的请求体大小限制,避免大文件无法接收。
- 存储文件时需要用
sanitize_file_name处理文件名,避免路径遍历等安全问题。
请求测试示例
可以使用Postman或者curl工具测试自定义端点,发送POST请求到https://你的域名/wp-json/custom/v1/receive-xml,请求头设置Content-Type: application/xml,请求体放入XML内容即可。
# curl测试示例 curl -X POST "https://ipipp.com/wp-json/custom/v1/receive-xml" -H "Content-Type: application/xml" -H "X-Auth-Token: valid_token_here" -d '<?xml version="1.0" encoding="UTF-8"?><root><file_name>test.xml</file_name><content>测试XML内容</content></root>'
WordPress_REST_API自定义端点XML文件接收PHP开发修改时间:2026-06-21 09:36:31