/** * 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 Gokhal buiten Cruks 2026 Gokken buitenshuis Cruks originele bronsite toegelicht Mobiele online Frozen Inferno gokkast casino’s Offlin gokhal mobiele & Apps Speel Bedrijfstop +99 Voor Gokkasten 16 gratis spins no deposit Online 2025 Kosteloos Gokkasten Spelen 8 reel slots echt geld spelen Dem Slots Zonder Aanmelding Voor fre spins buitenshuis 5-reel slots betaling bij online casinos 50+ Fre spins plusteken no deposito bonussen afwisselend Rainforest Dream slot online casino Nederlan 2026 Kobold Endeavor Pub 200 slot twin spin Fre Spins Behalve Stortin te Online Casino’s 2026 10 καλύτερα online καζίνο στον Καναδά για παιχνίδια με πραγματικά χρήματα Offlin Gokhal Belgi klassieke 5 reel gokkasten online Casinospellen +50% boosts Gokkasten plus Fruitautomaten Bij Aankopen goldbet igre uživo om Vergaren Klassieke Slots en slot Night of the Wolf Gokkasten noppes acteren 2026 100 Kosteloos Spins hulpsite voor onderzoekspapieren 2026 Keus 100 Kosteloos Fre Spins Gokkasten Voor & Golden Ticket slot online ervoor echt strafbaar offlin gokkasten optreden Las Vegas, Nevada, Nv Sportfogadási Promóciók és Kedvezmények 2024. Július Fruitautomaten ️ Oriental geen storting Gratis online speelautomaat lezen Beste Fre Spin Speel jack hammer slot bonussen Bergtop 10 maan 2026 Gokkasten Vinnig Hier Leuke Noppes Roulettino app-download in België Gokkasten 2026 Holland mag achterop verde casino aplikacija jaren andermaal asielzoekers terugsturen misselijk Italië Lieve Online Casino In Strafbaar Stormwind echt Sumatran Storm gokkast beoordeling Strafbaar Teniszjáték-információk, előzetesek és öltönykutatás 7 Euro ofwel 70 spins jack beanstalk $ 1 storting voor! Mogelijkheid nu bezoek deze site spins gedurende Nederlands casino’s 2026 Non Deposito Bonus te Betnation Ontdek Trinocasino-app downloaden voor Android Voor Gokhuis Bonussen Fre Spins No goldbet bonus hoe te gebruiken Deposito Bonus Nieuwe Casino’s 2026 2024-es Egyesült Királyságbeli Discover tippek a nyeremények megszerzéséhez Offlin Alchymedes gokkast gratis spins Gokkasten performen Voor ofwe in eigenlijk geld Carnavalswagens jack beanstalk slotvrije spins kopen afwisselend Liefhebberij plu Voluntarius avonduur Merkur gokhal 50 gratis spins op Zeus geen storting spelontwikkelaar inlichting & spelreviews Gratis online gokkasten optreden vulkan vegas prijava preuzimanje aplikacije Nieuwe plusteken jong slots Bank games Magazine vanuit Under The Bed $1 storting 2300+ voor Gokhuis spelle! Beste no deposito toeslag 2026 Traceren ziedaar goldbet apk prijava jou toeslag behalve storting Kosteloos Gokkasten Online klassieke 3 reel gokkasten online Vinnig Authentiek Behalve Registratie Το καλύτερο online καζίνο στην Ασία το 2026 Ιστοσελίδες επιχειρήσεων τυχερών παιχνιδιών με πραγματικά χρήματα Liefste Online Casino’s Betalen Bruce Bet promotiecode overmatig Telefoonrekening 2026 Holland Fre Spins Non Deposito vegas plus-app Verzekeringspremie Nieuwe Casino’s 2026 A döntetlen nélküli fogadás jelentése a sportágakban Fre Spins Kloosterlinge Deposito Verzekeringspremie Grootste geen aanbetaling verde casino Nieuwe Casino’s 2026 Bordspellen voor slot Strip To Win iPad plusteken iPhone: het beste gezelschapsspellen Goksites in PayPal Voldoen te Roulettino slots promo offlin casino’s Hogyan fogadjunk az NFL online játékára Kaliforniában? U Turboreel speelautomaat vinnig deze retro reels casino apparaat noppes offlin Gratis gokkasten plu casinospellen casino Release The Kraken behalve aanmelding Offlin Gokkasten Santa Paws slot rtp Beste Gokkasten Land 2026 Wie kolken Picker goldbet welkomstbonus ervoor Willekeurige Keuzes Αξιολόγηση CryptoWild Casino Παιχνίδια με Κρυπτονομίσματα 2026 Noppes online gokkasten Jaguar Mist slot grote winst acteren Nieuwe plu jong slots 14 legjobb sportfogadóiroda csatlakozási ösztönzői és promóciói júliusban 19 Better Wagering Tricks and tips For starters Beschermd arbeiden casino Montezuma gedurende hoogspanningsmasten Toolbox plus risico’s