/** * 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 Mr Cashman Pokie Play for Free & Understand Remark Aztec Treasures Slot: Totally free Spins, Demonstration & Resources Best 100 percent free Revolves No-deposit Casinos in britain 2026 Cashman Local casino Pokies Harbors Apps on google Gamble Better United kingdom Cellular Gambling establishment No deposit Extra Also offers inside the July 2026 Cashman Gambling establishment Slots Games Apps on the internet Enjoy Cashman Gambling establishment Pokies Ports Programs online Enjoy Cashman Gambling establishment 100 percent free Coins & Perks Publication Cashman Local casino 100 percent free Gold coins & Rewards Guide Cashman Local casino Pokies Ports Software online Gamble Mr Cashman Pokie Play for 100 percent free & Realize Remark Cashman Gambling enterprise Pokies Slots Software on the internet Gamble No-deposit 100 percent free Revolves to possess Jingle Twist by the NetEnt Mr Cashman Pokie Play for Totally free & Realize Remark Cashman Gambling enterprise Pokies Ports Applications online Gamble Cashman Gambling enterprise Pokies Slots Apps on google Enjoy Play for 100 percent free, Score 15 100 percent free Revolves Cashman Local casino Pokies Slots Applications on google Gamble Cashman Gambling establishment Pokies Harbors Software on the internet Play Cashman Local casino Pokies Ports Programs on google Enjoy Cashman Casino Slots Games Software on the internet Gamble Cashman Gambling establishment Pokies Ports Apps online Enjoy Cashman Gambling enterprise Pokies Ports Applications online Gamble Cashman Casino Pokies Ports Software online Gamble Mr Cashman Pokie Wager Free & Read Remark Better Casino No deposit Bonus Requirements 2026 100 percent free Sign-Upwards Also provides Mr Cashman Pokie Wager 100 percent free & Realize Opinion Mr Cashman Pokie Play for 100 percent free & Understand Opinion No deposit Bonus Codes Personal Totally free Offers within the 2026 Mr Cashman Pokie Play for Totally free & Comprehend Comment Cashman Casino Harbors Video game Software online Enjoy Mr Cashman Pokie Wager Free & Read Review Mr Cashman Pokie Wager 100 percent free & Realize Review Best No deposit Bonus Now offers and you will Free Spins inside the Southern area Africa 2026 Quick Allege, Greatest Websites Cashman Local casino Slots Games Programs on google Gamble Cashman Gambling establishment Ports Game Applications online Play Cashman Gambling enterprise Slots Video game Programs on the internet Enjoy 100 percent free Harbors No Install Zero Subscription: Totally free Slot machines Instant Enjoy Cashman Casino Ports Game Apps online Gamble Cashman Gambling enterprise Harbors Online game Apps on the internet Gamble Cashman Local casino Ports Games Applications online Gamble Greatest No-deposit Added bonus Also provides and you will Free Revolves inside Southern Africa 2026 Immediate Allege, Finest Sites Greatest British Mobile Gambling establishment No deposit Extra Also provides inside July 2026 Totally free Spins No-deposit Incentives Uk July 2026 100 percent free Revolves No-deposit Incentives British July 2026 No deposit Mobile Bonuses Us 2026 Free Spins & Incentive Cash Free Spins No deposit Incentives United kingdom July 2026 Totally free Spins No deposit Bonuses British July 2026 Free Spins Without Put & Zero Betting Criteria 2026 Thunderstruck II Comment 96 65% RTP, Free Revolves & Incentives