函数文档

_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.

Return

bool True if the request was served, false otherwise.

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.