WP_oEmbed_Controller::get_proxy_item( WP_REST_Request $request ): object|WP_Error

Callback for the proxy API endpoint.

Description

Returns the JSON object for the proxied item.

See also

Parameters

$requestWP_REST_Requestrequired
Full data about the request.

Return

object|WP_Error oEmbed response data or WP_Error on failure.

Source

public function get_proxy_item( $request ) {
	global $wp_embed, $wp_scripts;

	$args = $request->get_params();

	// Serve oEmbed data from cache if set.
	unset( $args['_wpnonce'] );
	$cache_key = 'oembed_' . md5( serialize( $args ) );
	$data      = get_transient( $cache_key );
	if ( ! empty( $data ) ) {
		return $data;
	}

	$url = $request['url'];
	unset( $args['url'] );

	// 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'];
	}

	// Short-circuit process for URLs belonging to the current site.
	$data = get_oembed_response_data_for_url( $url, $args );

	if ( $data ) {
		return $data;
	}

	$data = _wp_oembed_get_object()->get_data( $url, $args );

	if ( false === $data ) {
		// Try using a classic embed, instead.
		/* @var WP_Embed $wp_embed */
		$html = $wp_embed->get_embed_handler_html( $args, $url );

		if ( $html ) {
			// Check if any scripts were enqueued by the shortcode, and include them in the response.
			$enqueued_scripts = array();

			foreach ( $wp_scripts->queue as $script ) {
				$enqueued_scripts[] = $wp_scripts->registered[ $script ]->src;
			}

			return (object) array(
				'provider_name' => __( 'Embed Handler' ),
				'html'          => $html,
				'scripts'       => $enqueued_scripts,
			);
		}

		return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) );
	}

	/** This filter is documented in wp-includes/class-wp-oembed.php */
	$data->html = apply_filters( 'oembed_result', _wp_oembed_get_object()->data2html( (object) $data, $url ), $url, $args );

	/**
	 * Filters the oEmbed TTL value (time to live).
	 *
	 * Similar to the '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;
}

Hooks

apply_filters( ‘oembed_result’, string|false $data, string $url, string|array $args )

Filters the HTML returned by the oEmbed provider.

apply_filters( ‘rest_oembed_ttl’, int $time, string $url, array $args )

Filters the oEmbed TTL value (time to live).

Changelog

VersionDescription
4.8.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.