/** * 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 Viking Age Slot Betsoft 2025 Assurance agrégatif l’extérieur du pays Chapka Préconisations Casino inte med svensk Full Moon Fortunes spelautomat för pengar koncession 2026 Testa inte med spelpaus Mega Moolah Position Remark + Free Trial Casino inte med Gems of the Gods spelautomat Konto Victorious Slot Tragaperras En internet Victorious The industry of casino enjoyment in australia has never been way more pleasing Grand Twist Local casino � Better Signal-Upwards Most Secrets of Aztec -kolikkopeli Remark PG Soft: RTP ja saat täysin ilmaisen Revolves-pelin Download Mega totally free for Windows, macOS, Android, APK, ios, Linux and Web Application Prova casino inte Extra Cash spelautomat me inregistrering Casino med BankID 2026, Samtliga South Park $1 insättning Svenska språke Sandrev Id Casinon Score 10B Totally free Coins Super Joker Svenska språke casinon 2026, Samtliga casinon the Three Musketeers 150 free spins recensioner tillsamman svensk perso licens In lieu of harbors otherwise roulette, where profits would be inconsistent, black-jack has the benefit of constant returns having a somewhat reasonable visibility Greatest Real money Online slots to experience inside 2026 Fördelar och nackdelar med spela Rapunzel’s Tower online att utpröva kungen internationella casinon Humberside Alumni Tankebana Happy Zodiac Real-Time Statistics, RTP & SRP Victorious Slot: Tragamonedas del Imperio Romano Épico Discover Your Deposits: A great Witchs Help guide to Enchanting Nutrients Ultimat Nätcasino 2026 Mäta svenska kasino Sunset Beach casinosidor på webben! Miracle supernatural Wikipedia Best $step 1 deposit casinos on the You S.A great. for 2026 Casino Valley of the Gods online slot med BankID 2025 De bästa inom Sverige Happy Zodiac Harbors Wager 100 percent free on your own Internet browser Reseña de la tragaperras Victorious MAX sobre alta volatilidad Gemini Per week Horoscope to have July 05, 2026 Like, Community, Currency & More Casino Online Folkeautomaten casino free spins ingen insättning Sverige2026 Väga 100+ Svenska språket Casinon Partner2Connect There are a number of specialist the newest local casino websites your to discover right up in the uk so you’re able to a very appealing market Jackpot Industry-Free Harbors & Vegas Casino games Online Welcome Incentive Suuri Bad Wolf Ports -arvostelu ja saat täysin ilmaiskierroksia vuonna 2026, Hityah com Fortunate Larry’s Lobstermania dos Position Get involved in it 100percent free On the web Tragamonedas Viva Entretenimiento Apps en Google Play Greatest United states No-deposit Incentive Rules : 2026 You No Deposits Forgotten Slot Gamble Demonstration or Get Incentive To $9500 Destroyed Slot Opinion 2026 Free Enjoy Trial Free Spins 2026 Betrakta Allihopa casino tillsammans casino online se free spins i dag! Play Las Vegas Casino Slots Apps en Google Play Look for Forgotten Bank account Why Performed My personal Casino Incentive Fall off? 7 Preferred Reasons & Recovery Guide 2026 Casino inte me konto plats Safari Madness & inregistrering casinon tillsammans bankidentifikation Participar Blackjack Vip De balde Sin Asignación Parhaat nettikolikkopelien kannustimet vuoden 2026 parhaiden porttien kampanjoissa Who’s the father From the Bible? Lord Wikipedia Försöka inte med lotto online Spelpaus här Stinkin Steeped Slots, Real cash Video slot & 100 percent free Play Trial Juegos De Tragamonedas Así­ como Slots En internet Betway España