2015-10-07 10:36:25 +00:00
<? php
/**
* WP_oEmbed_Controller class, used to provide an oEmbed endpoint.
*
* @package WordPress
* @subpackage Embeds
* @since 4.4.0
*/
/**
* oEmbed API endpoint controller.
*
2015-10-29 22:51:24 +00:00
* Registers the API route and delivers the response data.
* The output format (XML or JSON) is handled by the REST API.
2015-10-07 10:36:25 +00:00
*
* @since 4.4.0
*/
final class WP_oEmbed_Controller {
/**
2015-10-29 22:51:24 +00:00
* Register the oEmbed REST API route.
2015-10-07 10:36:25 +00:00
*
* @since 4.4.0
*/
2015-10-29 22:51:24 +00:00
public function register_routes () {
2015-10-07 10:36:25 +00:00
/**
2016-05-22 18:15:28 +00:00
* Filters the maxwidth oEmbed parameter.
2015-10-07 10:36:25 +00:00
*
* @since 4.4.0
*
* @param int $maxwidth Maximum allowed width. Default 600.
*/
$maxwidth = apply_filters ( 'oembed_default_width' , 600 );
2017-11-30 23:11:00 +00:00
register_rest_route (
2018-08-17 01:51:36 +00:00
'oembed/1.0' ,
'/embed' ,
array (
2017-11-30 23:11:00 +00:00
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' ,
),
2015-10-29 22:51:24 +00:00
),
),
2017-11-30 23:11:00 +00:00
)
);
2017-05-11 18:18:46 +00:00
2017-11-30 23:11:00 +00:00
register_rest_route (
2018-08-17 01:51:36 +00:00
'oembed/1.0' ,
'/proxy' ,
array (
2017-11-30 23:11:00 +00:00
array (
'methods' => WP_REST_Server :: READABLE ,
'callback' => array ( $this , 'get_proxy_item' ),
'permission_callback' => array ( $this , 'get_proxy_item_permissions_check' ),
'args' => array (
'url' => array (
'description' => __ ( 'The URL of the resource for which to fetch oEmbed data.' ),
'type' => 'string' ,
'required' => true ,
'sanitize_callback' => 'esc_url_raw' ,
),
'format' => array (
'description' => __ ( 'The oEmbed format to use.' ),
'type' => 'string' ,
'default' => 'json' ,
'enum' => array (
'json' ,
'xml' ,
),
),
'maxwidth' => array (
'description' => __ ( 'The maximum width of the embed frame in pixels.' ),
'type' => 'integer' ,
'default' => $maxwidth ,
'sanitize_callback' => 'absint' ,
),
'maxheight' => array (
'description' => __ ( 'The maximum height of the embed frame in pixels.' ),
'type' => 'integer' ,
'sanitize_callback' => 'absint' ,
),
'discover' => array (
'description' => __ ( 'Whether to perform an oEmbed discovery request for non-whitelisted providers.' ),
'type' => 'boolean' ,
'default' => true ,
2017-05-11 18:18:46 +00:00
),
),
),
2017-11-30 23:11:00 +00:00
)
);
2015-10-07 10:36:25 +00:00
}
/**
2017-05-11 18:18:46 +00:00
* Callback for the embed API endpoint.
2015-10-29 22:51:24 +00:00
*
* Returns the JSON object for the post.
2015-10-07 10:36:25 +00:00
*
* @since 4.4.0
*
2015-10-29 22:51:24 +00:00
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|array oEmbed response data or WP_Error on failure.
2015-10-07 10:36:25 +00:00
*/
2015-10-29 22:51:24 +00:00
public function get_item ( $request ) {
2015-10-07 10:36:25 +00:00
$post_id = url_to_postid ( $request [ 'url' ] );
/**
2016-05-22 18:15:28 +00:00
* Filters the determined post ID.
2015-10-07 10:36:25 +00:00
*
* @since 4.4.0
*
* @param int $post_id The post ID.
2015-10-31 15:38:25 +00:00
* @param string $url The requested URL.
2015-10-07 10:36:25 +00:00
*/
$post_id = apply_filters ( 'oembed_request_post_id' , $post_id , $request [ 'url' ] );
$data = get_oembed_response_data ( $post_id , $request [ 'maxwidth' ] );
2015-10-29 22:51:24 +00:00
if ( ! $data ) {
return new WP_Error ( 'oembed_invalid_url' , get_status_header_desc ( 404 ), array ( 'status' => 404 ) );
2015-10-07 10:36:25 +00:00
}
2015-10-29 22:51:24 +00:00
return $data ;
2015-10-07 10:36:25 +00:00
}
2017-05-11 18:18:46 +00:00
/**
* Checks if current user can make a proxy oEmbed request.
*
* @since 4.8.0
*
* @return true|WP_Error True if the request has read access, WP_Error object otherwise.
*/
public function get_proxy_item_permissions_check () {
if ( ! current_user_can ( 'edit_posts' ) ) {
return new WP_Error ( 'rest_forbidden' , __ ( 'Sorry, you are not allowed to make proxied oEmbed requests.' ), array ( 'status' => rest_authorization_required_code () ) );
}
return true ;
}
/**
* Callback for the proxy API endpoint.
*
* Returns the JSON object for the proxied item.
*
* @since 4.8.0
*
* @see WP_oEmbed::get_html()
* @param WP_REST_Request $request Full data about the request.
2017-07-14 16:05:43 +00:00
* @return object|WP_Error oEmbed response data or WP_Error on failure.
2017-05-11 18:18:46 +00:00
*/
public function get_proxy_item ( $request ) {
$args = $request -> get_params ();
// Serve oEmbed data from cache if set.
2017-07-12 22:51:40 +00:00
unset ( $args [ '_wpnonce' ] );
2017-05-11 18:18:46 +00:00
$cache_key = 'oembed_' . md5 ( serialize ( $args ) );
2017-11-30 23:11:00 +00:00
$data = get_transient ( $cache_key );
2017-05-11 18:18:46 +00:00
if ( ! empty ( $data ) ) {
return $data ;
}
$url = $request [ 'url' ];
unset ( $args [ 'url' ] );
2017-07-14 16:05:43 +00:00
// Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names.
if ( isset ( $args [ 'maxwidth' ] ) ) {
$args [ 'width' ] = $args [ 'maxwidth' ];
}
if ( isset ( $args [ 'maxheight' ] ) ) {
$args [ 'height' ] = $args [ 'maxheight' ];
}
2018-12-14 03:20:37 +00:00
// Short-circuit process for URLs belonging to the current site.
$data = get_oembed_response_data_for_url ( $url , $args );
if ( $data ) {
return $data ;
}
2017-05-11 18:18:46 +00:00
$data = _wp_oembed_get_object () -> get_data ( $url , $args );
if ( false === $data ) {
return new WP_Error ( 'oembed_invalid_url' , get_status_header_desc ( 404 ), array ( 'status' => 404 ) );
}
2018-12-14 03:20:37 +00:00
/** This filter is documented in wp-includes/class-oembed.php */
$data -> html = apply_filters ( 'oembed_result' , _wp_oembed_get_object () -> data2html ( ( object ) $data , $url ), $url , $args );
2017-05-11 18:18:46 +00:00
/**
* Filters the oEmbed TTL value (time to live).
*
* Similar to the {@see 'oembed_ttl'} filter, but for the REST API
* oEmbed proxy endpoint.
*
* @since 4.8.0
*
* @param int $time Time to live (in seconds).
* @param string $url The attempted embed URL.
* @param array $args An array of embed request arguments.
*/
$ttl = apply_filters ( 'rest_oembed_ttl' , DAY_IN_SECONDS , $url , $args );
set_transient ( $cache_key , $data , $ttl );
return $data ;
}
2015-10-07 10:36:25 +00:00
}