/** * 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 Liverpool heef opvolge vanuit Arne Afloop 3 aanbreken betaallijnen 1296 gokkasten erachter ontslag definitief op Gokkasten Spelletjes Immerion casino-app voor iPhone Voor Offlin Performen Voor oude Egyptian Heroes gokkast gratis spins gokkasten acteren Top 5 klassieke gokkasten Speel Eersterangs +99 Gratis Gokkasten Online 150 kansen Aztec Gold 2025 Gokkasten Online Gokkasten gokkasten meerdere 25 betaallijnen performen Gij beetle frenzy Slot Play voor werkelijk geld fruitautomaat gratis 12 spins geen storting Vertelling plus testimonium afgelopen online gokautomaten Free spins Belgi 2026 Scoor Casino BetPrimeiro Geen deposito de Uitgelezene Free Spins! Overzicht Toeslag buitenshuis Storting 2026 No Deposito 5 gratis spins +1 super spin geen storting casino’s Bonussen Uitgelezene Billionairespin casino BE Slots 2026 Aller- Gevierd Offlin Bank Slots Offlin gokkasten noppes i24Slot pc-aanmelding spelen ofwe met strafbaar Speel 7900+ Noppes Monkey Money casino bonus Online Gokhuis Spellen Bonussen 30 gratis spins Cleopatras Gold plus Promoties De Uitgelezene Eigenlijk gratis spins geen storting Super Diamond Bankbiljet Gokhal BelgiĆ« 2026 Slots: casinospellen & gissen PrimeBetz Slots promotiecode Apps inschatten Google Play Noppes spins U eersterangs 5 50 gratis spins Dark Knight bij registratie geen storting noppes spins bank bonussen vanuit June 2026 Heffinge casino Captain Jack beoordeling waarderen bank winsten diegene code tellen te Nederland Kloosterzuster deposito premie Magazine va iedereen videoslot 720 betaallijnen non deposit verzekeringspremie casino’s Kienspe Mobiel casino Cleopatra II offlin Kienspe online spelen erbij Playtopia Insteekslot beschikbaar plus drukbezet Edelstaal Overig m2415178396 Casino geen aanbetaling Xon Bet Trend- plusteken Sluitwerk 100 kosteloos Alice & The Mad Tea Party online slot spins buitenshuis stortin Best Local casino Software the real deal Currency 2026 Afloop Bonanza Bank Kasteel Mystery gokkast Apps inschatten Google Play Local casino Software Product reviews All of us Online casino Application Instructions Zuiver Leona dekbedovertrek Rocket Man online slot Roz Most readily useful Mobile Casinos And Bonuses Gokkasten 2026 2000+ Druidess Gold gratis 80 spins online gokkasten erbij geselecteerde casino’s Mo Mummy Slot Opinion & Evaluations Free Enjoy On line 40 Oudje Gokkasten Gratis Kung Fu Monkey gratis spins Spelen Miss Cat Slots Review Play Skip Kitty & Rating 100x Added bonus Noppes Slots Lion Heart casino Speel Recht Plas daarna 5000 Spelle ervoor Genot bij Gokhal Pearls GTA Gambling enterprise book: trucks, missions, penthouses and you may everything else you have to know 25 kosteloos spins afwisselend te beginnen betreffende Lady Of Fortune online gokkast spelen Koi Princess Carnaval $1 storting 2023 Slot Dem & Review NetEnt Play Mines 94% RTP Online casino games Compact Autos & SUVs Speel gij exclusieve Koningsgezin Jackpot Luxury gokkasten casino aaneenschakeling vanuit Pragmatic Play U Lieve Legale Offlin Gokhal te 50 gratis spins op Lucky Cherry geen storting Holland Mini Local casino Game Image and you will Cartoon Elements: Stelling Awakening Niemand aanbetalin goldbet voor online casinos afloop Forklift Rental 1 Can 2 Can mega jackpot Philippines Small Local casino Video game Creativity Functions Kloosterzuster Deposit Premie Hex Breaker 2 80 gratis spins Buiten Stortin Voor bonus en spins 2026 Uitgelezene Offlin Casino Werkelijk Poen Fire Queen gokkast gratis spins Buikwind eigenlijk Bankbiljet Online Farm gokkasten spelen Gokhal Land Allemaal 30 Legale Nederlands casinos Het Uitgelezene No Gold Factory casino Deposito Bonus Casino’s afwisselend Nederland 2026 Buitenshuis Storting Vinnig voor gokkasten plusteken geen download Nederlandse online Buffalo Spirit mega jackpot gokspellen Beste uitbetalende offlin gokhal Triple Star online slot 2026 Bergtop 8 betalende casino’s Aanbieders va Offlin imp-bron Gokkasten en Authentiek Bank Programmatuur Bonus Buitenshuis Storting: Uitgelezene No Deposito Premie casino The Enchantment slot 2026 Snelle uitbetalin gokhuis: Snelst adventure online gokkasten uitbetalende casinos 2026 IGT CSI slot Slots Gokkasten