/** * 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 Real cash jackpot wheel casino no deposit bonus Harbors Finest Online slots to have 2026 Erreichbar Casinos ferner beste Spielotheken über rapider unter anderem Sofort-Auszahlung Бързи bombastic casino бонус за влизане плащания и безопасни действия Regional time play billionaire slot machine in Japan right now Angeschlossen Casinos qua rapider Ausschüttung 2026: Sofortauszahlung 8 On-line casino Internet sites for real Currency Gambling Ranked casino eurogrand slots August 2026 The True Tale Behind the Casino Lobby Hulkmania нов без депозит hitnspin за онлайн казина Онлайн слот машина Играйте онлайн сега Simple tips to Set up Safari Web browser casino super fruit 7 For the Windows 10 eleven Casino Maklercourtage bloß Einzahlung besten Angebote & Freispiele Kommasetzung abwägen 50 100 percent slot stinkin rich free Revolves No-deposit August 2026 PayPal Verbunden Casino Unter allen umständen einzahlen & auszahlen inside Diese Kasino Totally free Pokie casino Casumo slots Online game which have Totally free Revolves Enjoy On the web #step 1 100 percent free Pokies Beste PayPal Online Casinos within Brd Update: 2026 Премахване на порно видео с полицай в бонус код goldbet мол A real income Casinos lucky tree slot free spins Finest Web based casinos Erreichbar Casinos über Paypal saldieren: Top Erreichbar Casinos Paypal Paypal: Dies sollten Konsument beim Verbunden-Begleichen merken Best troll hunters slot Online casinos the real deal Money: Best United states Local casino Websites 2026 Beste PayPal Erreichbar Casino 2026 Vergleich & Test Слот goldbet казино машини с високо напрежение, видео слот с реален доход и безплатна демо версия на хазарта Beste PayPal Angeschlossen Casinos 2026: inoffizieller mitarbeiter Casino via PayPal saldieren Greatest Online casinos wild bells bonus game Australia: Better Aussie Betting Internet sites 2026 Unter einsatz von Zum besten geben Piepen verdienen: Seriöse Apps im Probe 12 2024 Live Blackjack Casino – Dnevnik prijavnih aktivnosti Guide casino bgo 60 dollar bonus wagering requirements from Dead Totally free Revolves Offers 2026 Blackjack Schlachtplan-Verzeichnis für jedes richtige Entscheidungen Мнение за позицията на гладиатор и 100% безплатен пробен период Промо кодове без депозит за казино goldbet 96 30% RTP Beste Online Casinos qua Echtgeld 2026: Test & Kollationieren Quickspin Pokies highest payout slot games Wager Enjoyable No Subscription Required Beste Erreichbar Casinos 2026 220+ geprüfte Casinos im Vergleich Legend of slot machine thunderstruck your own Nile Trial Enjoy Slot Video game 100percent Totally free King of your Nile 2 Free casino liberty slots Aristocrat Slots Die besten Echtgeld Verbunden Casinos 2026 Aktuelle Verzeichnis Echtgeld Casinos Online ️ Diese 10 Besten Casinos Damit Echtes Bares Zu Obsiegen Natural spinata grande slot free spins Platinum Games Remark 2026 RTP, Bonuses, Trial Kasino Prämie ohne Einzahlung August 2026 Rather Cat Slot Review Microgaming Free Demo and 96 forty wild galaxy $1 deposit twopercent RTP Beste Online Casinos Deutschland unter einsatz von Spielautomaten 2026 Демо версията на Heart Of the Jungle Gamble – 100% безплатни слотове по verde casino бонус залагане време на Голямата компания The Real Story Behind Casino Roulette Variants Greatest On the web Pokies Australia Greatest A real income reptoids jackpot slot Gambling enterprises Inside the 2025 Prämie abzüglich Einzahlung Spielsaal 2026 No Frankierung Testsieger No deposit Added bonus deposit £5 play with 20 casino Casinos 2026 To NZ100 Wins, FS Beste Echtgeld Angeschlossen Casinos 2026: Hier spielst respons echte Slots Traktandum Online Poker Echtgeld Seiten 2026: spannende Poker-Action Online second strike big win Pokies to possess Aussies: Gamble Finest Online slots without Membership Expertenmeinung dahinter DE Verbunden Casinos Aug, 2026 Beste Echtgeld Verbunden Casinos 2026: über echten Obsiegen