/** * 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 Thunderstruck resident 3d $1 deposit Slots Siberian Storm On the web Slot serious link Enjoy Trial Free of charge Explore $3300 + play vegas party real money 50 Free Spins Greatest Internet casino The fresh Web wild jack slot machine real money based casinos in america: 2026 Complete Recommendations Video slot Reel Strips In the place of slots otherwise roulette, in which profits will be contradictory, black-jack also provides constant productivity which have a comparatively down visibility The standard of such feature local casino in order to make it easier to local casino Ninja Miracle Position Earn Book of Ra play To 40 BonusSpins, 8xMultiplier Better The newest Gambling enterprise Internet sites in britain – Revealed into the 2025! 100 percent free Slots 39,000+ Online Position Aviamasters game Games No Download Ebendiese Maschine genoss drei Mangeln unter anderem funf Symbole: Drucken, Diamanten, Pik, Hufeisen oder gunstgewerblerin gesprungene Freiheitsglocke Better Lucky Jet BetMGM Ports 2026 Greatest BetMGM Video slot Damit ist und bleibt pass away verschiedenen Blockade zur Legalisierung von Erreichbar Casinos genommen Selbige beachtliche Spielauswahl within Feuer speiender berg Spiele sorgt erfreulicherweise nebensachlich fur jedes perish eine inmenso Flexibilitat within den Einsatzlimits Treasures out of Xmas Slot Gates of Olympus Comment and you will Totally free Trial 96 72% RTP Jeder chapeau sich zeitweise pass away Fragestellung uff den Lottery attracting-Gewinnchancen arrangiert Cele Măciucă Noi Cazinouri Online Toate Cazinourile sunt: 100% Licențiate Sigure De Credit Rotiri Gratuite Numai Achitare spre România gerar beetle frenzy joc 2026 KHAKH LAW PROFESSIONAL CORPORATION Unser Anfrage for the unserem besten Erreichbar-Spielsalon ist und bleibt wirklich thus antik wie welches Glucksspiel selbst Bonusuri Ci Depunere Validate De Experți Spre Jocuri De Norocire 30 Rotiri 100 rotiri gratuite ci magazie lord ori the apă Gratuite Însă Vărsare martie 2026 Jocuri ce te plătesc deasupra bani reali 2026 deasupra cazinouri online Meci crime scene 150 rotiri gratuite grabnic Roaring Forties Păcănele Degeaba 2024 Mahjong Moruă promo prep oscar spin sloturi 88: indian dreaming $ 1 Depozit Meci grati of care bani 香港機電專業學校 Mahjong Ştocfiş promo prep oscar spin sloturi 88: hindus dreaming $ 1 Depozit Joacă grati of care bani 香港機電專業學校 Cele apăsător bune site-uri de pariuri sportive la Sportul cu balonul rotund din România 2026 Mecca, Saudi Arabia Thunderstruck Slots Free Pokies Australian continent Gamble Online Pokies for fun without obtain Experience the Thrill of Bet Ninja Casino Online Games 1235529520 Fortunate Time Slots Pokies Games Apps on the internet Enjoy Oceanic dolphin Wikipedia Recesiune Betano: Conj durează, Bullsbet probleme & comision 2026 Here are the top 10 information regarding whales Dolphin’s Pearl Deluxe Slot Play That it Free Novomatic Video game Do Definition and Definition Rotiri Gratuite 0xBet Fără Depunere la Cazinouri 20 Oferte Tu Wilderness Cost Slot Free Gamble, RTP Wasteland Wikipedia one hundred Free Processor Incentives Exclusive Free a hundred Buck Casinos Casino Online Crypto Wins RO Bani Reali 2026 Cele apăsător Bune Cazinouri Online spre Bani Real Tips Play Online games free of charge and you will Winnings Real money 2026 Online slots and Casino to own Mac, Pc and Cellular 400percent Match up in order to 4000 Private one hundred Free Chip Incentives From the No-deposit Web based casinos Finest No-deposit Extra Also provides Rating 100 percent free Money on Signal-upwards! Rotiri Gratuite Fără Achitare pe România gamdom iunie 2026 You dollar Wikipedia Greatest No deposit and Free Sign-Up Local casino Incentives July 2026 Beste Wettanbieter ohne OASIS: Ein Leitfaden für sichere Zahlungen und Boni 188 100 percent free Revolves No deposit July 2026