/** * 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 100-odstotno brezplačni igralni avtomati Zero Download Zero Membership Latest Wonderful Riviera Local casino Incentive Requirements On-line casino Analysis Better Top Online casino Web sites 2026 from the Getb8 Free Spins Gate777 Gambling establishment Comment 2026 Welcome extra a lot of Web based 25 free spins no deposit casinos Us 2026 Checked & Ranked Trial Harbors Online Gamble 9000+ brezplačnih spletnih Harbours Cashapillar Slot: Bonuses & Totally free Enjoy Ramses II Ramses The nice Items 1279-1213 BC Greatest United states Online casinos 2026 Tested, Rated pragmatic play games online & Analyzed Najboljši spletni igralni avtomati za pravi denar Podjetja za igre na srečo Do leta 2022 Top Analysis & Ratings Greatest 10 Quickspin Ports for the Large RTP Crypto Exhilaration Casino Comment Bonuses, App and Games Play Ninja Miracle On the web Slot Brezplačne igre Da Vinci Diamonds na internetu House Quick Commission Actions Nesmrtna ljubezen na spletnem igralnem avtomatu Greatest Online casino Web sites for real casino wild shark Cash in July 2026 Punctual Payment Tips Simple tips to Play Quick Hit Pokies Along with your Mobile? Enjoy The newest Free Ports On the web: The brand new Position Games 2026 Kako najti izobražene spletne igralnice za pravi denar Breaking Information Eyewitness Information Supply Queen Of your Nile 100 percent free Slot Gamble Demonstration RTP: 94 88percent Instant Detachment Gambling establishment Internet sites: Complete Checked to own July 2026 Casinos on the internet United states 2026 tomb raider slot Checked out & Ranked Gamble Best Real Time Blackjack 2022 Inform Know how to Bush, Proper care and you can Develop Bountiful Agapanthus Greatest Casinos play craps online on the internet for real Money 2026 Uživajte v brezplačnih igralnih avtomatih na spletu brez pridružitve Mr Cashback Gambling establishment Harbors The best Mobile Gambling enterprise Publication Online Nasty Aces Gambling establishment extra: 100% Invited Added bonus as much as $2 hundred suits incentive Casimba Gambling enterprise Discounts July 2026: 275% To C$6,500, 125 100 percent tomb raider slot no deposit free Spins Better Gambling enterprise Applications rather kitty super jackpot A real income Software for us Advantages บริษัท ไทยรุ่งยูเนี่ยนคาร์ จำกัด มหาชน 7 najboljših spletnih mest za ruleto s pravim denarjem Interested Math Items and you can Fascinating Characteristics Fairly Cat Ports Review: Twist to possess Feline Gains and Free Spins Jackpot Break Skutočné peniaze Kompresné zariadenia na propánový sortiment Online casinos Having a good $100 No-deposit Extra, a hundred 100 percent free Spins, A real income Insane Chance Gambling enterprise Australian continent: AU$step 1,000 Bonus & 2,400+ Games 5 Dragons Slots: Play Aristocrat Totally free Position Video game On the internet Greatest £5 Put Casinos in the united kingdom July 2026 Better Online Pokies Australian continent 2025: Where you should Enjoy Best Pokie Game Hrajte úplne zadarmo Blackjack online bez nutnosti sťahovania Effetti Positivi del Testomed E 250 Online free spins no deposit 150 casino, Sportsbook & Poker BitStarz Gambling enterprise Review 2025: Best Crypto Gambling establishment to own Music Fans