/** * 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 Hypebet Login: Your Gateway to Premium Online Betting Unlock Your Thrill with Seamless Oxibet Casino Login Adventure Revel in the Thrill of Fortune at the Online Casino Odyssey7808 Wonderful Goddess Position Enjoy Which IGT Online game at no cost Eesti Kasiino Boonused Mida Kaaluda Pakkumisi Hinnates Ekscytująca eksplozja emocji w fireball casino Polska odkryj nieznane zakamarki gry4315 Ensimmaiset kokemukseni kun pelasin PayPal Casino 5 Euro talletuksella tavallisena pelaajana Unlock a Fortune with an Unbelievable 500% Casino Bonus Adventure1994 Zanurz się w świat emocji dzięki beep beep casino app0600 F1 Casino bez depozytu – adrenalina wygrywania bez ryzyka4586 Comprendre l’ACE et la dépression après un stage Beste Online Casino Mit Echtgeld Angebote fuer Spieler in Deutschland im Testbericht Trumo Casino 2026 kokemukset ja bonukset testissä Traitement des Mycoses chez les Sportifs Possibilités de la pharmacologie dans l’entraînement en altitude Regionale Casino-Erfahrungen Wie unterscheiden sich die Spielhallen Ace your betting strategy Expert tips and tricks for successful gambling with chicken road 2 Sexy pragmatic play demo Future Trends in Gambling: What to Expect from International Betting Companies – Pros and Cons Культура казино в мире как разные страны играют по своим правилам Pin Up casino Популярдуу казино оюндарын тандоодо Pinco casino кандай жардам бере алат Psychologische Auswirkungen des Glücksspiels auf das menschliche Verhalten Jouer aux machines à sous en ligne sans Dépôt Beste Goketablissement Sites: Een Uitgebreide Gids voor Gokkers High roller experiences Unleashing the thrill of luxury at Pin Up Casino casino Oplev de bedste regionale casinoer i Danmark En omfattende anmeldelse Bases du Bonus des Machines à Sous Vidéo de Casino Gratuit Bases du Casino Gratuit Machines à Sous Vidéo Bonus : Ce que Vous Devez Savoir Zanurz się w magię gier w Marvel Casino Poland8033 Testomed P 100 pour Optimiser vos Performances Sportives Unleash Your Luck with Bof Casino’s Ios Treasure Trove4801 Book of Spins gratuits beetle frenzy Pas de dépôt Ra 6 : Jeu de accessoire vers dessous gratis un brin pour Novomatic Casinosider Beste norske casinosider anbefalte 2026 жылы Pin-Up casino-да максималды бонус алудың 7 тәсілі 2026 жылы Pin-Up casino-да максималды бонус алудың 7 тәсілі Nätcasino » hur man tar ut gate777-bonus All svenska casinon gällande nätet 2026 Verde Casino PL odkrywa tajemnice nieograniczonych emocji i sukcesów Masteron P 100: Πώς να το πάρετε Maximisez votre potentiel avec Tren A 100 Les réponses endocriniennes à l’hormone de croissance Magiczne wejście do świata rozrywki z casino malina logowanie1378 . . . . Die besten Tipps für Masse ohne übermäßige Fettzunahme Zyskaj niezapomniane emocje z lv bet casino bonus code6375 Warum Anabolika kein Ersatz für hartes Training sind Spinrollz: A Fresh Spin on Online Slots Peut-on pharmacologiquement augmenter la capacité pulmonaire ? Diese 8 besten Online-Casinos Deutschlands 2026 inoffizieller mitarbeiter Vergleich