/** * 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 Finest Free Harbors with Extra Zero Install Expected FaFaFa Position Gamble On the web 100percent free otherwise Real cash Free Play & Finest Analysis to own 2026 Finest Casino Free Revolves Bonus 2026: Claim 100 percent free Spins No-deposit Exploring Non UK Casinos A Guide to Gaming Beyond British Borders Play Totally free Pokies More than 3000 Online game Obtainable in 2026 Gamble 19,000+ Totally free Harbors The fresh Free Slots With no Install It is possible to withdraw when you have a great myPaysafe membership He vivido y comparado las excelentes casinos sobre listo en internet del pais Delight in greatest-level casino games, exciting offers, and you will satisfying incentives Los metodos sobre pago varian y incorporan fichas, transferencias bancarias asi� como monederos electronicos Penny Slots Online Enjoy Penny Slots Conocer bien esos requisitos os permitira escoger su mejor propuesta de ti Play 100 percent free Slots that have Bonus Series Sean algunos de los bonos de mas esgrimidas que deben las casinos Which Boku casino even offers a full alive casino which have games particularly black-jack, baccarat, and you may roulette Retar con el pasar del tiempo dinero real conlleva peligros financieros, cual ademas seran considerados Una coleccion de el casino en linea suele realiza un papel relevante acerca de esto Finest On the web Pokies in australia The real deal Money 2026 5 Best PayID Pokies Websites Davinci Expensive diamonds Position Remark 2026 Enjoy casinos4u ports promo requirements to your Free Demonstration Exploring Football Bookmakers Not on GamStop 1971497703 Ademas, nos da pie a seguir implementando novedosas las medidas oportunas de esparcimiento responsable referente a ganancia de todos los usuarios Exploring Non GamStop Sportsbooks Your Complete Guide Play Today! Discover UK Bingo Not on GamStop Unleash Your Gaming Adventure fifty 100 percent free Revolves No deposit No Choice Uk 2026 PlayStation World Exploring Non-UK Regulated Casinos A Comprehensive Guide 1971848656 Exploring Non-UK Online Casinos A Guide for Players Exploring Non GamStop Sportsbooks A Guide for Bettors 1979670218 Exploring Non-UK Regulated Casinos Opportunities and Risks Regal Reels 21 Gambling enterprise Australian continent Official Webpages Log in & $ten Free Incentive Bingo Sites Not Blocked Play Freely and Responsibly Exploring Non GamStop Horse Racing Betting Beyond Restrictions 1072338187 Discovering Offshore Casinos That Pay Out Internet casino With $5 Minimum Put $5 Put Local casino Funky Fresh fruit Position Play 100 percent free Playtech Online game On line No KYC Crypto Casinos The Future of Online Gambling 1984180828 Exploring Non GamStop Sportsbooks A Comprehensive Guide 1971056781 Exploring Betting Sites Not on GamStop 1061491578 Exploring Non-UK Online Casinos Your Guide to Global Gaming On the web Pokies Australia 2026: Better Real cash & 100 percent free Pokies Sites Exploring Betting Sites Beyond GamStop Your Guide to Responsible Gambling Free online Harbors: Enjoy Local casino Slots Enjoyment 2025s Best Online Pokies in australia: Top 10 Australian Pokies the real deal Currency Casino Sites Not on GamStop Your Guide to Alternatives Aggressive Gaming and Contest Play within the Flame Joker Position to have Canada Customized Published Packets Wholesale Custom Packaging Packages that have signal in the United kingdom Spinrise Gambling establishment No-deposit Bonus fifty 100 percent free Spins June 2026 Test P 100: Il Migliore Alleato per i Culturisti Exploring Underrated Horse Racing Sites Not on the Radar Exploring the World of Casinos A Global Perspective