WordPress.org

Make WordPress Core

Ticket #14759: 14759_2.patch

File 14759_2.patch, 6.3 KB (added by leewillis77, 13 months ago)

Revised patch for discussion

  • wp-includes/media.php

     
    10241024 * 
    10251025 * @param string $url The URL that should be embedded. 
    10261026 * @param array $args Additional arguments and parameters. 
     1027 * @param bool $use_cache Use a cached value if available. 
     1028 * @param int $post_id The post ID we're embedding into, or null 
    10271029 * @return bool|string False on failure or the embed HTML on success. 
    10281030 */ 
    1029 function wp_oembed_get( $url, $args = '' ) { 
     1031function wp_oembed_get( $url, $args = '', $use_cache = true, $post_id = null ) { 
    10301032        require_once( ABSPATH . WPINC . '/class-oembed.php' ); 
    10311033        $oembed = _wp_oembed_get_object(); 
    1032         return $oembed->get_html( $url, $args ); 
     1034        return $oembed->get_html( $url, $args, $use_cache, $post_id ); 
    10331035} 
    10341036 
    10351037/** 
  • wp-includes/class-oembed.php

     
    6666         * 
    6767         * @param string $url The URL to the content that should be attempted to be embedded. 
    6868         * @param array $args Optional arguments. Usually passed from a shortcode. 
     69     * @param bool $use_cache Use a cached value if available. 
     70     * @param int $post_ID The post ID we're embedding into - or null 
    6971         * @return bool|string False on failure, otherwise the UNSANITIZED (and potentially unsafe) HTML that should be used to embed. 
    7072         */ 
    71         function get_html( $url, $args = '' ) { 
     73        function get_html( $url, $args = '', $use_cache = true, $post_ID = null ) { 
     74 
     75        // Check for a cached result (stored in the post meta) 
     76        $cachekey = '_oembed_' . md5( $url . serialize( $attr ) ); 
     77        $expirykey = '_oemexp_' . md5( $url . serialize( $attr ) ); 
     78 
     79        if ( $use_cache && ! empty( $post_ID ) ) { 
     80 
     81            $cache = get_post_meta( $post_ID, $cachekey, true ); 
     82            $cache_expiry = get_post_meta( $post_ID, $expirykey, true ); 
     83 
     84            if ( ! empty( $cache ) && ! empty( $cache_expiry ) && $cache_expiry > time() ) 
     85                return $cache; 
     86 
     87        } 
     88 
    7289                $provider = false; 
    7390 
    7491                if ( !isset($args['discover']) ) 
     
    92109                if ( !$provider && $args['discover'] ) 
    93110                        $provider = $this->discover( $url ); 
    94111 
    95                 if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) ) 
    96                         return false; 
     112                if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) ) { 
    97113 
    98                 return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); 
     114            // Cache failures. 
     115            $return = '{{unknown}}'; 
     116            $expiry_time = time() + 12 * HOUR_IN_SECONDS ; 
     117 
     118        } else { 
     119 
     120            $return = apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); 
     121            $cache_age = ! empty ( $data->cache_age ) ? (int) $data->cache_age : 30 * DAY_IN_SECONDS; 
     122            $expiry_time = time() + $cache_age; 
     123        } 
     124 
     125        if ( ! empty( $post_ID ) ) { 
     126            update_post_meta( $post_ID, $cachekey, $return); 
     127            update_post_meta( $post_ID, $expirykey, $expiry_time); 
     128        } 
     129 
     130                return $return; 
    99131        } 
    100132 
    101133        /** 
  • wp-includes/class-wp-embed.php

     
    2525                // Attempts to embed all URLs in a post 
    2626                add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); 
    2727 
    28                 // When a post is saved, invalidate the oEmbed cache 
    29                 add_action( 'pre_post_update', array( $this, 'delete_oembed_caches' ) ); 
     28        // When a post is saved, invalidate the oEmbed cache 
     29        add_action( 'pre_post_update', array( $this, 'delete_oembed_caches' ) ); 
    3030 
    3131                // After a post is saved, cache oEmbed items via AJAX 
    3232                add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) ); 
     
    165165                // Unknown URL format. Let oEmbed have a go. 
    166166                if ( $post_ID ) { 
    167167 
    168                         // Check for a cached result (stored in the post meta) 
    169                         $cachekey = '_oembed_' . md5( $url . serialize( $attr ) ); 
    170                         if ( $this->usecache ) { 
    171                                 $cache = get_post_meta( $post_ID, $cachekey, true ); 
    172  
    173                                 // Failures are cached 
    174                                 if ( '{{unknown}}' === $cache ) 
    175                                         return $this->maybe_make_link( $url ); 
    176  
    177                                 if ( ! empty( $cache ) ) 
    178                                         return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); 
    179                         } 
    180  
    181168                        // Use oEmbed to get the HTML 
    182169                        $attr['discover'] = ( apply_filters('embed_oembed_discover', false) && author_can( $post_ID, 'unfiltered_html' ) ); 
    183                         $html = wp_oembed_get( $url, $attr ); 
     170                        $html = wp_oembed_get( $url, $attr, $this->usecache, $post_ID ); 
    184171 
    185                         // Cache the result 
    186                         $cache = ( $html ) ? $html : '{{unknown}}'; 
    187                         update_post_meta( $post_ID, $cachekey, $cache ); 
     172                        // If there was a result, return it 
     173                        if ( $html ) { 
     174                // Failures 
     175                if ( '{{unknown}}' === $html ) 
     176                    return $this->maybe_make_link( $url ); 
    188177 
    189                         // If there was a result, return it 
    190                         if ( $html ) 
    191178                                return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); 
     179            } 
    192180                } 
    193181 
    194182                // Still unknown 
     
    196184        } 
    197185 
    198186        /** 
    199         * Delete all oEmbed caches. 
    200         * 
    201         * @param int $post_ID Post ID to delete the caches for. 
    202         */ 
    203         function delete_oembed_caches( $post_ID ) { 
    204                 $post_metas = get_post_custom_keys( $post_ID ); 
    205                 if ( empty($post_metas) ) 
    206                         return; 
     187    * Delete all oEmbed caches. 
     188    * 
     189    * @param int $post_ID Post ID to delete the caches for. 
     190    */ 
     191    function delete_oembed_caches( $post_ID ) { 
     192        $post_metas = get_post_custom_keys( $post_ID ); 
     193        if ( empty($post_metas) ) 
     194            return; 
    207195 
    208                 foreach( $post_metas as $post_meta_key ) { 
    209                         if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) 
    210                                 delete_post_meta( $post_ID, $post_meta_key ); 
    211                 } 
    212         } 
     196        foreach( $post_metas as $post_meta_key ) { 
     197            if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) || 
     198                 '_oemexp_' == substr( $post_meta_key, 0, 9 ) ) 
     199                delete_post_meta( $post_ID, $post_meta_key ); 
     200        } 
     201    } 
    213202 
    214         /** 
     203    /** 
     204     * 
    215205         * Triggers a caching of all oEmbed results. 
    216206         * 
    217207         * @param int $post_ID Post ID to do the caching for.