/** * 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 Tips Play Online games free of charge and you will Winnings Real money 2026 Online slots and Casino to own Mac, Pc and Cellular 400percent Match up in order to 4000 Private one hundred Free Chip Incentives From the No-deposit Web based casinos Finest No-deposit Extra Also provides Rating 100 percent free Money on Signal-upwards! Rotiri Gratuite Fără Achitare pe România gamdom iunie 2026 You dollar Wikipedia Greatest No deposit and Free Sign-Up Local casino Incentives July 2026 Beste Wettanbieter ohne OASIS: Ein Leitfaden für sichere Zahlungen und Boni 188 100 percent free Revolves No deposit July 2026 Bonus Fara Plată si Rotiri Lady Casino online des-făcut fortune $ Casino gonzos quest 1 Sedimen Gratuite 香港機電專業學校 ten Deposit Gambling establishment: Our very own picks to find the best 10 lowest put web based casinos Discover and you will Contrast an informed ten Put Gambling enterprises in the U S. Finest Online casinos the real deal Currency 2026 Jocuri ce te plătesc pe bani reali 2026 B-Bets spre cazinouri online Put 5 Fool around with 80: Private Also provides Best 5 Deposit Casinos online: Best Lowest Minimum Casinos Finest Totally free Revolves No deposit Bonuses In the Web based casinos Inside the 2026 Cazinou Seven bonus fără depunere online Mummys Gold În 2000 ş aparate de slot Înregistrează-te și primești 500 USD Finest Real money Local casino Web sites Assessed Best Casino Programs in the usa 2026 Actual Mobile Casino Sites Put and Score Totally free Spins Today Finest Offers On the web Da Vinci Expensive diamonds Position Free Gamble Online No Download Dying Wikipedia Casino Lotto Park Online Sloturi ş Casinozer RO Top și Experiență Palpitantă Leonardo da Vinci Wikipedia Enjoy Free online Harbors Ultimate Centre at no cost Slots Zero Install Install and Create DaVinci Look after Windows, Mac, Linux 31 Free Revolves No deposit Gambling establishment Incentives 2026 Tu 38 Cazinouri Online Legale în România Brumărel, Bet24Star 2025 Happiest Xmas Forest Position from the Habanero Wager 100 percent free Enjoy Betsoft Appeal and Clovers On line Hollywoodbets Gambling Today’s 100 percent free Twist and Money Website links to possess Coin Master July Who was simply Cleopatra? The actual Facts Of your own Egyptian King Cleopatra Gambling enterprise Incentive Codes and Campaigns 2026 Cleopatra King, Egypt, Pharaoh Secrets of Xmas Casino slot games Play Online 100percent free Today Strings Post Casino slot games British 100 percent free Play in the Microgaming Casino Enjoy Charms and Clovers Free inside the Trial and study Review 10 Finest Real cash Online slots Web sites away from 2026 Cele mai bune cazinouri betpanda casino online între România Iunie 2026 Kasyno na Rzetelne Pieniążki Najistotniejsze Kasyna 2024 Darmowe spiny bez depozytu zbytnio rejestrację dla polskich fanów Enjoy Book out of Ra A $1 deposit kitty glitter real income Position Best Online casinos Australia Could possibly get 2026 roman legion $1 deposit Top ten Real cash Betting Websites Trendy Fresh fruit Slot Opinion: Enjoyable Cellular how to cancel bonus in goldbet Play inside 2026 Book of Dead automat do zabawy Sieciowy darmowo 50 Free Revolves No-deposit Needed for British Participants within the $1 deposit New Year Rising 2026 Najkorzystniejsze kasyno internetowego na terytorium polski Zestawienia 2024 Zestawienia maszyn pod oryginalne pieniądze w całej kasynach Lunubet sieciowy 2024 Ultra Hot Deluxe Slot lunubet Graj Obecnie darmowo