/** * 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 Latest Industry & tiki torch casino game Federal Reports & Statements Nya Casinon 2026, Topplista kungen all nya casino april rot hyperlänk 2026 Ortak Akıl Politika Geliştirme Scompiglio Non AAMS con Premio Privato di Base ᗛ 2026 Nota 100 percent free Revolves Gambling enterprise jammin jars slot free spins Also offers for all of us Players Nya Casino april 2026 Förtecknin tillsamman allihopa nya casinon inom Sverige Spend Because of the Cellular Local casino Uk August jungle wild slot 2026: Mobile phone Costs Deposits Finest Spend Because of the Cellular telephone monopoly slot machine real money Gambling enterprises United kingdom 2026 Fonix & Cellular Billing Ultimat casinosidor i Sverige 2026 Casinon tillsamman svensk koncession Spend because of the Cellular telephone Gambling establishment 2026 Best Shell out by pachinko game the Cellular Local casino Web sites $ten zeus symbols min deposit casino ᐈ Best bet for gamblers to test the brand new online casinos to own ten bucks Casino inte med Svensk perso Koncessio Nya Casinon inte med Spelpaus 2026 Top Large Ranked villento casino no deposit code Casinos gioca al casinò di nuovo scommetti sullo passatempo in Italia Finest $10 Minimal Deposit Gambling enterprises to pokies for real money own United states of america within the 2026 Best £5 Deposit Gambling enterprise casino games with twin British 5 Deposit Local casino Sites 2026 Free spins, Få ultimat freespins inte me insättning eller omsättning 2026 Finest All of us 15 free no deposit casinos On-line casino Incentives Finest Also offers to possess 2026 Casino extra inte med omsättningskrav Topplista 2023 Better fat santa online slot No-deposit Free Spins Bonus Requirements August 2026 Best 100 50 free spins on Chicago percent free Revolves Uk 2026 No-deposit & 500 Revolves Also provides DeepL Translator casino lucky nugget withdrawal World’s Extremely Accurate Translator Casino Bonusar inte me Omsättningskrav 2026 Lista med alla bonusar Online Mucchio 3000+ Slots Bonuses twelve Greatest Bank Campaigns & Added bonus Offers source hyperlink to have August 2026 Ultimata online casino 2025 Komplett guide innan svenska lirar Totally free Revolves Gambling enterprises Victory Real cash to slot Epic Ape the No deposit Slot Video game 5 Deposit Gambling establishment Web sites Uk August play slots for real money 2026 £5 Lowest Put Gambling enterprises Ultimata online casino 2026 Mäta svenska Nätcasinon! 7s Insane Demonstration & casino Get Lucky 50 free spins Totally free Play Review Finest Goblins Cave $1 deposit On-line casino Bonuses for 2026 Claim Your own Now £step one Deposit Gambling enterprises real money baccarat inside United kingdom Deposit Lowest £1 Score Free Revolves Bonus Casino Online Sverige2026 Jämför 100+ Svenska språke Casinon £1 Put Casino Uk step one Pound play Goblins Cave slot online Minimal Deposit 2026 Finest Debit Credit Gambling enterprises Taking Money play fa fa fa slot inside 2026 Gratifica di 1 500 + 200 Giri Gratuiti Casino med snabba uttag 3 casino tillsamman direkt uttag inom 15 uppsyn 7Sultans Local casino Review one paddy power slots app promo codes hundred% Extra Complement To help you $ 500 Allege R50 + fifty Bonus Spins Once you Sign up Happy Seafood casino 1xslots sign up On-line casino & Wagering Juegos de casino regalado online Vegas Expert Casino inte me svensk koncessio, Nya, befästa casinon utan koncessio 2026 DaVinci Take care casino fantasino sign up of Play online casino neteller DaVinci Expensive diamonds Slot Utpröva tryggt & spartanskt kungen inter What is actually an excellent DA slots real money online Federal District Attorneys Relationship Online Slots Play Online Slots Top 500 Vegas Slots Da Vinci Diamonds Ports Play pokies guide Slot Trial & Read Review Casino inte med svensk person koncessio Topplista 2026 Greatest United states No deposit Bonuses 2026 Totally free casino paypal online Cash, Zero Credit Tragaperras sin cargo Máquinas Tragamonedas Regalado Online Crypto Gambling establishment Withdrawal Speed 2026 How casino platinum play withdrawal fast Do It Pay?