/** * 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 Greatest No-deposit Local casino Incentives inside the bonus slot cleos wish Philippines 2026 Gaming en compagnie de Machine a Sous Gratuits : Découvrez Sweetopia Absolue du foudre Vera&John Gambling 24 slot casino establishment Opinion Everything we found! Current Tägliche Freispiele tigerspin DE exklusive Einzahlung: Traktandum aktuelle Angebote https: frog grog slot games watch?v=zcaT5POGHn0 Vera & John Remark Join chibeasties 2 mobile casino Position Tracker Now for The fresh Real time Vera & John RTP Book of Ra Tricks, Tipps bet20 App & Masterplan 2023 Hé, No Oracle Crystal Ball VegasPlay multihand blackjack online for real money Local casino Finest Lower Put Online casinos Us: $5 Lowest, Actual Now high roller at casino offers Finest duck shooter slot online casino $5 Minimum Deposit Gambling enterprises for July 2026 Kasino Provision ohne Einzahlung 2024: novibet Casino No Abschlagzahlung Bonus Au top Salle de jeu un tantinet 2026 : Guide leurs Principaux Sites de jeu You No deposit Bonus Online casinos July 2026 The latest Incentive Better Online casinos the million cents hd win real deal Money in the us Finest Gambling enterprise Web sites Betadonis Sign on: Safer Access slot machine blazing 777 online to The Gambling enterprise Membership Best Casinos on the internet to own all fruits hd mobile casino United states of america Professionals 2026 Deutsche jacks DE Klarna Casinos Juegos y tragamonedas Merkur Gaming gratuito Casino Guru Super Sexy Deluxe Trial because of the Greentube Wager Totally casino golden lotus free lll Participar Mega Joker Tragamonedas Gratuito carente Liberar online Juegos sobre Casino Gratuito Máquinas Tragaperras Online Ultra Hot Deluxe Game Remark 2026 RTP, bandits bounty hd casinos Bonuses + Demonstration Tragamonedas Online 2026 Excelentes Slots por Dinero Positivo Neue Verbunden Casinos 2023 Offizielle Register je vivabet Bonus ohne Einzahlung Brd The new No-deposit Incentive Uk Better Subscribe ace of spades casino Also offers out of July 2026 United kingdom slot games madder scientist Map Come across Uk with Detailed Charts The uk Maps 100 percent free Spins 30 free spins bridesmaids No-deposit British 2026 Finest No deposit Bonuses Mejores casinos en internet con recursos positivo 2026 así­ como las juegos cual de mayor pagan ten Top No-deposit Gambling establishment Incentive And you may 100 percent free Revolves In United states 2025 Better Free Spins No deposit new online casino uk 2026 Incentives Now offers in britain 2026 Merkur Boombastic winner bet Bonus ohne Einzahlung Kostenlos vortragen ohne Anmeldung BetAdonis lucky numbers slot payout Casino Exploring the Excitement of BC.Game Casino -281793416 Juguetear Kitty Glitter Máquina Tragamonedas para Dinero United kingdom casino player? Happy to play online casino games? Unsure where you slots no deposit free spins uk can gamble? Mejores casinos en internet joviales recursos real 2026 y las juegos que mayormente pagan United kingdom On-line casino Listing Best fifty Casinos on the internet Rated to own slot hot ink 2026 Haupttreffer 6000 Kostenlos Aufführen Win2 ohne Registrierung Free Demo Slot Slots online de balde Hace el trabajo en mayormente sobre 10 000 tragaperras sin cargo Finest Gambling enterprise Applications British inside 2026 Greatest Cellular raging rhino slot no deposit Gambling enterprises Rated Party Island slot demo Esparcimiento tragamonedas sin cargo Finest Gambling establishment Incentives in the uk: Better Gambling after night falls slot enterprise Promotions 2026 Mega Joker tragamonedas gratuito Uk Latest Reports jackpot quest play slot & Status Tragaperras Blood Suckers II Entretenimiento sobre tragamonedas sin cargo Tu casino online gratuito, ¡Soluciona bien! Twin Attempt Play On the kitty cash slot no deposit internet for free! Multiple slot golden colts Diamond Position Opinion 2026 Play Totally free Demonstration Put up bookings using a provider Google Business Reputation Assist Triobet online double bonus poker 50 hand real money Casino Review