_oembed_rest_pre_serve_request()
云策文档标注
概述
_oembed_rest_pre_serve_request() 是一个 WordPress Hook,用于在 REST API 输出中切换为 XML 格式,专门针对 oEmbed API 端点。它检查请求参数,并在需要时生成并输出 XML 响应。
关键要点
- 此 Hook 仅在 oEmbed API 端点(/oembed/1.0/embed)的 GET 请求中生效,且要求参数 format 设置为 'xml'。
- 函数接收四个参数:$served(布尔值,表示请求是否已处理)、$result(WP_HTTP_Response 对象)、$request(WP_REST_Request 对象)和 $server(WP_REST_Server 实例)。
- 如果条件满足,它会调用 _oembed_create_xml() 将数据转换为 XML,并设置 Content-Type 头为 text/xml,然后输出 XML 内容。
- 返回布尔值:true 表示请求已处理,false 表示未处理。
代码示例
function _oembed_rest_pre_serve_request( $served, $result, $request, $server ) {
$params = $request->get_params();
if ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) {
return $served;
}
if ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) {
return $served;
}
// Embed links inside the request.
$data = $server->response_to_data( $result, false );
if ( ! class_exists( 'SimpleXMLElement' ) ) {
status_header( 501 );
die( get_status_header_desc( 501 ) );
}
$result = _oembed_create_xml( $data );
// Bail if there's no XML.
if ( ! $result ) {
status_header( 501 );
die( get_status_header_desc( 501 ) );
}
if ( ! headers_sent() ) {
$server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) );
}
echo $result;
return true;
}注意事项
- 此函数依赖于 SimpleXMLElement 类,如果不存在,会返回 501 状态码并终止执行。
- 在输出 XML 前,会检查头部是否已发送,以避免冲突。
- 相关函数包括 _oembed_create_xml()、status_header()、get_status_header_desc() 和 get_option()。
原文内容
Hooks into the REST API output to print XML instead of JSON.
Description
This is only done for the oEmbed API endpoint, which supports both formats.
Parameters
$servedboolrequired-
Whether the request has already been served.
$resultWP_HTTP_Responserequired-
Result to send to the client. Usually a
WP_REST_Response. $requestWP_REST_Requestrequired-
Request used to generate the response.
$serverWP_REST_Serverrequired-
Server instance.
Source
function _oembed_rest_pre_serve_request( $served, $result, $request, $server ) {
$params = $request->get_params();
if ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) {
return $served;
}
if ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) {
return $served;
}
// Embed links inside the request.
$data = $server->response_to_data( $result, false );
if ( ! class_exists( 'SimpleXMLElement' ) ) {
status_header( 501 );
die( get_status_header_desc( 501 ) );
}
$result = _oembed_create_xml( $data );
// Bail if there's no XML.
if ( ! $result ) {
status_header( 501 );
die( get_status_header_desc( 501 ) );
}
if ( ! headers_sent() ) {
$server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) );
}
echo $result;
return true;
}
Changelog
| Version | Description |
|---|---|
| 4.4.0 | Introduced. |