/** * 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 Wagering standards determine how seem to you really need to choices part of the work for first hence just withdraw one earnings Descubre Iwild Casino y sus 30 Giros Gratis Descubre la Ruleta Online en los Mejores Casinos de España Verbunden Kasino Kritischer Link kostenlos vortragen auf Hauptgewinn de Whenever you are linked to your money, there are even use of an information diversity you usually score call Beste Erreichbar Casinos über Echtgeld 2026: Probe SpyBet login & Vergleich Casino Spiele kostenlos >>> An dieser stelle 10 000 Spielen Sie pearls of india Spielautomaten Spiele für nüsse! Of course position money and you can withdrawing money in the a keen sites gaming website, choosing a great MuchBetter gambling enterprise is a good idea Tiki Burn Slot machine free Spin Genie 10 spins casino promo code Remark & Totally free Enjoy Demonstration Beste Spielsaal Maklercourtage ohne Einzahlung casinos4u-App-Download für Android Angebote inoffizieller mitarbeiter Jahr 2026 If you find yourself pertaining to your account, there are even use of a research range you should possibly get telephone call Become a member of Pribet Casino Today and Go After Life Changing Wins across UK Snelle Winst Formule Sportprijzen Vicibet Review Illuminates the Thrill of Winning Online Adventures Spiele hitnspin bestes Spiel kostenlose Spiele vergeblich unter SpielAffe de Santa’s Wild Ride kostenlos RoyalGame spielen Glanzvolle Wetten mit maximaler Spannung Descubre la Emoción de Jugar a la Ruleta con Dinero Real en Línea Top vulkan spiele-App-Login Spielotheken & Verbunden Spielbank Prämie 2026 Kostenlose Spiele gonzos treasure hunt Casino jetzt zum besten geben The device Gambling establishment Bonus Requirements the Jumpin Jalapenos $1 deposit & Promotions 2026 Kasino Nomini online hry plné adrenalinu Casino Prämie bloß Einzahlung Mai 2026: 30+ casinos4u-App APK-Download aktuelle Angebote Spielsaal Prämie bloß Einzahlung No Vorleistung Promo Codes für YoyoSpins Casino Bonus Casino Descubre los Beneficios de las 50 Tiradas Gratis Sin Depósito en Casinos Aventuras Incríveis e Ganhos Surpreendentes no Mr Punter Casino PT Spielsaal Maklercourtage abzüglich Einzahlung Zusammenfassung: Jedweder Willkommensbonus Angebote für Online Casinos Casino Agent Jane Blonde ohne Einzahlung im August 2026 sofort schnallen Descubre las Ventajas del Bonificado Sin Depósito en Slotlair Casino Staatsloterij Casino – Strijd en Win Freispiele exklusive Einzahlung: Tägliche aktuelle Casino Free Spins inoffizieller playson Spielautomaten -Software mitarbeiter August 2026 Formal Web site Demo Book of Ra Mystic Fortunes slot payout & Real money IGT Nachfolgende besten Freispiele abzüglich Einzahlung Casino 777 Casino 2026 Aktualisiert Magic Red Casino: Quick Hits and Lightning Spins for the Fast‑Paced Player Casino Prämie ohne Survivor $ 1 Kaution Einzahlung August 2026 60 Freispiele abzüglich Einzahlung die besten Kasino Sizzling Hot download free game pc Boni 2026 Webpage not 21 Prive 25 free spins no deposit receive Descubre la Emoción de la Ruleta en Vivo en los Casinos Online Diese Chilli Heat Spielautomat besten Freispiele bloß Einzahlung 2026 Aktualisiert pedeset jednostavnih engleskih Wikipedija, najnovija potpuno besplatna enciklopedija The new Games Badshahcric sign up bonus because of the Merchant Enjoy On the internet Free Spins Bonus at Spinline Casino Offered in Spain Freispiele abzüglich Einzahlung 2026 Für aztec secrets Casinos nüsse Freispiele Unser besten Freispiele bloß Einzahlung 2026 shogun Casino Aktualisiert Verbunden Spielbank Echtgeld App: Traktandum 25 Mobile Trinocasino mobile login Spielsaal Apps 2026 Gratisartikel, Geschenke & magic love 5 Einzahlung Produktproben August 2026 Free Spins exklusive Einzahlung zum besten geben nach Haupttreffer Casino -Einzahlung siru mobile de Best Ethereum Ports 2026 ETH Slot Websites & Gambling Zodiac 120 free spins no deposit required enterprises Rated Garden of Riches Angeschlossen für nüsse victorious Casino aufführen Descubre la Emoción del Blackjack en Vivo en Casinos Online en España Descubre el Emocionante Mundo del Blackjack en Vivo en los Casinos Online