/** * 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 Sphinx Casino slot games Wager Totally free Quickly On line 10bet Casino 150 chance christmas reactors South Africa Viewpoint Indian Dreaming Position: Information, 100 percent free Revolves and more Greatest 5 Lowest Deposit Gambling enterprises for 2026 Fa Fa Fa Slot Review, Incentives & 100 percent free Enjoy 97 1% RTP $2 hundred No deposit Incentive 2 hundred Totally free Revolves Extra 2026 Deceased or Live Position Opinion Bonus, RTP 96 82percent and you may 100 percent free Demonstration Turkish governor having a losing desire crossword secret clues & solutions Have fun with the Raging Rhino Slot machine game On the internet free of charge Play Yahtzee On the internet at no cost Thunderstruck dos Position Review and you can 100 percent free Demonstration 96 65% YAHTZEE Position Totally free Demonstration Play Enjoy Cricket Superstar from the Microgaming for free to your Gambling enterprise Pearls Have fun with the Fantastic Goddess Slot machine game free of charge No Obtain 100% Sportsbook Signal-right up Incentives Over Listing Cricket Celebrity Slot machine Free Enjoy Online Cleopatra Slot Opinion 2026 Enjoy On the internet and Earn Large Setting you during the Heart Courtroom Gamble Wolverine Position Read the Remark, Wager Fun otherwise A real income Tomb Raider Slot Online game Demo Enjoy & 100 percent free pretty kitty $1 deposit Revolves Online Harbors Play 3,000+ Slot Game Zero Signal-Right up, Checked & Compared The Betmaster No deposit Extra Codes The new & Present People July 2026 Sphinx because of the Spielo Free Slot Gamble Demo No-deposit Extra Gambling enterprises 2025 Uk JYM Cushion-Foam brand, OEM and you may Wholesales Quickspin Pokies Internet casino Slot machines Play for Totally free Greatest Free Ports On the internet 2026 Slot Online game No Install necessary Trendy Fresh fruit Position Remark Detailed Consider Provides & Game play Chain Post slot from the Microgaming remark enjoy on line free of charge! Online slots Gamble Best Slot machines Are Trial & Real cash Harbors Greatest Charge Casinos inside the 2026 to have Instant Put & Cashout Buck Indication: Done Help guide to Currency Symbol Utilize and Programs Better Casino Slots for real Money 2026: Play Slot Video game On the internet Mayan Princess Position opinion Secret Features, RTP, Profits & Gameplay Guide Greatest Gambling establishment Apps 2026 Betting Software For real Money Wise Gambling Designs and Optimum Methods to own Immortal Love Slot inside United kingdom 29 Totally free Revolves No deposit Incentives For people Participants Inside the 2025 Just how long Will it Take To have A check To pay off? Enjoy 21,750+ Online Online casino games Zero Download Lucky Las vegas Slot Pro Wins Massive $eleven one million Jackpot Bucks Splash 5 Reel Slots Huge Dollars $$ Jackpots Await! Finest Gambling enterprises Recognizing Zimpler Costs July 2026 Best No deposit Ports 2026 Finest No deposit Harbors Now offers Online casino Analysis Best Respected On-line casino Sites 2026 by the Getb8 Bets io No deposit Bonus & Totally free Spins Coupons 2026 AOD9604 2mg Genérico: Un Ciclo de Preparados de Insulina Better step 1 Put Gambling enterprises Uk Rating Totally free Spins for just one Pound Demonstration Period Given: Experience Gonzos Quest Megaways Slot Free in australia The major five hundred Tunes of your eighties, Rated Dragon Shrine Position Opinion 2026 100 percent free Enjoy Demonstration