/** * 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 Ramses Book Slot Gamble On the web 7Euro-Prämie exklusive Einzahlung im Casino: Das nüchterne Ausblick auf das Werbemärchen Better A real income Online slots games Web sites and Game inside the Canada 2026 Verbunden Spielautomaten & Live Kasino 12 000+ kostenlose Angeschlossen Slots & Spielautomaten Free Higher Bluish Position Review 2026 Free, Real money Enjoy! Novoline gebührenfrei vortragen exklusive Registrierung ferner Eintragung Dragon Moving Position 100 Freispiele abzüglich Einzahlung je Book of Dead Poważne Kasyno w polsce 2026 Librabet Casino Wszystkie bonusowe siły, których chcesz w polsce Obóz Lewandowskiego reaguje na skandaliczną promocję “Podjęliśmy kroki” Shell out by the mobile casinos Uk: And that web based casinos enable you to pay from the phone in 2026? Bing News British Leszno LEON Kasyno online w polsce: Bonus do 12 000 złotych + Darmowe spiny Oficjalna Serwis Kasyno Online 2026 Jetzt mobilen Provision sichern! Najlepsze Kasyna Na Prawdziwe Pieniądze W polsce 2026 Lemon Kasyno ️ Lemon Casino Kod Promocyjny 2026 Bonus Bez Depozytu: Top Kasyna z Darmowymi Nagrodami Top Web based casinos For real Profit July 2026 Polskie Online Casino 2025 Book of Dead Freispiele ️ Aktuelle Liste 2026 Nie tylko bankiety i brydż Wojskowe kasyna oficerskie Ich opcje i znaczenie Muzeum Historyczne w Legionowie Recenzja Legiano: Czy Legiano jest legalne w 2026 r ? Ideali Imprese di Gioco che Accettano Depositi Neteller Legiano ️ Oficjalna Serwis Casino Legiano w polsce Freispiele ohne Einzahlung: Beste Ernährer & Boni 2026 Crappy Bass step three Reels Slot Gamble Free Trial Indigo Secret Jackbit Local casino No-deposit Bonus and Free Spins Discounts 2026 Wunderino Provision Quelltext 2026: Aktueller Promo Quelltext getestet Queen Of your own Nile dos Genuine-Date Statistics, RTP and SRP 20 Freispiele bloß Einzahlung Aktuelle Liste Juli 2026 BingBong Angeschlossen Spielothek 400 Freispiele für jedes 1 fifty Totally free Spins No deposit Incentives Claim Affirmed Offers 2026 60 Freispiele ohne Einzahlung diese besten Spielbank Boni 2026 Trendy Fruit Madness Slot From the United states amicable Dragon Betting, Comment, Trial Online game Online Καζίνο Εξωτερικού Ο Απόλυτος Οδηγός για Παίκτες -1720498760 Aktuelle Willkommensboni pro Erreichbar Casinos im July 2026 Play with good, novel passwords and invite two-basis verification in which offered Wypłacalne Kasyna Wideo 2026 Natychmiastowe Wypłaty Complete the processes and be certain that your own debit card instead of to make any deals to activate the offer 14 Better Pokies Bonus No-deposit Australia: The Greatest Picks Kasyna online z najszybszymi wypłatami w polsce 2026 GambleAware is a news and you can service system to have gambling addiction Spielbank Prämie 2026: Beste Angebote bloß Einzahlung Kasyna z szybkimi wypłatami 2026 It’s not hard to get caught up, but it is wise to function as one out of charge Best No deposit Extra Offers and Offers, Play for Totally free Zum besten geben Die leser angeschlossen unter einsatz von echten Dealern gebührenfrei