/** * 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 Finding Your Groove with PayID Pokies’s Seamless Spins Test Post Created Enjoy 21,750+ Online Online casino games No Obtain Free spins kloosterzuster deposito 2026 Gratis spins behalve betaling appreciren Superspins nl Finest Totally free Spins Gambling establishment Bonuses in the us 2026 Bästa onlinecasino i Sverige, Incentive upp till 5 100 kr Availability Exclusive Local casino: Log in for Instantaneous Enjoy and you can Bonuses Pride Labels one submit 10 Best Real money Online casinos to own Usa People in the 2026 DrückGlück Comment 2026 Permit, Security and Incentive Information An informed 5 No-deposit Casinos 2026 Greatest 5 Deposit Casinos online: Finest Lower Minimal Casinos Finest 5 Deposit Gambling enterprises British Rating two hundred-500percent Incentives inside the 2026 Casinos on the internet A real income 10 Best Usa Casino Web sites to have 2026 Better Online casinos for real Money 2026 Better 5 Deposit Gambling establishment United kingdom 5 Deposit Gambling enterprise Internet sites 2026 Greatest Minimum Put Casinos United kingdom 2026 1-20 Deposit Web sites step three Minimum Deposit Gambling establishment United kingdom Better 3-Lb Gambling enterprises to have 2026 Making On-line casino Distributions and now have Paid off Each and every time How long Does Casiqo Casino Sample Withdraw? Uk Guide to Minutes, Waits and Issues Could possibly get 2026 Gratis offlin acteren! Casiqo Local casino Remark and Overview: Bonuses and you will Payouts Uitgelezene Gokhuis Buitenshuis Landsgrens 2026 Speel Scooore bij No Limit Casinos No deposit Incentive Remain What you Earn Best Us Casinos on the internet having a hundred No-deposit Bonus https: observe?v=ccMd2vfy42Q Kloosterlinge Deposit Spinybet NL Bonus Casino Nederland: JACKS NL No deposit Casinos 2026 60 No deposit from the A real income Gambling enterprises 114 No-deposit Extra Codes July 2026 24Casino No-deposit Incentive Codes 2026: The 24casino com Free Spins and Real money Incentives Best Internet casino Incentives and you can Discount coupons for top level Casino Apps 5 Deposit Local casino Added bonus Better Lowest Dollar Offers to possess 2026 Blackjack Tips and Profitable Strategies Master the online game inside the 2026 Leading Gambling enterprise Betting Publication to have 29+ Ages Betway Casino Promo Code: To step one,000 inside Bonuses Certified Webpages Uk Betsafe Gambling establishment Live Game and you may Sportsbook under one roof Experimented with and Tested Finest A real income Casinos on the internet July 2026 Best three dimensional Ports Online casinos 2026 Free and you will Real cash No Obtain Harbors Online 2026 100 percent free and A real income No Install Slots 100 Free Spins Kloosterlinge Deposit Bonusoverzicht & conditie Juni Winaday NL 2026 BetNSpin Casino Opinion Ojective Reviews because of the Users Betchain Casino Opinion bitcoin casino, mobile-amicable Most recent Promotions and Acceptance Incentive 10 Best Online casinos Real cash United states of america Jul 2026 Bonus Codes: See Casino Also offers and you will Gaming Offers Bao Gambling establishment Remark: three hundred inside the Bonuses and you may 100 Free Spins Better Online casinos for real Currency 2026 Better Societal Local casino 100percent free Slots and Games On the internet Offlin Bank Werkelijk Gamble Zen Geld Uitgelezene Nederlands Online Casino’s Best Online casinos for real Currency 2026