Embeds: Who put this REST API infrastructure in my WordPress?
Well, while it's here, we probably should make use of it. The oEmbed endpoint now uses the REST API infrastructure, instead of providing its own. Props swissspidy. Fixes #34207. Built from https://develop.svn.wordpress.org/trunk@35436 git-svn-id: http://core.svn.wordpress.org/trunk@35400 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
@@ -10,36 +10,18 @@
|
||||
/**
|
||||
* oEmbed API endpoint controller.
|
||||
*
|
||||
* Parses the oEmbed API requests and delivers
|
||||
* XML and JSON responses.
|
||||
* Registers the API route and delivers the response data.
|
||||
* The output format (XML or JSON) is handled by the REST API.
|
||||
*
|
||||
* @since 4.4.0
|
||||
*/
|
||||
final class WP_oEmbed_Controller {
|
||||
/**
|
||||
* Hook into the query parsing to detect oEmbed requests.
|
||||
*
|
||||
* If an oEmbed request is made, trigger the output.
|
||||
* Register the oEmbed REST API route.
|
||||
*
|
||||
* @since 4.4.0
|
||||
*
|
||||
* @param WP_Query $wp_query The WP_Query instance (passed by reference).
|
||||
*/
|
||||
public function parse_query( $wp_query ) {
|
||||
if ( false === $wp_query->get( 'oembed', false ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( false === $wp_query->get( 'url', false ) ) {
|
||||
status_header( 400 );
|
||||
return get_status_header_desc( 400 );
|
||||
exit;
|
||||
}
|
||||
|
||||
$url = esc_url_raw( get_query_var( 'url' ) );
|
||||
|
||||
$format = wp_oembed_ensure_format( get_query_var( 'format' ) );
|
||||
|
||||
public function register_routes() {
|
||||
/**
|
||||
* Filter the maxwidth oEmbed parameter.
|
||||
*
|
||||
@@ -48,30 +30,40 @@ final class WP_oEmbed_Controller {
|
||||
* @param int $maxwidth Maximum allowed width. Default 600.
|
||||
*/
|
||||
$maxwidth = apply_filters( 'oembed_default_width', 600 );
|
||||
$maxwidth = absint( get_query_var( 'maxwidth', $maxwidth ) );
|
||||
|
||||
$callback = get_query_var( '_jsonp', false );
|
||||
|
||||
$request = array(
|
||||
'url' => $url,
|
||||
'format' => $format,
|
||||
'maxwidth' => $maxwidth,
|
||||
'callback' => $callback,
|
||||
);
|
||||
|
||||
echo $this->dispatch( $request );
|
||||
exit;
|
||||
register_rest_route( 'oembed/1.0/', '/embed', array(
|
||||
array(
|
||||
'methods' => WP_REST_Server::READABLE,
|
||||
'callback' => array( $this, 'get_item' ),
|
||||
'args' => array(
|
||||
'url' => array(
|
||||
'required' => true,
|
||||
'sanitize_callback' => 'esc_url_raw',
|
||||
),
|
||||
'format' => array(
|
||||
'default' => 'json',
|
||||
'sanitize_callback' => 'wp_oembed_ensure_format',
|
||||
),
|
||||
'maxwidth' => array(
|
||||
'default' => $maxwidth,
|
||||
'sanitize_callback' => 'absint',
|
||||
),
|
||||
),
|
||||
),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the whole request and print the response.
|
||||
* Callback for the API endpoint.
|
||||
*
|
||||
* Returns the JSON object for the post.
|
||||
*
|
||||
* @since 4.4.0
|
||||
*
|
||||
* @param array $request The request arguments.
|
||||
* @return string The oEmbed API response.
|
||||
* @param WP_REST_Request $request Full data about the request.
|
||||
* @return WP_Error|array oEmbed response data or WP_Error on failure.
|
||||
*/
|
||||
public function dispatch( $request ) {
|
||||
public function get_item( $request ) {
|
||||
$post_id = url_to_postid( $request['url'] );
|
||||
|
||||
/**
|
||||
@@ -86,79 +78,10 @@ final class WP_oEmbed_Controller {
|
||||
|
||||
$data = get_oembed_response_data( $post_id, $request['maxwidth'] );
|
||||
|
||||
if ( false === $data ) {
|
||||
status_header( 404 );
|
||||
return get_status_header_desc( 404 );
|
||||
if ( ! $data ) {
|
||||
return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) );
|
||||
}
|
||||
|
||||
if ( 'json' === $request['format'] ) {
|
||||
return $this->json_response( $data, $request );
|
||||
}
|
||||
|
||||
return $this->xml_response( $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* Print the oEmbed JSON response.
|
||||
*
|
||||
* @since 4.4.0
|
||||
*
|
||||
* @param array $data The oEmbed response data.
|
||||
* @param array $request The request arguments.
|
||||
* @return string The JSON response data.
|
||||
*/
|
||||
public function json_response( $data, $request ) {
|
||||
if ( ! is_string( $request['callback'] ) || preg_match( '/[^\w\.]/', $request['callback'] ) ) {
|
||||
$request['callback'] = false;
|
||||
}
|
||||
|
||||
$result = wp_json_encode( $data );
|
||||
|
||||
// Bail if the result couldn't be JSON encoded.
|
||||
if ( ! $result || ! is_array( $data ) || empty( $data ) ) {
|
||||
status_header( 501 );
|
||||
return get_status_header_desc( 501 );
|
||||
}
|
||||
|
||||
if ( ! headers_sent() ) {
|
||||
$content_type = $request['callback'] ? 'application/javascript' : 'application/json';
|
||||
header( 'Content-Type: ' . $content_type . '; charset=' . get_option( 'blog_charset' ) );
|
||||
header( 'X-Content-Type-Options: nosniff' );
|
||||
}
|
||||
|
||||
if ( $request['callback'] ) {
|
||||
return '/**/' . $request['callback'] . '(' . $result . ')';
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print the oEmbed XML response.
|
||||
*
|
||||
* @since 4.4.0
|
||||
*
|
||||
* @param array $data The oEmbed response data.
|
||||
* @return string The XML response data.
|
||||
*/
|
||||
public function xml_response( $data ) {
|
||||
if ( ! class_exists( 'SimpleXMLElement' ) ) {
|
||||
status_header( 501 );
|
||||
return get_status_header_desc( 501 );
|
||||
}
|
||||
|
||||
$result = _oembed_create_xml( $data );
|
||||
|
||||
// Bail if there's no XML.
|
||||
if ( ! $result ) {
|
||||
status_header( 501 );
|
||||
return get_status_header_desc( 501 );
|
||||
}
|
||||
|
||||
if ( ! headers_sent() ) {
|
||||
header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) );
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user