/** * 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 Jackpot Town Local casino Remark 2026 Bonuses, Online game, & Much more! Online Spielsaal Maklercourtage 2026 Beste Boni qua & bloß Einzahlung Gate777 Gambling establishment No-deposit Incentives fifty Free Spins Slots Herní podnik Courage gate777 kasino bonus bez vkladu – skutečný příjem Nejlepší online kasina o skutečné gate777 přihlášení přihlášení peníze v USA Nejlepší místní webové stránky kasin Doubledown Gambling establishment 100 percent free Potato chips and you will Coupons Freispiele ohne Einzahlung 2026: Beste Angebote inoffizieller mitarbeiter Syllabus Casino Without KYC Play Freely and Anonymously 100 100 percent free Spins No-deposit Bonuses a hundred Free Added bonus Revolves Bedste Betting Uden ROFUS – Find Dine Favoritter Nejlepší online kasina o skutečné peníze v roce 2026, kontrolována Promo kódy zdarma pro sloty oscar spin a posouzena odborníky Asena-Sage Wikipedia Bookmakers Not on GamStop Alternatives for UK Bettors Bookmakers Not on GamStop Explore Alternative Gambling Options Master Strategy Trial Gamble Free Ports at the Great com Jackpot Wonders – software pro hazardní Bonus goldbet hry, online hraní Buffalo Pokie : Enjoy Free online Slot Nejlepší hazardní podniky Skrill APK ke stažení partnerské aplikace goldbet 2026: Online kasina, ve kterých můžete obchodovat se Skrillem Eye of Horus: Kostenlos spielen & Bonus beschützen 100 posto besplatni slotovi i online kazino igre za dobitke pravog novca bez Puta Split Away Gold Trial by the Microgaming Games Opinion & Free Slot Book from Ra Deluxe Slot Free online Enjoy by Greentube Potpuno besplatni portovi Igrajte više od 3000+ slot igara online besplatno Hypertext transfer protocol 400 Error Bad Request Flüchtigkeitsfehler auftreiben ferner abhelfen MANIAC Filmovi: "FuLL" #Bolja HD"Film za ljude koje smo voljeli prije 2018. Lana Condor Gledaj 100 posto besplatni Revolves podsticaji bez depozita: Najbolje ponude kazina u SAD-u 2026. Publication from Ra Luxury Slot Free online Gamble because of the Greentube Kasino Zahlungsmethoden: Erreichbar & offline inoffizieller mitarbeiter Kollationieren Bolji mobilni portovi Igrajte potpuno besplatno na svom mobilnom telefonu 2026 Car morskih luka Igrajte online 100 posto besplatno brzo Book away from Dead Position Remark 96% RTP and you will 100 percent free Revolves Nula preuzimanja 2026. 100 posto besplatnih pedeset dolara Pokies Bez depozita Registracija Dodani bonus Australijski kontinent 2026 Nachfolgende besten Echtgeld-Casinos im Netz 2026 getestet Slot Mythic Chance: Mišljenje i RTP Potpuno besplatan evropski rulet online sa jednom nulom, boljom šansom Bonanza Demo slot mašina Igrajte online na mobilnim uređajima već danas Bookmakers Not on GamStop Exploring Your Options -7000515 Android OS Pozicija Online igra Lista najboljih Android OS mobilnih telefona 100 posto besplatnih aplikacija za slot mašine i igara koje možete igrati Triple Diamond slotovi, kazino slot igre za pravi novac i potpuno besplatno uživajte u demonstraciji Bedste Betting Uden ROFUS Din Guide til Ansvarlig Spil Bolji podsticaji u Velikoj Britaniji bez depozita £5, 10, 15 i još mnogo toga juli 2026. Blaze Of Ra Slot Totally free Gamble Internet casino Ports Zero Download 93 Novi uslovi za bonus bez depozita koje morate posjedovati Jul 2026. Ažurira se svaki dan Horse Racing Not on GamStop A Comprehensive Guide Great Revolves Android aplikacija: Ocjena sto besplatnih Revolvesa i pedeset funti 8 “Best” Bitcoin Online slots games websites August 2026 Neue Angeschlossen Casinos 2026 Beste Frischen Casinos im August Large Reddish-Aristocrat Casino slot games Totally free Enjoy Pokies Game Book Probna igra videoigre Fire Joker Position i potpuno besplatne vrtnje