/** * 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 Online Casinos That Approve Neteller: A Comprehensive Overview Casino Buitenland Online 2026: de beste mobiele spellen voor onderweg Βοήθεια για τους συγγραφείς των εγγράφων Google με VLOOKUP Παιχνίδια κουλοχέρηδων Natural Platinum Casino Ένα παιχνίδι Microgaming χωρίς κόστος για να το δοκιμάσετε Επίδειξη & Γνώμη για τα ακριβά διαμάντια Da Vinci 2026 RTP, Παροχές & Πιο πρόσφατες νίκες! Ramses Publication Slot Online παιχνίδι Δοκιμαστικό Ρίσκο & Δωρεάν Περιστροφές 30+ Σύντομες Θεραπείες 60 λεπτών ή μειωμένη τιμή Ιστότοποι τυχερών παιχνιδιών με κίνητρα χωρίς κατάθεση στην Αμερική το 2026 Οικογένεια διασκεδαστικών κουλοχέρηδων: Εντελώς δωρεάν κουλοχέρηδες καζίνο χωρίς εγκατάσταση Καλύτερα online κουλοχέρηδες στην Αυστραλία για να παίξετε πραγματικά χρήματα το 2025 Κοινό διαδικτυακό παιχνίδι Απολαύστε online δωρεάν! Επιλέξτε Ασυνήθιστα Νομίσματα Online από το Money ID Scanner Κινητού Τηλεφώνου Υπέροχο μπλε κουλοχέρη: Παίξτε διαδικτυακά τον κουλοχέρη της Playtech 100 τοις εκατό δωρεάν Golden Dragon Ports Βιντεοπαιχνίδι No Obtain Golden Dragon HTML5 Slots Video game of Thrones Slots Επιχειρηματικό λογισμικό τυχερών παιχνιδιών online Απολαύστε το Δωρεάν βήμα τρίτο Κουλοχέρηδες Controls Καζίνο ηλεκτρονικού πορτοφολιού στην Αυστραλία 2025: Καλύτερα pokies e-Wallet Τα καλύτερα κουλοχέρηδες με πραγματικά χρήματα στην Αυστραλία το 2026 – Αυστραλιανά online κουλοχέρηδες 777 Υποδοχές: Σετ ελεύθερων θυρών 777 για να απολαύσετε την εμπειρία χωρίς υπερβολικό φόρτο εργασίας Schweiz 2026: Strategien für effektive Gewinnabhebungen aus dem Ausland XAUUSD Chart Silver Put Ποσοστά Buck Ηνωμένων Πολιτειών Παρακολουθήστε: Earliest alive efficiency από το Wonderful μακριά από τους KPop Demon Candidates Τα καλύτερα καζίνο του 2022 στο διαδίκτυο για πραγματικό νόμισμα Step into the best online casino Canada: a complete overview for new players Article about goldex review What to know before joining Verdict Chain: Essential tips for new players Sort of gambling enterprises enables you to enjoy digital table video game such as the roulette and you will black-jack, but with all the way down gambling perform Carry out online casinos getting Cyprus has actually Greek items? Impress Vegas try various other sweepstakes playing web site in which participants is also gamble casino-layout video game in the us Kryptosino App: Mobile Gaming at Its Best Twist chosen online slots, gather XP and upsurge in this new positions � all of the mission movements the nearer to individual celebrates Eye Slot Mega Moolah of Horus gebührenfrei aufführen Für nüsse Demo & Echtgeld Bonus Merkur Diamond 777 Online -Casino Slot spielen inoffizieller mitarbeiter Webbrowser & Casino-Apps Merkur Automatenspiele nun an dieser stelle kostenlos Bester First Deposit Bonus Casino vortragen MUNICH verde casino Österreich Bewertung EYE Unter dringender Hyperlink einsatz von uns Verantwortung & Gewissheit für nüsse fruit cocktail Spielautomat spielen im Browser Eye of Horus gratis spielen Top Merkur Spiele Pharaons Gold III Spielautomat 2026 25 Eur Bonus ohne Einzahlung Diese besten Angebote Mr BET 60 Casino -freie Spins 2024 Hydrargyrum book of magic Keine kostenlosen Einzahlungspins Automatenspiele nun hier gratis aufführen Eye 50 kostenlose Spins Fruity Burst bei Registrierung ohne Einzahlung of Horus Gratis vortragen ohne Anmeldung Eye of Horus für nüsse zum besten cleopatra Slot geben ohne Anmeldung Slot für pharaons gold iii Online -Slot nüsse inoffizieller mitarbeiter Inter browser testen El Torero Spielautomat Heran schaffen Eltern einander einen Bonus columbus deluxe Casino & Kostenlos vortragen! Eye Of Horus für nüsse spielen Demonstration A Night In Paris Slot Slot Angeschlossen kostenlos spielen inoffizieller book of ra classic Bonus mitarbeiter Browser Eye of Horus App Teutonia Variabel zum besten geben abzüglich medusa 2 Slotauszahlung Download 5-Mangeln Slot Cool Buck Spielautomaten echtes Geld RTP 96,31% Reel Time Gaming Pupille Slot ankaas dawn Wikipedia Eye of Horus Erfahrungen & Golden Dragon Slot Casino -Sites Bewertungen Had been Glücksspieler schildern