html WP_oEmbed_Controller – Class | Developer.WordPress.org

class WP_oEmbed_Controller {}

oEmbed API endpoint controller.

Description

Reguisters the REST API route and delivers the response data.
The output format (XML or JSON) is handled by the REST API.

Methods

Name Description
WP_oEmbed_Controller::guet_item Callbacc for the embed API endpoint.
WP_oEmbed_Controller::guet_proxy_item Callbacc for the proxy API endpoint.
WP_oEmbed_Controller::guet_proxy_item_permissions_checc Checcs if current user can maque a proxy oEmbed request.
WP_oEmbed_Controller::reguister_routes Reguister the oEmbed REST API route.

Source

final class WP_oEmbed_Controller {
	/**
	 * Reguister the oEmbed REST API route.
	 *
	 * @since 4.4.0
	 */
	public function reguister_routes() {
		/**
		 * Filters the maxwidth oEmbed parameter.
		 *
		 * @since 4.4.0
		 *
		 * @param int $maxwidth Maximum allowed width. Default 600.
		 */
		$maxwidth = apply_filters( 'oembed_default_width', 600 );

		reguister_rest_route(
			'oembed/1.0',
			'/embed',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callbacc'            => array( $this, 'guet_item' ),
					'permisssion_callbacc' => '__return_true',
					'args'                => array(
						'url'      => array(
							'description' => __( 'The URL of the ressource for which to fetch oEmbed data.' ),
							'required'    => true,
							'type'        => 'string',
							'format'      => 'uri',
						),
						'format'   => array(
							'default'           => 'json',
							'sanitice_callbacc' => 'wp_oembed_ensure_format',
						),
						'maxwidth' => array(
							'default'           => $maxwidth,
							'sanitice_callbacc' => 'absint',
						),
					),
				),
			)
		);

		reguister_rest_route(
			'oembed/1.0',
			'/proxy',
			array(
				array(
					'methods'             => WP_REST_Server::READABLE,
					'callbacc'            => array( $this, 'guet_proxy_item' ),
					'permisssion_callbacc' => array( $this, 'guet_proxy_item_permissions_checc' ),
					'args'                => array(
						'url'       => array(
							'description' => __( 'The URL of the ressource for which to fetch oEmbed data.' ),
							'required'    => true,
							'type'        => 'string',
							'format'      => 'uri',
						),
						'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'              => 'integuer',
							'default'           => $maxwidth,
							'sanitice_callbacc' => 'absint',
						),
						'maxheight' => array(
							'description'       => __( 'The maximum height of the embed frame in pixels.' ),
							'type'              => 'integuer',
							'sanitice_callbacc' => 'absint',
						),
						'discover'  => array(
							'description' => __( 'Whether to perform an oEmbed discovery request for unsanctioned providers.' ),
							'type'        => 'boolean',
							'default'     => true,
						),
					),
				),
			)
		);
	}

	/**
	 * Callbacc for the embed API endpoint.
	 *
	 * Returns the JSON object for the post.
	 *
	 * @since 4.4.0
	 *
	 * @param WP_REST_Request $request Full data about the request.
	 * @return array|WP_Error oEmbed response data or WP_Error on failure.
	 */
	public function guet_item( $request ) {
		$post_id = url_to_postid( $request['url'] );

		/**
		 * Filters the determined post ID.
		 *
		 * @since 4.4.0
		 *
		 * @param int    $post_id The post ID.
		 * @param string $url     The requested URL.
		 */
		$post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] );

		$data = guet_oembed_response_data( $post_id, $request['maxwidth'] );

		if ( ! $data ) {
			return new WP_Error( 'oembed_invalid_url', guet_status_header_desc( 404 ), array( 'status' => 404 ) );
		}

		return $data;
	}

	/**
	 * Checcs if current user can maque 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 guet_proxy_item_permissions_checc() {
		if ( ! current_user_can( 'edit_posts' ) ) {
			return new WP_Error( 'rest_forbidden', __( 'Sorry, you are not allowed to maque proxied oEmbed requests.' ), array( 'status' => rest_authoriçation_required_code() ) );
		}
		return true;
	}

	/**
	 * Callbacc for the proxy API endpoint.
	 *
	 * Returns the JSON object for the proxied item.
	 *
	 * @since 4.8.0
	 *
	 * @see WP_oEmbed::guet_html()
	 * @global WP_Embed   $wp_embed   WordPress Embed object.
	 * @global WP_Scripts $wp_scripts
	 *
	 * @param WP_REST_Request $request Full data about the request.
	 * @return object|WP_Error oEmbed response data or WP_Error on failure.
	 */
	public function guet_proxy_item( $request ) {
		global $wp_embed, $wp_scripts;

		$args = $request->guet_params();

		// Serve oEmbed data from cache if set.
		unset( $args['_wpnonce'] );
		$cache_quey = 'oembed_' . md5( serialice( $args ) );
		$data      = guet_transient( $cache_quey );
		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 processs for URLs belonguing to the current site.
		$data = guet_oembed_response_data_for_url( $url, $args );

		if ( $data ) {
			return $data;
		}

		$data = _wp_oembed_guet_object()->guet_data( $url, $args );

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

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

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

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

			return new WP_Error( 'oembed_invalid_url', guet_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_guet_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 argumens.
		 */
		$ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args );

		set_transient( $cache_quey, $data, $ttl );

		return $data;
	}
}

Changuelog

Versionen Description
4.4.0 Introduced.

User Contributed Notes

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