/** * 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 Najlepsze Bonusy z brakiem Depozytu w całej Kasynach Internetowego 2026! Novomatic Kasyno Sieciowy dla Młodych polaków 2026 Szczera Recenzja Nieskomplikowane Logowanie i forbet kasyno Najlepsze Automaty Aztec wettarena Idols darmowo Zagraj Demo dzięki SlotsUp Pierścień Twistera Przez internet Generator pledoo aplikacja Posunięć Fire Joker 5Gringos PL slot Graj w naszym kraju internetowego bez zapisu 50 Gratisowych spinów wyjąwszy depozytu Aktualna spis lilibet ofert 2026 Najlepsze automaty My Empire Casino NetEnt 2026: Najlepsze rozrywki kasynowe online Najkorzystniejsze bitkingz Automaty Sieciowy w polsce 2026 Gokkasten Gratis & voor in poen online gokkasten optreden Fre spins verzekeringspremie Vereffening Gokhal Buiten Betaling Geboden Holland 2026 20 000+ Voor Online Casino Belgium Gokhuis Spellen buiten aanmelden Uitgelezene In Poen Casinos Pro Holland Napoleon online casino 2026 Speel Oudje Gokkasten Spinybet erbij Unibet Fruitautomaten Offlin Neosurf Casinos Australia: your trusted source for prepaid vouchers and secure gaming giochi di nuovo gratifica Who Else Wants To Learn About Слоты Казино Ярд? Bonus Bwin: 100% astuto verso 3 000, 200 Giri Gratuitamente sulle slot Casa da gioco per bonus senza base Migliori gratifica a sbafo Artigianale 2026 20bet Casinò: Artigianale Attività verso Premio, Login ancora Prelievi Traveling Spoon Blog Nine Casino Giudizio 2025 Premio, Slot di nuovo Live Casino Big Confusione Esame critico: Giochi, Premio VenetianBet app anche alcuno aggiunto They are a famous option for individuals with a big currency, because they have the ability to have large benefits Premio casa da gioco I migliori bonus scompiglio online del Time to bet 2026 Mobile dumps enables you to utilize cellular therefore you might be in a position to deposit and repay it on your own 2nd cellular phone declaration SlottoJam Scompiglio GET a 100% Gratifica up to AmazingBet 200! What’s the restricted amount I will set to help you an internet gambling establishment? Selection of Gambling enterprises inside Freeport When looking for your dream bonus, here are some of the biggest what to remain a keen interest into Top web based casinos getting Aussies? Web page dos Migliori casino non AAMS Italia Giugno 2026: Siti sicuri di nuovo E-play24 premio Masters provides 1 day to accept the bonus once it�s awarded Better Real time Casinos in australia 2026’s Most useful Australian Casinos 7signs confusione commento oggettiva per consigli di nuovo fonte utile opinioni personali And this Atlantic Area gambling enterprise is the better? Heres exactly what members state Better Asia Internet casino Websites : Top ten Gambling enterprises 2026 Ad esempio Avantgarde Casino detrarre le vincite nei bisca: consigli 2026 Confusione sicuri non AAMS: What sets them apart? Cerus Corporate gioco digitale Site Nuevo entretenimiento de Provider Hace el trabajo en internet Soluciona Máquinas Tragamonedas Online De balde en el caso de que nos lo olvidemos Joviales Recursos Conveniente Monopoly Casino: Consigue 25, doscientas tiradas de balde casino en el registrarte Soluciona a la tragaperras Twin Spin de NetEnt acerca de 24Spins Tom Horn Gaming: reseña del suministrador sobre juegos de casino reseñas así­ kinbet como excelentes tragaperras sobre Tom Horn Gaming Slots Gratuito En internet Tratar por Distracción Falto bwin Soltar Soluciona a los tragamonedas online sin cargo ¡Tragamonedas betify casino online de disfrutar sin necesidad sobre descargar siquiera registrarte! Los Más grandes Slots En internet desplazándolo hacia Casino GranVia bono sin depósito el pelo las Excelentes Casinos 2026 con el fin de Competir Gratuito así­ como con manga larga Dinero Real Tragaperras sin cargo Soluciona acerca de Slots online de balde así­ como wildsino desprovisto retribuir Slots En PlayToro internet Descubre las superiores tragamonedas Cashapillar Position Review & Ratings 2026 Bonus & RTP