From 4e0c89c236fe334a0cc15f3cb6a86014f596dd51 Mon Sep 17 00:00:00 2001 From: Andrew Nacin Date: Tue, 25 Sep 2012 08:39:26 +0000 Subject: [PATCH] Move WP_Embed into its own file. props ocean90. fixes #20533. git-svn-id: http://core.svn.wordpress.org/trunk@21999 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/class-wp-embed.php | 277 +++++++++++++++++++++++++++++++++ wp-includes/media.php | 277 --------------------------------- wp-settings.php | 1 + 3 files changed, 278 insertions(+), 277 deletions(-) create mode 100644 wp-includes/class-wp-embed.php diff --git a/wp-includes/class-wp-embed.php b/wp-includes/class-wp-embed.php new file mode 100644 index 0000000000..1455d5480d --- /dev/null +++ b/wp-includes/class-wp-embed.php @@ -0,0 +1,277 @@ + + +handlers[$priority][$id] = array( + 'regex' => $regex, + 'callback' => $callback, + ); + } + + /** + * Unregister a previously registered embed handler. Do not use this function directly, use {@link wp_embed_unregister_handler()} instead. + * + * @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 ) { + if ( isset($this->handlers[$priority][$id]) ) + unset($this->handlers[$priority][$id]); + } + + /** + * The {@link do_shortcode()} callback function. + * + * 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. + * @param string $url The URL attempting to be embedded. + * @return string The embed HTML on success, otherwise the original URL. + */ + function shortcode( $attr, $url = '' ) { + $post = get_post(); + + if ( empty( $url ) ) + return ''; + + $rawattr = $attr; + $attr = wp_parse_args( $attr, wp_embed_defaults() ); + + // kses converts & into & and we need to undo this + // See http://core.trac.wordpress.org/ticket/11311 + $url = str_replace( '&', '&', $url ); + + // Look for known internal handlers + ksort( $this->handlers ); + foreach ( $this->handlers as $priority => $handlers ) { + 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 ) ) + return apply_filters( 'embed_handler_html', $return, $url, $attr ); + } + } + } + + $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null; + if ( ! empty( $this->post_ID ) ) // Potentially set by WP_Embed::cache_oembed() + $post_ID = $this->post_ID; + + // Unknown URL format. Let oEmbed have a go. + 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 ); + + // Failures are cached + if ( '{{unknown}}' === $cache ) + return $this->maybe_make_link( $url ); + + if ( ! empty( $cache ) ) + return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); + } + + // 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 ); + + // If there was a result, return it + if ( $html ) + return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); + } + + // Still unknown + return $this->maybe_make_link( $url ); + } + + /** + * Delete all oEmbed caches. + * + * @param int $post_ID Post ID to delete the caches for. + */ + function delete_oembed_caches( $post_ID ) { + $post_metas = get_post_custom_keys( $post_ID ); + if ( empty($post_metas) ) + return; + + foreach( $post_metas as $post_meta_key ) { + if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) + delete_post_meta( $post_ID, $post_meta_key ); + } + } + + /** + * Triggers a caching of all oEmbed results. + * + * @param int $post_ID Post ID to do the caching for. + */ + 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' ) ) ) ) + return; + + // Trigger a caching + if ( !empty($post->post_content) ) { + $this->post_ID = $post->ID; + $this->usecache = false; + + $content = $this->run_shortcode( $post->post_content ); + $this->autoembed( $content ); + + $this->usecache = true; + } + } + + /** + * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding. + * + * @uses WP_Embed::autoembed_callback() + * + * @param string $content The content to be searched. + * @return string Potentially modified $content. + */ + 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 ) { + $oldval = $this->linkifunknown; + $this->linkifunknown = false; + $return = $this->shortcode( array(), $match[1] ); + $this->linkifunknown = $oldval; + + return "\n$return\n"; + } + + /** + * 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. + */ + function maybe_make_link( $url ) { + $output = ( $this->linkifunknown ) ? '' . esc_html($url) . '' : $url; + return apply_filters( 'embed_maybe_make_link', $output, $url ); + } +} +$GLOBALS['wp_embed'] = new WP_Embed(); diff --git a/wp-includes/media.php b/wp-includes/media.php index e10d19d468..eebb27b269 100644 --- a/wp-includes/media.php +++ b/wp-includes/media.php @@ -1063,283 +1063,6 @@ function wp_imagecreatetruecolor($width, $height) { return $img; } -/** - * API for easily embedding rich media such as videos and images into content. - * - * @package WordPress - * @subpackage Embed - * @since 2.9.0 - */ -class WP_Embed { - var $handlers = array(); - var $post_ID; - var $usecache = true; - var $linkifunknown = true; - - /** - * Constructor - */ - function __construct() { - // Hack to get the [embed] shortcode to run before wpautop() - add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 ); - - // Shortcode placeholder for strip_shortcodes() - add_shortcode( 'embed', '__return_false' ); - - // Attempts to embed all URLs in a post - add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); - - // After a post is saved, invalidate the oEmbed cache - add_action( 'save_post', 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' ) ); - } - - /** - * Process the [embed] shortcode. - * - * Since the [embed] shortcode needs to be run earlier than other shortcodes, - * this function removes all existing shortcodes, registers the [embed] shortcode, - * 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 ) { - global $shortcode_tags; - - // Back up current registered shortcodes and clear them all out - $orig_shortcode_tags = $shortcode_tags; - remove_all_shortcodes(); - - add_shortcode( 'embed', array( $this, 'shortcode' ) ); - - // Do the shortcode (only the [embed] one is registered) - $content = do_shortcode( $content ); - - // Put the original shortcodes back - $shortcode_tags = $orig_shortcode_tags; - - return $content; - } - - /** - * 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() { - $post = get_post(); - - if ( ! $post || empty($_GET['message']) || 1 != $_GET['message'] ) - return; - -?> - -handlers[$priority][$id] = array( - 'regex' => $regex, - 'callback' => $callback, - ); - } - - /** - * Unregister a previously registered embed handler. Do not use this function directly, use {@link wp_embed_unregister_handler()} instead. - * - * @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 ) { - if ( isset($this->handlers[$priority][$id]) ) - unset($this->handlers[$priority][$id]); - } - - /** - * The {@link do_shortcode()} callback function. - * - * 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. - * @param string $url The URL attempting to be embedded. - * @return string The embed HTML on success, otherwise the original URL. - */ - function shortcode( $attr, $url = '' ) { - $post = get_post(); - - if ( empty( $url ) ) - return ''; - - $rawattr = $attr; - $attr = wp_parse_args( $attr, wp_embed_defaults() ); - - // kses converts & into & and we need to undo this - // See http://core.trac.wordpress.org/ticket/11311 - $url = str_replace( '&', '&', $url ); - - // Look for known internal handlers - ksort( $this->handlers ); - foreach ( $this->handlers as $priority => $handlers ) { - 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 ) ) - return apply_filters( 'embed_handler_html', $return, $url, $attr ); - } - } - } - - $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null; - if ( ! empty( $this->post_ID ) ) // Potentially set by WP_Embed::cache_oembed() - $post_ID = $this->post_ID; - - // Unknown URL format. Let oEmbed have a go. - 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 ); - - // Failures are cached - if ( '{{unknown}}' === $cache ) - return $this->maybe_make_link( $url ); - - if ( ! empty( $cache ) ) - return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); - } - - // 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 ); - - // If there was a result, return it - if ( $html ) - return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); - } - - // Still unknown - return $this->maybe_make_link( $url ); - } - - /** - * Delete all oEmbed caches. - * - * @param int $post_ID Post ID to delete the caches for. - */ - function delete_oembed_caches( $post_ID ) { - $post_metas = get_post_custom_keys( $post_ID ); - if ( empty($post_metas) ) - return; - - foreach( $post_metas as $post_meta_key ) { - if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) - delete_post_meta( $post_ID, $post_meta_key ); - } - } - - /** - * Triggers a caching of all oEmbed results. - * - * @param int $post_ID Post ID to do the caching for. - */ - 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' ) ) ) ) - return; - - // Trigger a caching - if ( !empty($post->post_content) ) { - $this->post_ID = $post->ID; - $this->usecache = false; - - $content = $this->run_shortcode( $post->post_content ); - $this->autoembed( $content ); - - $this->usecache = true; - } - } - - /** - * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding. - * - * @uses WP_Embed::autoembed_callback() - * - * @param string $content The content to be searched. - * @return string Potentially modified $content. - */ - 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 ) { - $oldval = $this->linkifunknown; - $this->linkifunknown = false; - $return = $this->shortcode( array(), $match[1] ); - $this->linkifunknown = $oldval; - - return "\n$return\n"; - } - - /** - * 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. - */ - function maybe_make_link( $url ) { - $output = ( $this->linkifunknown ) ? '' . esc_html($url) . '' : $url; - return apply_filters( 'embed_maybe_make_link', $output, $url ); - } -} -$GLOBALS['wp_embed'] = new WP_Embed(); - /** * Register an embed handler. This function should probably only be used for sites that do not support oEmbed. * diff --git a/wp-settings.php b/wp-settings.php index 2db338b2e0..0b81e4d883 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -134,6 +134,7 @@ require( ABSPATH . WPINC . '/taxonomy.php' ); require( ABSPATH . WPINC . '/update.php' ); require( ABSPATH . WPINC . '/canonical.php' ); require( ABSPATH . WPINC . '/shortcodes.php' ); +require( ABSPATH . WPINC . '/class-wp-embed.php' ); require( ABSPATH . WPINC . '/media.php' ); require( ABSPATH . WPINC . '/http.php' ); require( ABSPATH . WPINC . '/class-http.php' );