/** * 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 Thunderstruck Wild Super Slot Από την put 5 βαθμολογία twenty-five gambling enterprise 2026 Stormcraft Studios, Γνώμη, Demo Βιντεοπαιχνίδι Παιχνίδια κουλοχέρηδων Reactor Casino: Απελευθερωμένοι για να παίξετε δοκιμή και σχολιασμό Κουλοχέρης Survivors στο Διαδίκτυο καζίνο Εντυπωσιακά μπόνους καζίνο Starburst και χωρίς κατάθεση & εντελώς δωρεάν περιστροφές Thunderstruck 2 Online Θέση από Microgaming Απολαύστε το Raging Rhino στις κρυπτογραφικές θύρες τυχερών παιχνιδιών στο διαδίκτυο Μπόνους καταστημάτων τζόγου Raging Rhino Status, 100 τοις εκατό δωρεάν δοκιμή και γνώμη Gümüş Kolye Gümüş Yüzük Gümüş Bileklik Δωρεάν δοκιμή παιχνιδιού Dual Spin Position Remark 2026 Sphinx Position Canada Τρέχουσες καμπάνιες κινήτρων για την κατοχή συμμετεχόντων Το καλύτερο βιντεοπαιχνίδι Blackjack σε πραγματικό χρόνο και θα έχετε κίνητρα Σχόλιο θέσης IGT Sphinx, κίνητρα & 100 τοις εκατό δωρεάν Gamble 95 12% RTP Thunderstruck 2 Ports Κορυφαίες τοποθεσίες Web Thunderstruck dos Position Αναθεώρηση θέσης Thunderstruck II Πώς μπορώ να τερματίσω διαφορετικά μια δήλωση αμφισβητήσιμης συμβουλής νομίσματος ή τιμολόγιο; Mummys Silver Casino 100 τοις εκατό δωρεάν περιστροφές, μπόνους χωρίς κατάθεση, εγχείρημα Wolf Silver Slot Εντελώς δωρεάν Demo & Γνώμη Ιούλιος 2026 Ο απόλυτος οδηγός μεθόδου Blackjack Sphinx Slot Remark 2026 100 τοις εκατό δωρεάν Επίδειξη παιχνιδιού Τα καλύτερα καζίνο με πραγματικά χρήματα στο διαδίκτυο: Τα δέκα κορυφαία τον Ιούλιο του 2026 Απολαύστε 19.000+ 100% δωρεάν παιχνίδια τζόγου Χωρίς εγγραφή ή λήψη Θάντερστρακ Χάρμπορς Gratis Spilleban Idræt tilslutte: Vind rigtige gysser hvis ikke indbetaling fantastisk side 2026 Så Sikken, Virk, Nå Det Er Lucky Jungle Casino bonus uden indskud 88 Fortunes Spilleautomat Rigtige Gysser Efterlevelsesværdig At Spiller På Slots Online casinoer som august 2026 Rejsefører i klik her for mere info tilgif danske kasino sider Alle danske på kasino bonusser over 70 Chanz Casino online bonusser tilslutte én egenskab Απαιτείται ενδιαφέρον! επιχείρηση τυχερών παιχνιδιών μαίνεται ρινόκερος Cloudflare Gamble Versailles Gold online 5000+ Online Slot Online game Greatest Web based casinos United states Motorhead casino of america August 2026: All the All of us Local casino Sites Spilleban Hvis ikke fruit mania Slot Ingen forsikring ROFUS Det Demo Casino online Bedste Skuespil Rigtignok omkring ROFUS pr. 2025 Greatest Real money Casinos United states July 2026 Specialist pokie diamond dogs Picks Rejsebog til de bedste Dansk777 Casino bonus uden indskud pengespil på nettet No-deposit Incentive Gambling establishment A real income casino wunderino no deposit bonus 2026 Wikipedie: 100 nových televizních seriálů 100 percent free Spins & Each day davinci diamonds slot cheats 100 percent free Revolves to possess Current Customers 2026 Greatest You Casinos on free slots to play online the internet 2026 ten+ Expert-Ranked Websites Casinos on the Betfair casino internet 2026 Better Real money Casinos on the internet Ikona indikace dolarů $ Duplikujte, vložte a napište nejnovější znak dolaru na 21Red bonus bez vkladu jednom zařízení Bonusy za roztočení zdarma bez vkladu 2025 Nejlepší roztočení zdarma ve Velké Británii také nabízí 5$ Lowest Put Casinos ️ Better $5 Deposit Local source site casino Sites 2026 Starburst Totally free Spins Starburst No deposit Extra casino Spinfields casino Rules Online casinos for real Currency Greatest Local casino Iron Man mega jackpot Sites in the us 2026 United states Casinos on the internet: slot bonus deposit 100 30+ Better Casino Websites 2026 Casinos on the internet 2026 A Booty Time slot real income Web based casinos Top Online casino Real money Web casino Gday login sites August 2026 Best Online casino Mandarin Palace login casinos for real Profit the us 2026 Online slots Enjoy from more than 1000 slot video game in the free coins lightning link Bovada Local casino fifty casino no deposit bonus 100 free spins Free Spins No deposit List of Incentives to have Uk People Online casinos United states 2026 thunderstruck slot cheat Tested & Ranked 10 20 pound free no deposit casinos Greatest Online casinos for real Money Us within the 2026 Better Web based casinos the real koi princess online pokie deal Cash in the usa Finest Casino Web sites