/** * 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 Free Revolves at the Unibet Gambling enterprise 100 percent free Spins to possess Online slots games! Greatest $step 3 Lowest Put Casinos & Incentives 2026 Monacobetcz CZ 2026 – Registrace Vstupte do světa online sázení 1417610953 Tragamonedas 50 tiradas gratis en Keks Vegas Gods Casino Apps referente a Google Play Formal Webpages Trial and Real cash IGT Aussie Pokies Heart: Gamble Totally free Ports On line Zero Packages Gamdomcz CZ 2026 Budoucnost Online Hazardu 1397482578 $стъпка 1 Хазартни предприятия с най-нисък депозит юни 2026 г. Official Webpages Demo & A real income NetEnt Best On line Pokies the real deal Profit Australian continent to have 2026 Vs. konnte man, wie within weiteren Zahlungsmethoden, Freispiele abzuglich Einzahlung direktemang auf ein Registration umsonst beibehalten Cool Unlimluck promoción del casino Buck Slot Review: Todo lo que necesitas conocer Download DaVinci Look after 100 percent free to possess Screen, macOS, ios and Linux Better Position Sites in the uk: Greatest Online slots & Gambling enterprises to experience Ariana Position Remark and Bonus, Score fifty Free Revolves Брой 20: Пускане на пазара на 20 интересни информации за това, което е енигматична ръка Leonardo da Vinci Wikipedia Top 10 real money online pokies gambling enterprises in australia Organization Insider Africa Ganz daselbst gelisteten Versorger sie sind lizenziert ferner auf das amtlichen Whitelist ihr GGL Real money Pokies Applications to own Tablets in australia 2026 CryptoWild Local casino 2026 Log in & Score no-deposit incentive code Enjoy 19,610+ Online Ports Zero Obtain No Subscription Безплатни слот игри с безплатни въртения: Gamble Online без изтегляне Better 15 penny slots on the web inside the 2025 Danger High voltage slot review, Enjoy free trial Better No deposit Extra Pokies in australia 2026 Instant and On line Xbox Formal Site: Gamble Games Anyplace 6 Sins Tragamonedas Gratuito sobre Play’n fuente diablillo Go Dragon Power Position Review & Publication Play 19,350+ Totally free Position Online game Zero Download Máquinas Tragamonedas y no ha i24slot casino bono sin depósito transpirado Juegos sobre Casino Sin cargo Participar por Entretenimiento Christmas: Holiday Way of life and Presents Enjoy Free Harbors Australian continent: 30,897+ Pokies Zero Down load Finest On the web Pokies Australia 2025 Top ten Real cash Pokies to own Aussies Gamble Choy Sun Doa Free online Trial Video slot Trendy Fruits Madness Demo Position because of the Dragon Playing 100 percent free Enjoy & Review Esparcimiento Twin Gonzo’s Quest giros gratis sin depósito Spin slot Guía así­ como cualquier la información 2026 Вие парите от vulkan vegas казино BG Уикипедия Trendy Fresh fruit Ranch Slot Comment Complete Help guide to Provides, RTP & Gamble Stablecoin Structure to possess Payments, Notes & Purses Trendy Fruits Trial Enjoy Totally free Harbors at the High com Greatest Real cash United states Casinos 2026 Profits Confirmed Juegos Evoplay Demostración juegos de casino referente a casino FairSpin chile ICE Casino Gamble 23,700+ Totally free Casino games & Harbors No Download 50 Dragons Position Opinion 100 percent free Revolves Actions RTP петстотин напълно безплатни бонуса Revolves без депозит юни 2026 г.: По-добри vulkan vegas България бонус безплатни завъртания, предлагани и в онлайн казината сега Soluciona gratuito en Zombie Slot Deluxe 1xslot Casino en modo demo Gamble Free Harbors Video game for fun Zero Sign up Required 2026 Jackbit Gambling enterprise a hundred 100 percent free Spins No-deposit 2026: Code & Words