/** * 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 Unlocking the Potential of Prestige Spin Ethereum Deposits Sprawdzam Crazy Tower Casino Czy to miejsce dla poczatkujacych How Online Casinos Make Money: A Comprehensive Guide Riesgos de Comprar Esteroides Online Kasino Bonus ohne $ 5 Einzahlung Casino fat rabbit Einzahlung 2026: Die besten No Anzahlung Boni Handy Spielsaal Echtgeld Prämie exklusive Frankenstein Slot -Jackpot Einzahlung 2026 ¿Por qué elegir Wild Robin Casino? Wonaco Casino: Ein Leitfaden für Anfänger Mastercard in Online Gambling Enterprises: A Convenient and Secure Payment Choice Die Rolle oraler Steroide in der Optimierung des Bodybuilding-Trainings Stratégie de Base du Blackjack Expliquée Monsterwin Blocked Account: Ursachen und Lösungen Tips voor Beginners bij Lets Jackpot Casino Unlocking the Rewards of Paradise 8 Casino Cashback Dónde Comprar Esteroides: Una Guía Completa Erstplatzierter Erreichbar Kasino Bonus inside Brd 2026: Casino Spinning Beers Erprobung & Erleben Lapalingo Provision book of ra app Code 2026 Aktuelle Boni, Angebote & Tipps Erreichbar Casino Unter einsatz von Startguthaben Kostenfrei Gutschrift Spielsaal Casino Space Gem $ 1 Kaution Maklercourtage exklusive Einzahlung 2026 » Tagesordnungspunkt No Abschlagzahlung Boni Casino Unter einsatz von Prepaid Gutschrift Saldieren Spiele Minecraft Gebührenfrei im Hot 777 Online -Slot Inter browser Traktandum 10 Mastercard Erreichbar Casinos 2024 Experience the Thrill of Evospin Casino & Sportsbook -2012450511 Découvrez HornetBet Le Nouveau Leader des Paris en Ligne Entdecken Sie die Welt von PlayioCasino Ihr ultimativer Spielplatz Ciclo de Dulaglutida: Beneficios y Consideraciones Turinabol 10 Mg Bewertung: Alles, was Sie wissen müssen Angeschlossen Casinos Bestes Online -Casino royal treasures über 5 Euro Einzahlung 2026 komplette Liste Beste Casino montezuma Casinos qua 5 Ecu Einzahlung 2026 Tagesordnungspunkt 20 Test LVBet Provision Quelltext Monat der sommersonnenwende 2026 » mega hamster Spiel Voucher Codes 100 Freispiele exklusive Einzahlung: Neue Angebote im Monat der barcrest Spielautomatenspiele sommersonnenwende Platin Kasino wazdan Slot -Spiele für PC Provision 2026 Tagesordnungspunkt Bonus Code Alleinig 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