/** * 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 Oppdag magien i Winrolla som forvandler hverdagen din Koe 50 kruunun tervetuloetu edistysten maailmassa Unleash Dazzling Wins at Emojino Casino Ireland’s Vibrant Playground Winrolla Wetten Transformeert Je Spelervaring Tot een Overwinning Unleash the Thrill of Fortune with Casino Virgingames Adventure Ignite Your Luck with Blaze Spins Casino App Adventure Today Plongez dans l’univers vibrant de l’offre de bienvenue Shuffle Unmasking Emoji Thrills in Casino Emojino Revelations Superbet apka – wygoda stawiania w Twojej kieszeni Unlocking Fortunes with Winrolla Casino Slots Adventure Unlock Limitless Wins with Casino Bettom No Deposit Bonus Magic Unveiling Spinyoo Casino Secrets for the Savvy Gambler Feszültség és győzelem ölelkezése a duel casino világában Oplev den skjulte magi bag Emojino gennem vores dybdegående analyse Koe jännityksen huuma casino emojinon värikkäässä maailmassa Galactic Triumphs Unveiled in the Space Wins Odyssey Review Spinn deg til milliondrømmer med casino billionaire spin app Իրականացրու Հաշվարկային Ստեղծագործությունները Thunder Coins խաղատուն hy-ում Oplev 50 crowns søstersider der gør din spiloplevelse magisk Unleash Your Fortune with Luckymate UK’s Magical Gaming Experience Descubra as Surpresas Ocultas em nossas Avaliações do Casino Emojino Entfessle den Spielrausch mit dem goldenbet Freispiel-Code Billionairespin Unleashed Crafting Wealth with an Edge Unleashing Fortune at Shuffle Casino Where Every Spin Ignites Excitement Rokubet odkrywa sekrety wygranej w świecie zakładów online Embrace Luck with Golden Panda Casino No Deposit Treasure Awaits Unlocking the Allure of PH Casino UK for Daring Gamblers trueflip mobil erweckt das Glücksspiel neu mit grenzenlosem Spaß Unlock Endless Thrills with Amazon Prime Casino Magic Ontdek een wereld vol spanning bij Trueflip online casino 1xbet বাংলাদেশ অনলাইন বাজির বিশ্বের অগ্রগামী Bonus Πρώτης Κατάθεσης Πώς Να Επωφεληθείτε Crafting Your Legacy Through the Art of Coin Striking Mastery Epic Feathers Fly in Chicken Road 2 the Clucking Adventure Unleashed Casino Bob France l’évasion ludique sans limites à portée de clic Unlocking Your Gateway to Immersive BC Game Adventures Unleash Your Luck in the Dazzling World of PlayFrank Casino Adventure Unleash Unforgettable Thrills with Jazzy Spins Casino Bonus Magic Odkryj magię gry z luckybird no deposit bonus bez ryzyka Desbloquea premios ocultos con el código promocional de Trueflip TrueFlip Casino US Unleashes Epic Wins with Magnetic Gameplay Rivoluzione del divertimento con i giri di CasualSpin casino Jet Bet Casino odkrywa świat ekscytujących wygranych i emocji Play 4 Pots Riches Slot Türkiye ile Zenginlik Türlü Oyun Keyfi Epic Showdown Awaits in Coin Strike 2 India Unleashing Legends Betsixty Casino France de▌ücouvrez l’univers envou▌étant des jeux d’argent Three Carts of Gold Online Unveiling Digital Treasures Awaiting You mrbet casino polska odkrywa świat niezwykłych emocji i wygranych Golden Penny ile Bin Kere Daha Fazla Kazanç Kapını Açar Royal 2 coins ilə müasir dövrün qiymətli mirası