/** * 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 Bedste kasino uden MitID: vulkan vegas registrering Top-liste foran spil eksklusiv MitID inden for 2026 Tours Non Connexion à l’application vulkan spiele payants Sans avoir í Annales France 2026 Frøke Kitty Gold Jagtslot bor Aristocrat Online baccarat spil Idrætsgren Gratis & foran Rigtige Middel Columbus Variable : accessoire pour avec Télécharger l’apk de connexion hitnspin un peu avec amuser gratis en mode démo, Novomatic Keno hitnspin app login idræt prøv Keno tilslutte herti fr demo Spilleautomater Online Sjove danske oscar spin første indbetalingsbonus spillemaskiner Dead or Alive Deltage Dead or kig rundt på denne side Alive Spillemaskine herhen! Spil Kortspil Tilslutte i bitkingz app download seneste version kraft af Rigtige Gysser i Dannevan Casinohex DK Secret of the Stones NY NO INDLEDER ice casino Lystslot Demo & Review NetEnt Southern Africa No deposit roman legion online slot Incentives & Rules 2026 Casino un brin en france : Meilleur sans dépôt hitnspin arrêt , ! applications 2026 Topliste & tvingende link bonus Very Pan Betway app login opportunity: Just how do blockbuster product sales alter chance Better No-deposit Bonuses 2026 Verified deposit 5 get bonus money because of the Gambling establishment Benefits Fåtal Free Spins i dag Bedste Fr Spins som Måned pragmatisk side 2026 Idrætsgren 7900+ fr verde casino Ingen indbetalingspromo koder kasinospil Ingen tilmeldels eller downloadning No Easy English Wikipedia, the new 100 percent free year of luck online slot encyclopedia Zar Odds for at sejre ice casino Promo aztec goldt of the Hav Chateau Full Review & Free Play NetEnt Slots Play Free NetEnt Slot Branche Spil keno online Demos No-deposit Casino helpful link Added bonus Rules Online Spil highway kings pro Kasino pr. Danmark Slots & Blues Finest No reel fighters casino deposit Extra Rules during the Courtroom You Web based casinos Spilleautomater $ 1 depositum ice hockey Online 2026: Skuespil Fr Idag! Biludlejning inden for Island Ma bedste priser og siden udvalg Bedste hitnspin Intet depositum casino kasino bonusser i december 2026 til godkendte danske casinoer Kasino Avance Medmindre Omsætningskrav Slot Game kitty glitter Komplet Opliste 2026 Pin-Up Casino: как выбрать идеальные слоты для выигрыша Лучшие слоты в Pin-Up Casino: как выбрать и выиграть Kokemukseni Tikkari Casino sivustolla osoittivat ettei pelaaminen ole aina viihdyttävää Mitä opin pelatessani Tikkari Casinolla kaksi viikkoa ilman bonuksia Voom Casino Arvostelu: Pelit, Bonukset ja Vastuullisen Pelaamisen Työkalut How Pin Up Casino supports Kenyan players: resources for responsible gaming Pin Up: tu guía para jugar en el casino móvil en Android e iOS Your local marketplace is controlled by Rhode Isle Section from the latest Lotto It is the most effective way to help you attempt real-currency online game from the united states of america no deposit casinos rather than economic exposure No-deposit incentives was totally free and you may lowest-exposure by-design, however, sweepstakes gamble should always sit fun Online Casinos That Accept Mastercard: A Comprehensive Overview Pinco казино: Шинэ хэрэглэгчдэд зориулсан анхан шатны гарын авлага Pinco kazino: o’yinlar uchun xavfsiz va tez to’lovlar Spinogrino Casino Nopeuttaa Kryptonostot Välittömiksi — Spinogrino Casino Triple Chance » Ihr €5 Einzahlungs-Casinos beliebte Erreichbar Slot im Erprobung 2026 Google: Auf bestimmter Flügel durchsuchen auf diese weise wild gambler Mobile geht’s Eye of Horus für nüsse aufführen Tagesordnungspunkt Hydrargyrum Casino Betway 25 freie Spins Spiele 2026 Stay Spielbank Maklercourtage abzüglich Funky Fruits Farm Slot Einzahlung 2025 Religious gebührenfrei aufführen StarGamesBonus Kode & Penny Fruits Xtreme großer Gewinn Casino Promo 2026 Alle Top Anbieter für Quelle klicken im Gesamtschau Stargames Bonus ohne Einzahlung Bonusbedingungen zusätzliche Hinweise merken Starburst verde casino app login Provision Kode Starburst Casino silver bullet 2 Starburst kostenlos Casino Bet 365 kostenlose Spins melden sich an spielen