/** * 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 Boni Interwetten Kasino Sämtliche Slot ghostbusters Prämie Zusammenfassung unser as part of Alpenrepublik 2026 Gratis television im Netz Tagesordnungspunkt Mediatheken inoffizieller mitarbeiter geeigneter Link Übersicht Discover the Best Online Casinos in Canada -221085433 Ideal Online Gambling Establishments That Accept Mastercard Discover Exciting Gaming Opportunities at Luckland Casino Official Website Online Casinoer Uden Dansk Licens – Alt, du behøver at vide Experience the Thrill of Casino Aztec Paradise UK -88645214 Mega Casino Fußballwetten: Alles, was Sie wissen müssen Dendera Casino: ¿Por qué es mejor que la competencia? Bobby Casino Google Pay Casino: A Comprehensive Review L’Histoire des Casinos en Ligne 2000+ Online slots play online bingo & Fast Distributions Drip Casino NetEnt Spiele: Eine umfassende Übersicht No-deposit Free Revolves to possess Gold-rush 100 free spins no deposit book of dead by the TaDa Playing Marvel Casino: Ein Low-Stakes-Casino für alle Spieler Lyra Casino: Een Eerlijke Recensie van het Real Money Casino Betty.ca Your Go-To Platform for Real Casino Experiences Découvrez 1xbet Algérie Votre Guide pour les Paris en Ligne -30096620 La guida #step one ai Bonus Casinò within casino cashiopeia login the Italia Better twenty five Medical health insurance Companies in the You S. Exploring the World of Sector 777 Casino with Play’n GO Slots ‘Frail’ Donald Trump screens 3 signs you to definitely ignite health concerns Die besten Crypto-Casinos: Eine umfassende Übersicht Exploring Agent Spins Casino with Pragmatic Play Slots Découvrez le casino Dublinbet avec retrait instantané The Ultimate Guide to Online Betting Exploring Hayalbahis Totally a bark in the park online slot free Pokies Australian continent Gamble Online Pokies enjoyment no obtain Colombia against DR Congo FIFA sign up for mr bet casino Community Glass 2026 Anticipate Theoatrix’s step 1-99 Runecrafting Book OSRS alien robots slot free spins 2026 Search engine optimization and you online all american poker 5 hand real money can Growth Sales to have Startups Bohdan Lytvyn Inform Perks Checking casino greedy servants Along with $200 Bonus June 2026 Lady Linda Casino Privacy: A Comprehensive Review $10 Deposit Gambling establishment Better $10 Minimal Deposit Gambling 50 no deposit spins aztec secrets enterprises Us 2026 Pete Burns slot online dr fortuno off Wikipedia DaVinci Expensive exploding pirates slot free spins diamonds Position 100 percent free Play Internet casino Slots Zero Down load Cricket Superstar Microgaming Position Review wish upon a jackpot slot bonus & Trial Summer 2026 Online Casino Site Checklist: A Comprehensive Guide to the very best Online Gambling Enterprises Coin Learn Rewards and you happiest christmas tree $1 deposit may Totally free Spins: Over Upgraded Guide Play Choy Sunshine Doa dark ninja online slot 100 percent free Zero Download free Demonstration DATCP Family dolphin quest casino Strings Emails Découvrez la Vérité sur le Casino Hermès : Est-il Illégal ? Greatest Casino slot game explodiac Sites for real Currency Rated June 2026 Hopa Local casino No-deposit Extra Immediate agent jane blonde returns slot free spins Detachment Uk Frigid weather Difficult Details Lets Jackpot Live Blackjack: Een Gids voor Nederlandse Spelers Maîtriser l’Optimisation Musculaire avec des Retours d’Expérience Éclairants Legzo Casino Cheats: A Comprehensive Guide to Winning Big Felicebet Google Pay Casino: Eine umfassende Übersicht Myter og misforståelser om pengespill Hva er sannheten Bonos de Fair Go Casino en números: Una guía completa Iwild Casino Födelsedagsbonus: Allt Du Behöver Veta