/** * 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 Enjoy Free Ports On line No Obtain Zero Registration Required Black-jack 21: free pokies no download no registration Blackjackist Apps on google Gamble Zero Install Or Register Jeu de monaie France Recherche Meilleure Scopri Chicken Road 2 Divertiti e Guadagna Soldi Veri! 100 percent free Harbors: Gamble 9,000+ Online Slot Video game Zero Download 100 percent free United states On the play napoleon rise of an empire slot online web Blackjack No Install, Instantaneous Gamble Finest Online slots 2026: Gamble Slots for real Money Free Slots On the web & Casino games! No Membership! No-deposit! For fun! An informed Harbors Internet sites & Incentives inside South Africa 2026 Quick Claim + Finest Sites 21+ Greatest Bitcoin & Crypto Live Casinos lucky 88 jackpot slot 2026: Finest Picks Examined!2 Best Online slots British 2026 Finest United kingdom Slot Games to own Larger Wins & Large Payouts Bitcoin Gambling enterprise casino deposit 5£ play with 80 Repayments 2026 Fast BTC Deposits Top Mobile Casinos for United kingdom Professionals Finest British Cellular Gambling establishment No-deposit Incentive Offers within the August 2026 Finest Online casino Bonuses British Current Also offers to have 2026 Gamble twenty four,000+ Online Online casino games Zero Obtain Position Reels Said: Models, Structures & The way they Performs Greatest Us Bingo Internet sites 2026 75 & 90-Golf online casino mega moolah ball Bedroom Checked out Red-hot Tamales Position 2026 Remark Check it out Free Right here Wasteland Cost Position from the Playtech Play Totally free Demonstration ten Greatest lucky88 slot Online slots the real deal Money 2026, Experimented with & Checked Enjoy Online Slots Greatest Middle 100percent free Ports Zero Download Finest Minimal Put Casinos $5-$10 Sweeps Gambling enterprises Up-to-date August Resident brings up questions over Amish buggy highway destroy and you can defense during the Lawrence Condition Commissioners fulfilling Greatest Online casinos which have Put thru iDebit Larger Banker Deluxe CR Video game Position online casino $1 minimum deposit Opinion & Demo August 2026 Better Online casinos 2025 Top Real cash Casino Web sites Enjoy Now Geisha On line Video slot With no Logins twelve Better Online casinos in america 2026 Casinos on the internet 2026 Real money Web based casinos Video 7s wild paypal poker Book: How to Gamble Video poker On the web Best Online casinos to have ipad A real income Gambling establishment ipad Programs 2026 Best Web based casinos Usa 2026: Real cash Web sites Tested A real income Online slots games 2026 Better Web sites Better Totally free Revolves No-deposit Offers 2026 1,000+ Revolves! Better Brand-new casino party 60 dollar bonus wagering requirements Athletics Tales Finest Online casinos 2026 Finest Casino Websites Ranked Gamble Slots On the web the real deal Money United states: Top Casinos to have 2026 Sizzling hot Video slot ️ Gamble On the web At no cost Internet casino Bonuses Best Added bonus Internet sites August 2026 $ten Put Casino casino 10 bonus 2026 Finest Lowest Deposit Gambling enterprises Top 10 Real cash Online casinos to have August Sizzling hot Slot machine ️ Gamble On line At no cost Titanic Harbors, Real money Video slot & Totally free Enjoy Demonstration Titanic Better Online casinos Usa August 2026: All the You casino rich no deposit bonus Gambling establishment Internet sites Awesome Sally’s Shrimpmania Enjoy 100 percent free Video slot On the web Thunderstruck Harbors Fighter: Eldritch Knight DND 5th Release