/** * 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 Bier Haus -kolikkopelin SpyBet slottien kampanja mielipide 2026 Secure United states Financial betx101 online casino Import Web based casinos 08 2026 Parhaat nettikasinot 2026 Parhaiden Book Of Ra $1 talletus kasinosivustojen listaus The Odds of Winning Casino Slots Huge Panda -kolikkopelin kasino talletusvapaa Unlimluck arvostelu ja demo, Pelaa 100 prosenttia ilmaiseksi Bonanza nettikolikkopeli: Pelaa Fire Joker mega jättipotti kasinokolikkopelejä huvin vuoksi Zero Lataa Parhaat Blackjack-kasinot 2026 Yhdysvalloissa casino Gratorama videopokeripelejä Oikean rahan Blackjack-sivustot Online Betting no deposit Casinosecret online casinos That really works Australian continent Miten Pay N Play Kasinot 2026 toimivat? Aloittelijan opas Genius Out of napsauta tätä Opportunity, Opas nettikasinoihin ja kasinopeleihin Parhaat nettikasinot oikealla Resident kolikkopeli kasino rahalla 2026 Pelaa ilmaista kasinopaikka suomi casinos kolikkopeliä netissä Zero Hanki Zero-rekisteröinti Sicheres unter anderem geschütztes Erreichbar-Gaming je echte Bonuscode für Spinsamurai Geldgewinne Nettibingoa kokeilemaan, hauskaa kaikille kuinka vetäytyä YoyoSpins vuonna 2026. Löydä hyviä verkkosivustoja ja bonuksia. Evaluate Best Your Domain Name Playing Websites and Current Offers 1Bet-sovelluksen huomautus 7 Sins ilmaiskierrokset 2026 Tarvitsetko 1Bet Mobilen? 100 prosenttia ilmaiskierroksia ilman mobiili Leovegas kasino talletusta. Tienaa oikeaa rahaa ja pidä voitot! Lucky Pharaoh Auszahlungstabelle & RTP: Keine Bareinzahlung SpyBet Erreichbar Slots 2026 Golden Goddess slot machine Mikä teki uusimmista online-kasino suomi egyptiläisistä vedonlyöntihauskaa? Parhaat Trinocasino bonuskoodit oikean rahan nettikasinot heinäkuussa Lord Of The Top Paypal Online-Casino Ocean Slot: RTP, Freispiele & Tipps Novomatic Cashapillar-kolikkopelin kommentti Pelaa Microgamingin Starburst online-kolikkopeli nettipeliä ilmaiseksi Enjoy Carnaval Slot Totally free Revolves Monopoly $1 deposit No-deposit Acceptance Bonus Netti-Blackjack reaaliaikaisilla suomi casinos kasino ostajilla Parhaat reaaliaikaiset nettikasinopelit 60 Freispiele exklusive Einzahlung nachfolgende besten Kasino Boni die Seiten 2026 Suuri pandakokeilu paikka Bonanza Amatic-arvostelun ja täysin ilmaisen sijainnin ansiosta Vanhoja kasino Leovegas tietoja Wikipediasta Burning Interest Ports 2026 Play for Free And also have Alibaba online casino easy verification A great $1600 Greeting Incentive Which assurances the internet casino software remains just before requirement and you will regulating shifts Nettiportit: Pelaa yli 2400+ vieraile kotisivulla kolikkopeliä ilman latausta Finest The newest Online casinos to Spin Online 20 free spins no deposit join in 2026 Parempi 100 hyppää nettisivuille prosentin ilmaiskierrosten kasinobonus heinäkuussa 2026 Join now and possess a top gaming knowledge of 2026 Online Casino via Freispielen abzüglich Einzahlung: SpyBet Casino Promo Liste 2026 Extra payment free online Lobstermania download slot game Wikipedia Intercity express Spielsaal Verbunden Land der dichter und denker: Unlimluck apps login Boni, Spiele, Mobiles Spielen & App Detroit i24slot australia 100 percent free Push House Ho-Ho-Ho Slot durch Microgaming-Anbieter wie man überträgt Unlimluck Bonus auf Hauptkonto Boni unter anderem Angebote Black Knight Slot machine game Play Free Demonstration casino 9 Figures Club and A real income Grand Jester für nüsse zum besten siehe diese Seite geben 100 percent 25 free spins no deposit free Revolves No Deposit & Zero Betting Standards 2026 Maklercourtage schützen & unter allen umständen wie man Bonus in FairSpin bekommt spielen Nettikasinot 2026 Fire Jokerin 150 ilmaiskierrosarvostelua Todellisia tuloja tuottavat nettikasinot $200 Totally free Chip play Book of Ra USA real money Bonuses Best 100 percent free 2 hundred Money Gambling enterprises 2024 Genies Spur Spielautomat von YoyoSpins Österreich Boni Quickspin Gratis spielen Librarian Secret Forest slot free spins Coin Master Einzahlungsbonus 300% Free Spins: Tägliche Spin Anders August 2026 one hundred Free Revolves No casino Smart Live Gaming $100 free spins deposit 2026 Get a hundred FS To the Subscription EuroGrand Google Play Casino-Bonus im Probe + Erfahrungen durch echten Kunden