/** * 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 Real cash Gambling enterprises 2026 Gamble A real income Gambling games On the internet Wagering conditions Exactly what are they & tips defeat them? Trendy Fruit Position: Game play, Added bonus, Rtp Fans Gambling enterprise Promo Code July 2026: Get step one,000 Added bonus Spins Kasína s minimálnym vkladom Ako si vybrať to najlepšie PlayStar Local casino Promo Code: Dime $one thousand Added bonus, five-hundred Spins 2026 Best Online Pokies for real Profit Australia 2026 11 PayPal Online game You to Spend A real income inside 2025 Casino games the real deal Currency Gonzos Trip Position Comment Wager Totally free In the Demonstration Form 888 Casino Review: Our very own Real cash Sample from Bonuses & Withdrawals Discover the Thrill of Agent Spins Casino Master Cooks totally free spins and casino guts you may a good a hundred% deposit added bonus around 2 hundred Yahoo Play Store Down load Android APK Free 52 0.21 Casinos on the android casino apps real money internet United states 2026 Checked & Rated Casinos on the internet Usa 2026 Examined & Ranked Better Local casino No deposit Added bonus relax gaming games Requirements 2026 Free Signal-Upwards Offers Accumulated snow Production in order to Northeast Kansas Week-end Observe Far Accumulated snow is coming Rec & Reel Statement High-society Casino slot games wager 100 percent free All the Alf Gambling enterprise No deposit Extra Codes The newest & Present Professionals July 2026 Totally free slot Crystal Forest Spins Summer 30 Publication out of Sirens is another Spinomenal slot games to test which have fifty totally free spins no deposit incentive. Larger Trout Bonanza is yet another preferred slot playing which have fifty totally free spins no deposit added bonus. Guide out of Deceased because of the Gamble’letter Wade is just one of the zero-install slots to experience with your fifty free spins no deposit bonus. The new 50 100 percent free spins no deposit added bonus might be stand alone otherwise registered to a different strategy. 50 free revolves added bonus try a gambling establishment promotion that allows your in order to twist the brand new reels away from a slot machine a specific amount of that time 100percent free. Vaizdo žaidimas YoyoSpins spēļu automātu promo kodi „Ports“ Agent Spinner Local casino No-deposit Bonuses 2026 https: observe?v=MOWDb2TBYDg Gamble 19,000+ 100 percent free Ports The Ladbrokes apps fresh Free Slots Without Down load Kasína s minimálnym vkladom Prehľad a výhody „Cellular Harbors“ demonstracinės versijos be man patika šis depozito Planšetinių kompiuterių prievadų tiešsaistes kazino bez depozīta RoyalGame internetinis žaidimas 2022 m. Expertise Wagering Requirements 2026 Gambling enterprise Incentive Laws Told me Gratorama Phoenix Sun Slot Opinion Gamble On the internet, Demonstration and 100 percent free Play Internetiniai lošimo automatai su RoyalGame bonuss „Paypal“ 888 Gambling enterprise Remark 2026 As to why It Trusted Webpages Would be Your own Finest Gambling Alternatives Trial Enjoy all NetEnt ports Totally free gamble, Slot Game, Roadmap & much more! Geriausi Immerion casino prisijungimo registracija uostų žaidimai No deposit Added bonus Casinos 2026 To NZ$a hundred Wins + FS Goldilocks and also the About three Holds Internetinis žaidimas Immerion casino prisijungimas mobi „Twist“ 200% Acceptance Added bonus ️ 2026 Get the best The newest 2 hundred% Bonuses twenty-six The newest ultimate super reels slot No deposit Added bonus Codes To have Jul 2026 Current Each day Medzinárodné kasína Dovolenka plná zábavy a napätia Pharaos Wide range Status Bet Totally free and Earn Exhilaration video game play slots and you may casino games the real deal اخبار التطبيقات والتقنية Goldi Homepage Nemokami internetiniai lošimo automatų Ybets registracijos premija žaidimai Better United states Web based essential link casinos 2026 Checked out, Rated & Examined Golden Goddess Slot Remark: Instances Out of Relaxed Spins, Intense Extra Cause, Honest Decision Medzinárodné kasína Svet hier a zábavy -1983099281 Gamble Pharaohs Chance Totally free Review of Pharaohs Fortune