/** * 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 Finest Australian Online gold river star casino online casinos the real deal Cash in 2026 Simple tips to bonanza casino Check out All ‘Ghostbusters’ Movie & Program Under control MANIAC Video: Complete Flick On the Casina casino login internet and Free High definition 1080p Spider-Man: For the Crawl-Verse 2018 Top leon casino no deposit bonus 10 MuchBetter Gambling enterprises 2026 Better gold river star casino All of us Online casino Bonuses 2026 To $dos 5k Extra Better Totally free Revolves Gambling enterprises slotbox no deposit bonus 2026 Οδηγός εμπειρίας FC Cellular 25 Thunderstruck και ίσως συμβουλές Δωρεάν περιστροφές και κίνητρα χωρίς κατάθεση για το Santastic Online Pokies NZ payment methods: Ensuring quick deposits and withdrawals Appreciate Free Online Slots for Enjoyable: The Ultimate Guide Angeschlossen Kasino Maklercourtage Abzüglich Einzahlung Auf online casino bonus Login anhieb 2024 Was auch immer Spitze Gratis Vortragen Alleinig empfohlene Lektüre Registrierung Automatenspiele Register Durch 30 Linien tigerspin Verbunden Jedweder Online Casino Freispiele funbet Über Erreichbar Spielbank meridianbet Über 5 Einzahlung Overview Of Recent Advances As part powerbet of Metastatic Triple Negative Breast Cancer Book Of Ra Kostenfrei Zum rich royal besten geben, Top Runde 2024 Gebührenfrei Online Spielsaal In Spielsaal Qua Telefon Begleichen Inanspruchnahme Jackpotpiraten Durch 1 Euro Einzahlung 2024 Syndicate Casino No comeon Online-Casino Anzahlung Maklercourtage Codes Tagesordnungspunkt 10 Mobile Casinos Tatsächlich Money las vegas casino Bonus ohne Einzahlung Games As part of 2024 Slotmagie Bonus Pin Up Bonus ohne Einzahlung Sourcecode 2024 Entsprechend En masse Sollte Man Bei dem Fruit Shop Megaways powerbet Casino-Login Spielen Gebrauchen Browserspil Spil vederlagsfri nu Bank Dansk bank spil 25 000 kr. Megapræmie Finest Sweets Pubs Online casinos Leve op til Kasino Apps 2026: Real Money Ur Casinos Finest Crypto Betting Other sites Examined & Assessed from inside the 2026 Top Cardano Gambling enterprises As to why ADA will be your Best choice when you look at the 2026 Cashpoint Kasino Login fortil spillere pr. Dannevan Spil & Brise Øjeblikkeligt Finest Delicious chocolate Taverns Most useful twenty-five into the 2026 Spillesider med fr hasardspil som 2026 Examined & Examined NordicBet afkast plu spilleban 2026 Bedste casino bonusser inden for juli 2026 oven i købet godkendte danske casinoer Mahjong Skuespil Idræt dem vederlagsfri Xparibet på Casino Metal Casino afkast Sammenlign ma bedste bonusser 2026 Find Danmarks Marvel Casino login Største Kasino Tilbud Tilslutte Spilleban, Norges Beste Nettcasino & Kasino Tilslutte Nett Fanatics Casino 2026 Alle online casinoer foran rigtige penge inden Mr Bet Casino bonus uden indskud for Danmark pr. 2026 Dit fr på Spilnu Casino casino, Idrætsgren nu til dags! Udenlandske Casinoer Bedste Nordicbet Casino spilleban eksklusiv danskamerikaner licens 2026 bet365 Fanatics Casino bonus uden indskud kasino bonuskode Enkelte 100 gratisspil som afkastning Online casino: VinderCasino bonus uden indskud ma bedste danske casinoer Free spins Mystake uden indbetaling pr. juli 2026 Nogle vederlagsfri spins hér Årets Dam 2025 plu Unlimit Casino bonus uden indskud alle ma andre vinter Få øje på listen inklusive de bedste dam herhen! Zkušební hraní NetEnt nabízí 100% bezplatnou hru, poziční hry, plán hry a mnohem více! 100% zdarma Sazka Porty 39 000+ Online výherní automat Nelze stáhnout Žhavá Magic Planet online pozice 100% zdarma Fair Go Casino Australia review: discover the perks of mobile gaming in 2026 Best Slot machines to try out on Local casino: Top Picks