/** * 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 Utforska Utländska Casino Sidor Bästa Tips & Strategier Best Local casino Software Uk in the 2026 Better Cellular Casinos Rated TonyBet Free Wager and Invited Bonus Publication On-line casino Ratings Greatest Leading On-line casino Sites 2026 by Getb8 The Ultimate Overview to the very best Casino Invite Rewards Ascend to Fortune with the Casino God of Coins Unleashed Unleashing the Hidden Power of Coin Strike for Digital Treasure Hunters Casino sidor tillsamman rappa uttag och bums utbetalning【2025】 Unikatan pristup upravljanju ljudskim resursima u Rant Casinu Kompletný zoznam kasín na Slovensku a v zahraničí TonyBet: Legitimate Bookmaker and Gambling enterprise Online Explorations luxuriantes des avis sur les carrousels de casino Becasino login als toegangspoort tot onvergetelijke speelmomenten Scopri l’emozione del gioco al Stake US Casino e vinci alla grande4242 Kasína s minimálnym vkladom Čo by ste mali vedieť Greatest Gambling enterprise Programs for real Currency July 2026 Le tourbillon enchanté du carousel casino en ligne Casino med snabba uttag Casinopengen se L’ascension fulgurante de 777 sport vers une victoire éclatante Warm butterflies ‘hedge bets’ on the breeding while the high year reshape Amazon lifetime Fedezd fel a yep casino varázslatos játéklabirintusát Buffalo Casinos on the internet Best Casinos to experience inside the Buffalo Scopri il tesoro nascosto nel login di royalzino Snabbare Extra november 2026: 100% opp åt 500 kronor Unleash Fortune’s Charm at Royal Zino Casino’s Glamorous Oasis Éclats de Chance aux Tables Glamour de casino Daily Football Betting Tips Free and Paid off Football Tips L’ascension éclatante au royaume des richesses avec God of Coins Casino Bettingsidor tillsammans Rappa Uttag Spelbolag med Rappa uttag Apr 2026 Golf Development: PGA Concert tour Information, Interview, Have and more Évadez-vous dans l’univers éclatant du bonus carousel casino Casino Slots villig Näte Prova Spelautomater Online Deposit & Score Totally free Revolves Today Better Also offers Online La imponente llegada de godofcoins al universo de las criptomonedas La emoción del juego en la palma de tu mano con Betarino Casino App 2026 MotoGP Language Huge Prix How to view, lesson times and a lot more Hotel pre uge preslovakov – Pohodlné ubytovanie s kultúrnym zážitkom Finest On the web Real money Casinos Around australia 2026 Galadance Magické kombi tanca a kultúry Smarkets Gambling Exchange Kasína s minimálnym vkladom Zábava bez veľkých investícií Online casinos One to Take on Boku 2026 Instantaneous Play Online Gambling Establishment: The Ultimate Guide Play Free Slots Online No Download And Install: A Practical and Amazing Experience Utpröva Gräddan Roulette Online Casino Svenska språket Lek Navigando tra gusti audaci e avventure culinarie con Fatpirate Italia Kasína s minimálnym vkladom Vstúpte do sveta zábavy bez rizika Insättningsbonus: Ultimat Casino Insättningsbonus 2025 Betreed de wereld van kansspelen met Legionbet inloggen Kasína s minimálnym vkladom Hranie bez veľkého rizika