/** * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. * * @package WordPress * @subpackage Embeds * @since 4.4.0 */ /** * oEmbed API endpoint controller. * * Registers the REST API route and delivers the response data. * The output format (XML or JSON) is handled by the REST API. * * @since 4.4.0 */ #[AllowDynamicProperties] final class WP_oEmbed_Controller { /** * Register the oEmbed REST API route. * * @since 4.4.0 */ public function register_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 ); register_rest_route( 'oembed/1.0', '/embed', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => '__return_true', 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'default' => 'json', 'sanitize_callback' => 'wp_oembed_ensure_format', ), 'maxwidth' => array( 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), ), ), ) ); register_rest_route( 'oembed/1.0', '/proxy', array( 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.' ), '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' => '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 unsanctioned providers.' ), 'type' => 'boolean', 'default' => true, ), ), ), ) ); } /** * Callback 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 get_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 = get_oembed_response_data( $post_id, $request['maxwidth'] ); if ( ! $data ) { return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } return $data; } /** * 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() * @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 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 {@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; } } https://validator.w3.org/feed/docs/rss2.html Guide goldbet free no deposit out of Ra Have fun with the Position the real deal Currency Greatest Online slots for real Cash in 2026: ten Greatest Gambling establishment Websites Safe Casinos on the internet Australia 2025 10 Trusted Aussie Gambling enterprise Sites Casino All in Bet Fondo Minuscolo 1 Euro: Accertamento ADM 2026 Fa Fa Fa Position Review 2026 Try this Online game from the Luxury casino Genesis Gambling Free Ports Play Immediately +5000 Game for fun from the Gambling enterprise Pearls Recensione Casinia Confusione: Gratifica, Asportazione ancora Inganno Betstation Online Greatest Online slots games British 2026 Better Uk Position Game to have Larger Wins and Highest Winnings Best Ports Sites within the South Africa 2025 888 bonus addirittura codici promozionali verso giocare Planetwin365 a sbafo nel 2026 Lobstermania Position Review 2026 Play On the internet! Pokies ReviewsWhat Pokie Servers Victories more? Better Cent Ports to try out On line 2026 Complete Reviews Better several Finest Payment Harbors 2026 Commission Payment and Organization Gonzos Quest Slot Betsport24 Gioco Demo Play & Free Spins Greatest Online casinos in america 2026 A real income Real money harbors Best On line Slot Casinos in the usa: Better Slot Internet sites for 2026 Better a real income online slots Gamble slots for real money al com Migliori BetWin360 Mucchio Online AAMS ADM 2026: Siti Sicuri addirittura Top Gratifica Better Real money Slots Web sites Us July 2026 Better On the internet Pokies in australia Expert-Recognized in the 2026 Better Gambling establishment Apps: Best A real income Cellular Casinos 2026 step 1 Put Gambling establishment Websites: step 1 Lowest Put Local casino United kingdom On the web Social Casino Usually Absolve to Gamble Better On-line casino Canada Leading A real income Internet sites 2026 The fresh fifty better eating in the Valencia you need to are I Migliori Totosi Scompiglio con Registrazione SPID in Italia nel 2026 Best Real cash Web based casinos Top Within the July 2026 Better Payment Online casinos in the us 2026 Gold-rush Slot machine Wager Totally free on the Browser Greatest Bitcoin Gambling establishment Internet sites 2026 Checked out and Affirmed Greatest Crypto Gambling enterprises United kingdom 2026 Top 10 Bitcoin Gambling establishment Internet sites Slotexo Mucchio: Deposita anche richiedi un premio del Bw360 accesso al casinĂ² 100%, 200 FS Avalon Internet casino Slot Video game 15 Marvels doing on the Hague 16 Greatest 100 percent free Revolves Local casino No-deposit Incentive Requirements within the 2026 Unlike slots or roulette, in which money should be contradictory, blackjack offers lingering performance with a pretty reasonable publicity Best Online slots Real money: 2026 Self-help guide to High RTP Slot Video game Greatest Web based casinos Video slot Odds Just what are Your odds of Successful from the Slots? Greatest casino games to begin with: As to why very first games matters more than very first bonus Free online games Enjoy intense casino no deposit bonus Now to your Y8 com The newest 50 better eating inside Valencia you have to is actually Trece libros para que lea toda una familia Choy Sunlight Bet365 online casino easy verification Doa Slot Opinion 2026 Totally free Play Trial Finest Crypto and you will Bitcoin Gambling establishment Incentives within the July 2026 How and why try Judge in nv casino the us? Greatest Online Pokies Australia 2025: Top 10 Au Pokie Sites Superiores tragaperras legales referente a Argentina