X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/6c8f14c09105d0afa4c1574215c59b5021040e76..caeaf8dc94b5e3f75dc98ec92dc7b76049cdddb6:/wp-includes/class-wp-embed.php diff --git a/wp-includes/class-wp-embed.php b/wp-includes/class-wp-embed.php index 9404ba40..a10024a7 100644 --- a/wp-includes/class-wp-embed.php +++ b/wp-includes/class-wp-embed.php @@ -7,15 +7,21 @@ * @since 2.9.0 */ class WP_Embed { - var $handlers = array(); - var $post_ID; - var $usecache = true; - var $linkifunknown = true; + public $handlers = array(); + public $post_ID; + public $usecache = true; + public $linkifunknown = true; + + /** + * When an URL cannot be embedded, return false instead of returning a link + * or the URL. Bypasses the 'embed_maybe_make_link' filter. + */ + public $return_false_on_fail = false; /** * Constructor */ - function __construct() { + public function __construct() { // Hack to get the [embed] shortcode to run before wpautop() add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 ); @@ -25,9 +31,6 @@ class WP_Embed { // Attempts to embed all URLs in a post add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); - // When a post is saved, invalidate the oEmbed cache - add_action( 'pre_post_update', array( $this, 'delete_oembed_caches' ) ); - // After a post is saved, cache oEmbed items via AJAX add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) ); } @@ -40,14 +43,11 @@ class WP_Embed { * calls {@link do_shortcode()}, and then re-registers the old shortcodes. * * @uses $shortcode_tags - * @uses remove_all_shortcodes() - * @uses add_shortcode() - * @uses do_shortcode() * * @param string $content Content to parse * @return string Content with shortcode parsed */ - function run_shortcode( $content ) { + public function run_shortcode( $content ) { global $shortcode_tags; // Back up current registered shortcodes and clear them all out @@ -69,10 +69,10 @@ class WP_Embed { * If a post/page was saved, then output JavaScript to make * an AJAX request that will call WP_Embed::cache_oembed(). */ - function maybe_run_ajax_cache() { + public function maybe_run_ajax_cache() { $post = get_post(); - if ( ! $post || empty($_GET['message']) || 1 != $_GET['message'] ) + if ( ! $post || empty( $_GET['message'] ) ) return; ?> @@ -95,7 +95,7 @@ class WP_Embed { * @param callback $callback The callback function that will be called if the regex is matched. * @param int $priority Optional. Used to specify the order in which the registered handlers will be tested (default: 10). Lower numbers correspond with earlier testing, and handlers with the same priority are tested in the order in which they were added to the action. */ - function register_handler( $id, $regex, $callback, $priority = 10 ) { + public function register_handler( $id, $regex, $callback, $priority = 10 ) { $this->handlers[$priority][$id] = array( 'regex' => $regex, 'callback' => $callback, @@ -108,7 +108,7 @@ class WP_Embed { * @param string $id The handler ID that should be removed. * @param int $priority Optional. The priority of the handler to be removed (default: 10). */ - function unregister_handler( $id, $priority = 10 ) { + public function unregister_handler( $id, $priority = 10 ) { if ( isset($this->handlers[$priority][$id]) ) unset($this->handlers[$priority][$id]); } @@ -119,32 +119,30 @@ class WP_Embed { * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of the registered embed handlers. * If none of the regex matches and it's enabled, then the URL will be given to the {@link WP_oEmbed} class. * - * @uses wp_oembed_get() - * @uses wp_parse_args() - * @uses wp_embed_defaults() - * @uses WP_Embed::maybe_make_link() - * @uses get_option() - * @uses author_can() - * @uses wp_cache_get() - * @uses wp_cache_set() - * @uses get_post_meta() - * @uses update_post_meta() + * @param array $attr { + * Shortcode attributes. Optional. * - * @param array $attr Shortcode attributes. + * @type int $width Width of the embed in pixels. + * @type int $height Height of the embed in pixels. + * } * @param string $url The URL attempting to be embedded. * @return string The embed HTML on success, otherwise the original URL. */ - function shortcode( $attr, $url = '' ) { + public function shortcode( $attr, $url = '' ) { $post = get_post(); + if ( empty( $url ) && ! empty( $attr['src'] ) ) { + $url = $attr['src']; + } + if ( empty( $url ) ) return ''; $rawattr = $attr; - $attr = wp_parse_args( $attr, wp_embed_defaults() ); + $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) ); // kses converts & into & and we need to undo this - // See http://core.trac.wordpress.org/ticket/11311 + // See https://core.trac.wordpress.org/ticket/11311 $url = str_replace( '&', '&', $url ); // Look for known internal handlers @@ -153,6 +151,17 @@ class WP_Embed { foreach ( $handlers as $id => $handler ) { if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) { if ( false !== $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ) ) + /** + * Filter the returned embed handler. + * + * @since 2.9.0 + * + * @see WP_Embed::shortcode() + * + * @param mixed $return The shortcode callback function to call. + * @param string $url The attempted embed URL. + * @param array $attr An array of shortcode attributes. + */ return apply_filters( 'embed_handler_html', $return, $url, $attr ); } } @@ -166,29 +175,80 @@ class WP_Embed { if ( $post_ID ) { // Check for a cached result (stored in the post meta) - $cachekey = '_oembed_' . md5( $url . serialize( $attr ) ); - if ( $this->usecache ) { - $cache = get_post_meta( $post_ID, $cachekey, true ); + $key_suffix = md5( $url . serialize( $attr ) ); + $cachekey = '_oembed_' . $key_suffix; + $cachekey_time = '_oembed_time_' . $key_suffix; + + /** + * Filter the oEmbed TTL value (time to live). + * + * @since 4.0.0 + * + * @param int $time Time to live (in seconds). + * @param string $url The attempted embed URL. + * @param array $attr An array of shortcode attributes. + * @param int $post_ID Post ID. + */ + $ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_ID ); + + $cache = get_post_meta( $post_ID, $cachekey, true ); + $cache_time = get_post_meta( $post_ID, $cachekey_time, true ); + + if ( ! $cache_time ) { + $cache_time = 0; + } - // Failures are cached + $cached_recently = ( time() - $cache_time ) < $ttl; + + if ( $this->usecache || $cached_recently ) { + // Failures are cached. Serve one if we're using the cache. if ( '{{unknown}}' === $cache ) return $this->maybe_make_link( $url ); - if ( ! empty( $cache ) ) + if ( ! empty( $cache ) ) { + /** + * Filter the cached oEmbed HTML. + * + * @since 2.9.0 + * + * @see WP_Embed::shortcode() + * + * @param mixed $cache The cached HTML result, stored in post meta. + * @param string $url The attempted embed URL. + * @param array $attr An array of shortcode attributes. + * @param int $post_ID Post ID. + */ return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); + } } + /** + * Filter whether to inspect the given URL for discoverable link tags. + * + * @since 2.9.0 + * + * @see WP_oEmbed::discover() + * + * @param bool $enable Whether to enable `` tag discovery. Default false. + */ + $attr['discover'] = ( apply_filters( 'embed_oembed_discover', false ) && author_can( $post_ID, 'unfiltered_html' ) ); + // Use oEmbed to get the HTML - $attr['discover'] = ( apply_filters('embed_oembed_discover', false) && author_can( $post_ID, 'unfiltered_html' ) ); $html = wp_oembed_get( $url, $attr ); - // Cache the result - $cache = ( $html ) ? $html : '{{unknown}}'; - update_post_meta( $post_ID, $cachekey, $cache ); + // Maybe cache the result + if ( $html ) { + update_post_meta( $post_ID, $cachekey, $html ); + update_post_meta( $post_ID, $cachekey_time, time() ); + } elseif ( ! $cache ) { + update_post_meta( $post_ID, $cachekey, '{{unknown}}' ); + } // If there was a result, return it - if ( $html ) + if ( $html ) { + /** This filter is documented in wp-includes/class-wp-embed.php */ return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); + } } // Still unknown @@ -196,11 +256,11 @@ class WP_Embed { } /** - * Delete all oEmbed caches. + * Delete all oEmbed caches. Unused by core as of 4.0.0. * * @param int $post_ID Post ID to delete the caches for. */ - function delete_oembed_caches( $post_ID ) { + public function delete_oembed_caches( $post_ID ) { $post_metas = get_post_custom_keys( $post_ID ); if ( empty($post_metas) ) return; @@ -216,14 +276,23 @@ class WP_Embed { * * @param int $post_ID Post ID to do the caching for. */ - function cache_oembed( $post_ID ) { + public function cache_oembed( $post_ID ) { $post = get_post( $post_ID ); - if ( empty($post->ID) || !in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', array( 'post', 'page' ) ) ) ) + $post_types = get_post_types( array( 'show_ui' => true ) ); + /** + * Filter the array of post types to cache oEmbed results for. + * + * @since 2.9.0 + * + * @param array $post_types Array of post types to cache oEmbed results for. Defaults to post types with `show_ui` set to true. + */ + if ( empty( $post->ID ) || ! in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', $post_types ) ) ){ return; + } // Trigger a caching - if ( !empty($post->post_content) ) { + if ( ! empty( $post->post_content ) ) { $this->post_ID = $post->ID; $this->usecache = false; @@ -242,19 +311,17 @@ class WP_Embed { * @param string $content The content to be searched. * @return string Potentially modified $content. */ - function autoembed( $content ) { + public function autoembed( $content ) { return preg_replace_callback( '|^\s*(https?://[^\s"]+)\s*$|im', array( $this, 'autoembed_callback' ), $content ); } /** * Callback function for {@link WP_Embed::autoembed()}. * - * @uses WP_Embed::shortcode() - * * @param array $match A regex match array. * @return string The embed HTML on success, otherwise the original URL. */ - function autoembed_callback( $match ) { + public function autoembed_callback( $match ) { $oldval = $this->linkifunknown; $this->linkifunknown = false; $return = $this->shortcode( array(), $match[1] ); @@ -267,10 +334,23 @@ class WP_Embed { * Conditionally makes a hyperlink based on an internal class variable. * * @param string $url URL to potentially be linked. - * @return string Linked URL or the original URL. + * @return false|string Linked URL or the original URL. False if 'return_false_on_fail' is true. */ - function maybe_make_link( $url ) { - $output = ( $this->linkifunknown ) ? '' . esc_html($url) . '' : $url; + public function maybe_make_link( $url ) { + if ( $this->return_false_on_fail ) { + return false; + } + + $output = ( $this->linkifunknown ) ? '' . esc_html($url) . '' : $url; + + /** + * Filter the returned, maybe-linked embed URL. + * + * @since 2.9.0 + * + * @param string $output The linked or original URL. + * @param string $url The original URL. + */ return apply_filters( 'embed_maybe_make_link', $output, $url ); } }