/** * 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 How to get started with online pokies at Fair Go Casino Australia: a beginner’s +10 000 Juegos sobre Casino Regalado En internet Slot Columbus Deluxe online Tragaperras Participar de balde en Victorious MAX de NetEnt Tragamonedas 100 Zombies sobre Endorphina ᐈ Revisión + Esparcimiento regalado Tragaperras X-Men Juego Online Chile 2026 Wild Shark Máquina Tragamonedas De balde sobre camino Soluciona de Divertirte Amatic Chicago Tratar sin cargo online esta tragamonedas Why PayID Pokies Australia is the top choice for online pokies in 2026: Fast, Máquinas Tragamonedas y no ha transpirado Juegos de Casino De balde Participar para Distracción Egypt Cash Entretenimiento Funciona online así­ como Obtén Bono sobre Casino Columbus Deluxe: demo regalado y sus particulares Chicago Slot Review Contempla las secretos Tragamonedas cincuenta Lions Aristocrat ᐈ Reseña sobre SlotCatalog ⭐ Zeus Slot Review 2026 Play Free Demo 400percent Local casino Bonuses for U S. Players eight hundredpercent Gambling establishment Incentives Michigan Best Online casinos and Gaming Sites 2026 Cleopatra II: nuestro secreto sobre Egipto joviales premios hasta cincuenta 000x 200 No deposit Totally free Spins In the Finest Casinos on the internet 2026 Offers Cosmic Jewels tragaperras en internet Unblocked and Totally free Enjoy Today! Iron man step 3 Wikipedia Tragamonedas Chicago Chicago ᐈ RTP, sus particulares y no ha transpirado en qué lugar juguetear Enjoy Starburst having 100 100 percent free spins No deposit expected! Gambler’s Publication Greatest 5 Deposit Casinos in the us 2026 Sus particulares 50 Lions Slots tragamonedas USD Icons: Copy, Paste, and Piano Book to the Dollars Indication Better Zimpler Casinos 2026 Gambling enterprise Sites One to Undertake Zimpler Dumps Organización desplazándolo hacia el pelo distribución de pescados mariscos desplazándolo hacia el pelo conservas Wolf Work at Eclipse Position Review Result in the newest Controls Bonus Genius Store Force Gaming Slot Review and Trial August 2026 Edsaconsulting » Drácula de Bram Embocadura blood suckers Stoker: nuestro personal foco de el vampiro one hundred 100 percent free Revolves No-deposit Bonuses 2026 Wazdan llega en JokerBet: Nuevas Slots desplazándolo hacia el pelo Utilidades Exclusivas United states of america No-deposit Totally free Spins Bonuses Better Local casino Now offers inside 2026 Expert Sports Picks and Predictions Reseña de la tragaperra Twin Spin Deluxe Función Twin Reel Free Ladies Which have Guns II Suspended Beginning casino slot games Tratar gratuito alrededor keno online en 2026 Vegas Expert one hundred Totally free No-deposit Spins 2026 Now offers Of Respected Gambling enterprises Totally free Revolves Gambling enterprise Incentives 2026: Casino Programs Which have 100 percent free Spins Wild Gambler Máquina Tragamonedas Gratuito en línea Tratar con el fin de divertirte PlayTech Online Ports with Extra Spins Free online Casino games Victorious Sus particulares ️ Hace el trabajo gratuito ️ No deposit Incentives During the Us Online casinos No deposit Bonus British 2026 Listing of Latest Totally free Bonuses No Deposit Bono de incluso 450 + cincuenta giros gratuito acerca de Casino Una Biografía Play Dual Earn Position for free Provides Split up Signs, and a lot more! Triple Diamond Position Online 100 percent free Play No Subscription