/** * 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 Online Casinos That Approve PayPal Mastercard Casino Sites: A Convenient and Safe Repayment Option for Online Gambling Every little thing You Required to Learn About Free Spins Cool Good fresh fruit Slot Remark Detailed Consider Provides and Game play Trendy Fruit Madness Slot Play On line for real Currency Free online Pokies: 60+ Pokie Servers Games to play! Gamble Pounds Santa Totally free No Download free Demonstration Clover Attraction: Strike the Extra Position Review 2026 Free Enjoy Demo ten Finest Online casinos for real Currency United states inside the 2026 50 Dragons Position On the web Play Slot Machin 100percent free Gambling establishment Pharao’s Riches Totally free Demonstration Slot Enjoy On line At no cost Unlock fifty No-deposit Extra Rules in the DaVinci’s Silver Local casino Today Gamble Penny Slot machines Totally free 125 Totally free Revolves Extra Cent Ports Finest Video game Inside the 2025, Upsides and Winnings 50 matter Wikipedia Paysafecard Gambling enterprises Tips Put and you may Withdraw DrBet Gambling establishment Review 2026 Game, Bonuses and Financial Regal Panda A great 2026 Investigation-Motivated Opinion Finest Casino No deposit Extra Codes 2026 100 percent free Sign-Up Now offers Enjoy Free online games on the Kizi com Every day life is Enjoyable! Tranquility ports remark Microgaming online and mobile pokies Dragon Money: Мифический дракон и реальные выигрыши в онлайн-казино Better Online Pokies Australian continent 2026 Real money Pokie Video game On the internet Pokies Australian continent 2026: Greatest Real money and 100 percent free Pokies Sites No-deposit Incentive Requirements United states Affirmed Now offers July 2026 Better Online Pokies No-deposit Bonus in australia 2025 Real money Pokies Australia Play Online Pokies for real Money in 2026 Starburst Totally free Spins No-deposit Extra Score 50 Free Spins! Enjoy Free Pokie Games and Slots On the internet Better Good fresh fruit Ports 2026 Free Demos and Finest Real money Casinos Better casinos on the internet the real deal money: Selecting the major internet casino to possess 2026 Best Gambling enterprise No-deposit Added bonus Rules 2026 Totally free Signal-Up Now offers Area of the part ‘s the £20, that will been while the incentive money or spins, as well as the bonus would be readily available for the new or present players. If the promo concerns added bonus finance, perhaps not spins, you’ll likely have a limit to your level of weight you is also wager for each twist. Of several £20 totally free no deposit gambling enterprise United kingdom incentives features listings away from omitted game, i.e. ports you could potentially’t enjoy if you’d like to clear the newest betting standards. Additionally, whether or not these types of promotions ban certain game, i check that the new listings aren’t much time. For the full extra analysis in addition to put suits now offers, see the gambling enterprise incentives centre. Better Real cash Web based casinos in america July 2026 Better Boku Casinos July 2026 Gambling enterprises You to definitely Undertake Boku Better Casinos on the internet for real Money Usa 2026 Expert Reviews Mobile Live Casino Η Νέα Εποχή του Διαδικτυακού Τζόγου -938587494 Драгон Мани: магия азиатских слотов и большие выигрыши The brand House of Fun online real money new Huge Excursion Ports Play for Online Today Discovering innovative games at online casinos: what’s new and trending in 2026 Est ce que Ringospin Casino vaut le detour pour les joueurs francais Ringospin Casino im Praxistest mit detaillierter Berechnung der Bonusbedingungen The Ultimate Guide to Online Casino BOF UK Gioca nei Migliori Online Casinò Non AAMS: la tua guida ai prelievi veloci e Starburst Slot Demo casino Chinese Zodiac Play for 100 percent free and Winnings Both Indicates King of your own Nile Totally free Ports: Enjoy Pokie Online game because casino william hill no deposit of the Aristocrat On the web Gamble davinci diamonds slot machine strategy 21,750+ Online Online casino games No Install Legzo Tizona Bonusspiel Kasino