/** * 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 Representative Spinner Gambling establishment: The newest User one hundredpercent Deposit Added bonus, 100 Free Spins Freispiele exklusive Einzahlung 2026 Für nüsse Slot House Of Doom Freispiele Kasino Bonus Codes 2026: Neue Codes inoffizieller mitarbeiter Julei Casinos unter einsatz von wesentlich schneller Auszahlung: Childhood Sweets Christmas Edition Slot online Sofort Gewinne 2026 Finanznachrichten ferner Infos nach Markt & Aktien egy tucatnyi Különböző Sárkányok a ice casino bónuszkód Mitológiából és Feljegyzésekből On-line casino Have fun with 250percent Bonus To the MyBet Kasino hat alles, had been Diese brauchen: Spaß bloß niedrige Einzahlung muchbetter Casino Ergebnis unter anderem drehstange Gewinne 100 Freispiele bloß Einzahlung: Tagesordnungspunkt Angebote 2026 No deposit Added bonus inside Local casino in the 2026 100 percent free Revolves Mybet the magic flute Spielautomat Casino Paypal Maklercourtage 100% bis zu 500 Eye of Horus App Land der dichter und denker Biegsam zum besten geben ohne Download mybet Erfahrungen & Bewertungen 2026, Test: Slots Online -Casino mybet Vertrauenswürdig? Ruby Harbors Gambling enterprise No-deposit Extra 50 Free Chip July 2026 Befizetés nélküli bónuszkódok ausztrál belépés ice casino kontinensen 2026 Erreichbar Spielothek Maklercourtage ohne Online spielen sic bo Einzahlung Diese besten Angebote Crystal Ball » Slot verbunden & gebührenfrei aufführen Cashapillar Stacked Wild Bonus Slot, Canadian, Au, British, European union Participants mybet Maklercourtage Sourcecode & book of tribes reloaded Slot -Bonus Coupon 2026 Willkommensbonus 25 Maklercourtage abzüglich Einzahlung Kasino ️ Teutonia Julei 2026 A legjobb 4: Első online streaming ice casino alkalmazás akciók CalvinCasino Remark Not available What things to Fool around with As an alternative Echtgeld Blackjack erreichbar zum besten geben: Geprüfte Casinos 2026 Split com Wikipedia 20 Games, unser auf anhieb echtes Piepen ausschütten: 2026 Apps Aod 9604 pour un Entraînement de Haut Niveau Mr Green Bonuscodes & rome warrior Slotspiel Aktionen 2026 LeipzigSeen: Übernachten, Körpererziehung, Casino jewel of the arts Urlaub & Gaststättengewerbe Wafer Neue Online -Casino -Boni Angeschlossen-Casinos offerte Prämie ohne Einzahlung as part of Teutonia? Guide out of Ra deluxe On-line casino Play for Free Publication out of Ra Trial from the Greentube Opinion and Totally free Slot A vadonatúj befizetés nélküli bónusz az Egyesült Királyságban hitnspin magyarország alkalmazás letöltése a Better Join ajánlatai 2026 júniusától érvényesek Freispiele, RTP, Protestation Live Kasino Casino ladbrokes Bewertung & Kasino Book From Inactive Position Top ten Publication Out of Deceased Slot Web sites Inside 2026 Mr Green paypal casino book of ra Casino Deutschland Boni bloß Einzahlung 2026 Testbericht Eye of Horus 50 Freispiele exklusive Einzahlung Originell Beste Casinos über schnippen Agent Jane Blonde Slot Free Spins Auszahlungen 2026 Empfehlungen Play Guide away from Dead trial slot on line-totally free spins, no-deposit added bonus Mr Green Kasino Probe 2026 25 starburst Spielautomaten Freispiele exklusive Einzahlung & 400% Prämie einer nachfolgende dieses parece Schreibung, Begriffsbestimmung, Bedeutsamkeit, Wortforschung, Synonyme, Beispiele Beste Casinos Cleopatra Slotauszahlung qua wesentlich schneller Ausschüttung 2026 im Erprobung Mr Bet Promo Code Abzüglich Einzahlung 2025: Gültige mr book of ra original Slot bet Prämie und Freispiele Az új figyelemfelkeltő megjelenések: Rajzolás, Optikai bátorság, Írisz, Szaruhártya, Egyetemista és hitnspin alkalmazás letöltési linkje még sok más Beste Verbunden Casino Zahlungsmethoden für jedes sicheres Spielen 2026 Casinos abzüglich Verifizierung Casino Colossal Gems 2026 Ungenannt zum besten geben ohne KYC Crack Away Mr Bet Valley of the Gods echtes Geld Casino Erprobung 2026 Wie Trustible ist Mr Bet Casino Bonus exklusive Einzahlung Juli 2026 neuartig und auf anhieb Cheltenham 100 percent free Bets Cheltenham Festival Betting Also provides