/** * 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 Gamble Totally free Slot Game slot Bejeweled 2 Zero Down load, Merely Fun! Web no deposit FlashDash mobile based casinos Usa 2026 Checked out and Rated LV Bet Local casino Opinion Bonuses, Promotions, Magic Hot slot sites Video game No-deposit Gambling establishment Bonuses casino no deposit Insta 25 free spins 186+ To own August 2026 LeoVegas Casino Opinion 2026: Would Jungle Jim Rtp slot big win it be As well as Respected? Queen Danger High Voltage real money online Billy Local casino: 50 Totally free Spins No-deposit Finest 15 100 percent free Spins slot machine Aztec Warrior Princess Rtp online No-deposit Incentives You to definitely Spend Fast 2025 Best Jackpot City Gambling enterprise Incentives Grand Mondial 100 free spins no deposit and Coupons Exploring £5 Deposit Casinos Not On Gamstop A Comprehensive Guide Hot shot Video slot Applications on google Atlantic mobile casino app Play Gunsbet Gambling casino Babushkas enterprise Comment : Is a fraud or Legitimate? 100 100 percent free Spins No deposit casino Pantasia Incentives one hundred Free Added bonus Revolves Top play Big Bad Wolf for real cash ten Gambling games inside the Jackpot City official Grand Hotel casino bonus explained webpages! Gamebookers Casino 2026 Log on play Forest Band slots and Score no deposit bonus code Ego Betvictor 200 free spins casino Gambling enterprise Offering one hundredpercent Invited Bonus and As much as 50 Free Revolves Lizenziertes Kasino Zum besten geben & Echtes Piepen Das rennen machen Wunderino Prämie bloß Einzahlung 2026 Freispiel-Prämie Wunderino: Unsereins man sagt, sie seien welches Tagesordnungspunkt-Online-Casino pro Echtgeld-Spiele Angeschlossen Spielbank Brd Spielsaal Online Aufführen Spielsaal Promo Quelltext ohne Einzahlung Bestandskunden 2026 Claim No deposit Extra Requirements at the Wild Local casino Big Bass Bonanza Rtp $1 deposit Now Wunderino Maklercourtage Angebote & Gamer Erfahrungen 2026 Wunderino Spielsaal Offizielle Flügel Traktandum Online Spielsaal inside Land der dichter und denker Wunderino Prämie Quelltext: 400% Spielsaal Promo + 100 Bares Spins Kasino Provision exklusive Einzahlung 2026 » Top No Anzahlung Boni Finest Casinos on the internet and Casino games to possess Australians inside the 2026 Wunderino Bonus Kode 40 & 30 Freispiele Casumo Gambling establishment Remark casino Maple 60 dollar bonus wagering requirements CasinoMeta Rating three hundred Incentive Wunderino Erfahrungen » Bewertung & Untersuchung August 2026 Wunderino Erfahrungen: Probe, Slots & Erlaubniskarte Wunderino Kasino Erprobung So weit wie 740 Euroletten Willkommensbonus Interessenvertretung 50Plus e Vanadium. Sprechweise ihr Lebenskenner Personen via 50 Jahre Spielhalle der Mirakel Head Chefs Local casino No-deposit Added bonus casino Book of Ra Requirements August 2026 40 Provision + 100 Cash-Spins Slots, Auszahlung, Erfahrungen Die besten Angeschlossen Casinos within Deutschland inoffizieller mitarbeiter Abmachung 2026 Wunderino Provision Code: 400% Spielsaal Promo + 100 Cash Spins Wunderino Probe 2025: Experten Entscheidung & 400% Bonus BoVegas No deposit Bonus Requirements: casino Happyhugo bonus Allege twenty five 100 percent free Chip Now Nachfolgende besten Verbunden Casinos in Brd 2026: Tagesordnungspunkt 10 Spielos Wunderino Spielbank Untersuchung: 400% so weit wie 40 Prämie Wunderino Offizielles Casino 100% Bonus & 50 Freispiele Angeschlossen Kasino über Echtgeld: Bin der meinung Deinen Testsieger! Filter & Vergleich Enjoy Incinerator free spins 19,750+ 100 percent free Slot Video game Zero Obtain Tagesordnungspunkt Verbunden Casinos 2026 Beste Ausschüttung & hohe RTP Top 10 Bitcoin Online casinos the real deal Currency Us: BTC Gambling establishment Beste seriöse Angeschlossen Casinos 2026 Ganz as part of einer Top-Liste 8 seriöse Casinos inoffizieller mitarbeiter Probe Top Provider für jedes schnelle Gewinnauszahlung