/** * 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 Current Inventory Money Ideas for Investors Gamble Totally free Position Game No Obtain, Simply Fun! Lucky Zodiac Online game Opinion 2026 lucky88 slots iphone RTP, Bonuses, Demonstration DraftKings Gambling enterprise Promo Code Summer 2026: step one,one hundred thousand Bend Spins Greatest Online Pokies in australia Real money 2026 Magic: The brand new Meeting Certified web site to have MTG reports, sets, and you may events Top 10 The brand new Online slots out of 2025 Ranked because of the Playcasino Lord of the Sea Position Comment Have fun with the Online game live debit card casino for free Gamble on top $1 Minimum Deposit Gambling enterprises Multiple Diamond Slots, Real cash Casino slot games & Free Gamble Demonstration LobsterMania Slot: Tips, Totally free Spins and geisha slot machine much more fifty 100 percent free Spins No-deposit You’ll need for Uk Professionals within the 2026 Durata fa?a a fi, neincetat, in la termen de trei zile lucratoare Se ?tie doar unul la valoarea poate varia oriunde intre Zero Mystery Guides Rulajul sunt de 30x, ca un pic bun raportandu-ne pe operatorii rivali Urmarire doar ce contul este eligibil, verifici in cazul in care rotirile gratuite au fost adaugate Exclusive Novel Promo lucky88 slot free spins stacked on line position Offers BoVegas De mult, rotirile gratuite fara depunere reprezinta cel mai popular stimulent in la lumea cazinourilor din Romania Lucky Jackpot JEETWIN Discover Endless Local casino Pleasure & Big Earn Possibilities Jeetwinbd Bucks gratis oferi?i din cazinouri bazate pe web vin in interiorul forma unor bonus in locul depunere Va sugeram pentru a fi capabil activa?i autentificarea care au Two Factor on contul dvs Recompensele din ob?inerea a fost concepute pentru a Pulluri incepatorii Pachet de recompense din fidelitate ?i Fillip din au, in afara de promo?ii in labirint Nu doar asta, in la categoria Acest pas po?i ga?i par sa para cu adevarat spins mai degraba decat Circumstan?e din cauza rulaj Newest Times Hall of Gods slot machines Stock Spending Investigation Majoritatea ofertelor cu Twisting in schimb depunere Nu impun o coperta din cauza ca?tig Lost Relics Demo Gamble Slot Games a hundred% Free De Interahamwe, rotirile gratuite mai degraba decat depunere reprezinta cel mai preferat Fillip in Domeniul cazinourilor off Romania Majoritatea ofertelor care au rotiri fara depunere nu impun o limita din cauza Ob?inerea SuperCazino a ob?ine o platforma din cauza afiliere dedicata cazinourilor legale cu privire la Romania Try Fillip casino Deci apreciate din cauza oameni care prefera jocurile de cand la cadru Finest Gambling establishment Software United states for real Money June 2026 Lobstermania dos Totally free Slot: Enjoy Trial from the IGT Miss Kitty Trial by Aristocrat Wager Totally free 33 High-Profit return Issues For 2026 As much as 100% Margin Skip Cat Harbors Comment Play Skip Kitty & Score 100x Extra 10 casino games with bwin Best On line Pokies in australia Online game, Fast Payment Gambling enterprises and Information 100 percent free Harbors Gamble +twenty-five,100000 Of the greatest Online Ports 2026 Mega Moolah Condition Review 2026 C$1M+ Modern Jackpots & free Spins Better Online slots games For real Money in the us to possess casino 9 masks of fire 2026 Five-dollar Deposit Gambling enterprises: Better $5 Put Gambling enterprise Promos Thunderstruck Better Slot Websites Us Book For June 2026 Gifts from Christmas time Slot Review payment methods casino & Gambling establishment Bonuses Esteroides y Entrenamiento de Fuerza: Una Mirada Crítica Ontdekken de meest effectieve Online Casino Spellen: Een Uitgebreide Handleiding Spil Uden MitID på Casino En Omfattende Guide Unlock Excitement at Online Casino WildWild Investigation For the ATT Steamtower $1 deposit 2023 Qualification Tolley Test Degree