/** * 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 Best Minimum Put Online banana party slot casino casinos 2026 Australian Playing Legislation Said: Understanding Away from A golden fish tank online slot regulatory Expert fifty BMG cinema classics $1 deposit Wikipedia Microsoft Corporation MSFT inventory rates, casino free chip codes news, quotation and records Yahoo Financing Play 19,350+ 100 percent free coins wizard of oz 2026 free Position Video game Zero Obtain Cool Fruit Trial Gamble Totally free Ports in the Great $5 deposit casino piggy riches com Trendy Fresh cash cuisine play fruit Internet casino Slot Games Trendy Fresh fruit Position legend of the white snake lady slot no deposit bonus Comment 2026 Enjoy casino cricket star 19,350+ Totally free Slot Game No Install Online Harbors Zero slot happy halloween Obtain, Zero Subscription Play for Fun Cool Fresh fruit by the lucky keno online slot Playtech Demo Play Position Games a hundred% Free Cool lucky miners $1 deposit Fresh fruit Trendy Fruit Trial Enjoy 100 percent free Ports at the Great 20 casinos no deposit required uk com Trendy Good fresh fruit Ranch Position Test this Totally slot australian magic free Demo Type Monday mr bet casino bonus Nights Funkin’ Pictures california gold slot Publisher BeFunky: Online Images Editing and you can Collage Founder Cool Fruits Position Enjoy Free Playtech Game odds of winning lucky 8 line On line Listed here are a lot more finest casinos on the internet offered our very own criteria: cuatro Pin Up: лучшие игры и уникальные фишки для азартных игроков Cool Fruits Demonstration Gamble 8 lucky charms slot machine Free Slots from the Higher com Funky play online bonus deuces wild 50 hand Fresh fruit Trial because of the Playtech Totally free Slot & Opinion Trendy aztec secrets casino Fresh fruit Jackpot Position Remark and you will Greatest Gambling enterprises 2026 The way we Opinions The big British Gambling enterprise Other sites No-deposit Totally mrbet no deposit bonus codes free Revolves to possess Funky Fruit by Playtech Book of Ra luxury Online casino Wager Free Better Free Spin Extra No-deposit Also provides without-Put 100 percent jurassic jackpot slot rtp free Revolves On iWinFortune lite login the web Public Gambling enterprise Always Able to Gamble Of working our company is encouraged to put together you could the fresh the latest strategies be accompanied Diofin क्या है? आयुर्वेदिक हर्बल सप्लीमेंट के फायदे जानें Trendy Good fresh fruit lucky wizard play slot Position Comment: Enjoyable Cellular Gamble inside 2026 Instead of ports or roulette, in which payouts are inconsistent, black-jack also offers lingering development which have a fairly reduced exposure Gamble avalon slot casino 14k+ Totally free Harbors On line Zero Registration Zero Obtain Gamble 50 emperors garden online slot Dragons from the Aristocrat Totally free Demonstration Free Ports with Incentive and you may Totally free Spins No Obtain & gods of olympus slot free spins No Subscription Best break da bank again slot free spins Free Revolves Casinos 2026 No-deposit golden tour video slot Bonus Rules Usa Verified Now offers July 2026 three-dimensional Slots Free Online game To the play Sizzling Hot paypal real money Finest Jackpots Thunderstruck Position casino games free money no deposit Have fun with the Thunderstruck Demo 2026 Play castle builder ii mobile slot Today! Play slot online mayan princess Today! Unlocking the power of Diofin: Ayurvedic supplements for metabolic wellness Top ten Cellular Gambling enterprises for Uk People 50 Totally free Revolves No-deposit casino bars 7s Required for Uk Players inside 2026 fifty Dragons Casino slot games olympus thunder $1 deposit Remark: All you need to Discover Greatest Totally golden era slot free Spins Gambling enterprises July 2026 No-deposit Harbors Greatest $5 Deposit Gambling enterprises Canada July casino Lucky Win no deposit bonus 2026: Better Reduced Put Internet sites What Pages Constantly Prioritise into the a casino Listed below are more most readily useful casinos on the internet considering brand new conditions: 4 Best $5 Put Online casino Optibet Lv bonus codes 2024 casinos: Greatest Lower Minimum Casinos Finest $1 Minimal Put Gambling enterprises: Deposit step one$ Rating Mr Mobi 25 free spins no deposit required Free Spins