WordPress.org

Make WordPress Core

Ticket #10337: 10337.9.patch

File 10337.9.patch, 5.8 KB (added by Viper007Bond, 4 years ago)

Add a bunch of new filters. Use one of them to remove new lines from Scribd embeds. Invalid oEmbed post meta cache without using JS.

  • wp-includes/class-oembed.php

     
    4747                        'http://revision3.com/*'                => array( 'http://revision3.com/api/oembed/',         false ), 
    4848                        'http://i*.photobucket.com/albums/*'    => array( 'http://photobucket.com/oembed',            false ), 
    4949                        'http://gi*.photobucket.com/groups/*'   => array( 'http://photobucket.com/oembed',            false ), 
    50                         '#http://(www\.)?scribd.com/.*#i'       => array( 'http://www.scribd.com/services/oembed',    true) 
     50                        '#http://(www\.)?scribd.com/.*#i'       => array( 'http://www.scribd.com/services/oembed',    true ), 
    5151                ) ); 
     52 
     53                // Fix Scribd embeds. They contain new lines in the middle of the HTML which breaks wpautop(). 
     54                add_filter( 'oembed_dataparse', array(&$this, 'strip_scribd_newlines'), 10, 3 ); 
    5255        } 
    5356 
    5457        /** 
     
    8790                if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) ) 
    8891                        return false; 
    8992 
    90                 return apply_filters( 'oembed_output', $this->data2html( $data, $url ), $url, $args ); 
     93                return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); 
    9194        } 
    9295 
    9396        /** 
     
    206209                                        return false; 
    207210 
    208211                                $title = ( !empty($data->title) ) ? $data->title : ''; 
    209                                 return '<img src="' . esc_attr( clean_url( $data->url ) ) . '" alt="' . esc_attr($title) . '" width="' . esc_attr($data->width) . '" height="' . esc_attr($data->height) . '" />'; 
     212                                $return = '<img src="' . esc_attr( clean_url( $data->url ) ) . '" alt="' . esc_attr($title) . '" width="' . esc_attr($data->width) . '" height="' . esc_attr($data->height) . '" />'; 
     213                                break; 
    210214 
    211215                        case 'video': 
    212216                        case 'rich': 
    213                                 return ( !empty($data->html) ) ? $data->html : false; 
     217                                $return = ( !empty($data->html) ) ? $data->html : false; 
     218                                break; 
    214219 
    215220                        case 'link': 
    216                                 return ( !empty($data->title) ) ? '<a href="' . clean_url($url) . '">' . esc_html($data->title) . '</a>' : false; 
     221                                $return = ( !empty($data->title) ) ? '<a href="' . clean_url($url) . '">' . esc_html($data->title) . '</a>' : false; 
     222                                break; 
     223 
     224                        default; 
     225                                $return = false; 
    217226                } 
    218227 
    219                 return false; 
     228                // You can use this filter to add support for custom data types or to filter the result 
     229                return apply_filters( 'oembed_dataparse', $return, $data, $url ); 
    220230        } 
     231 
     232        /** 
     233         * Strip new lines from the HTML if it's a Scribd embed. 
     234         * 
     235         * @param string $html Existing HTML. 
     236         * @param object $data Data object from WP_oEmbed::data2html() 
     237         * @param string $url The original URL passed to oEmbed. 
     238         * @return string Possibly modified $html 
     239         */ 
     240        function strip_scribd_newlines( $html, $data, $url ) { 
     241                if ( preg_match( '#http://(www\.)?scribd.com/.*#i', $url ) ) 
     242                        $html = str_replace( array( "\r\n", "\n" ), '', $html ); 
     243 
     244                return $html; 
     245        } 
    221246} 
    222247 
    223248/** 
  • wp-includes/media.php

     
    927927                if ( get_option('embed_autourls') ) 
    928928                        add_filter( 'the_content', array(&$this, 'autoembed'), 8 ); 
    929929 
     930                // After a post is saved, invalidate the oEmbed cache 
     931                add_action( 'save_post', array(&$this, 'delete_oembed_caches') ); 
     932 
    930933                // After a post is saved, cache oEmbed items via AJAX 
    931934                add_action( 'edit_form_advanced', array(&$this, 'maybe_run_ajax_cache') ); 
    932935        } 
     
    10481051                        foreach ( $handlers as $id => $handler ) { 
    10491052                                if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) { 
    10501053                                        if ( false !== $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ) ) 
    1051                                                 return $return; 
     1054                                                return apply_filters( 'embed_handler_html', $return, $url, $attr ); 
    10521055                                } 
    10531056                        } 
    10541057                } 
     
    10701073                                        return $this->maybe_make_link( $url ); 
    10711074 
    10721075                                if ( !empty($cache) ) 
    1073                                         return $cache; 
     1076                                        return apply_filters( 'embed_oembed_html', $cache, $url, $attr ); 
    10741077                        } 
    10751078 
    10761079                        // Use oEmbed to get the HTML 
     
    10861089 
    10871090                        // If there was a result, return it 
    10881091                        if ( $html ) 
    1089                                 return $html; 
     1092                                return apply_filters( 'embed_oembed_html', $html, $url, $attr ); 
    10901093                } 
    10911094 
    10921095                // Still unknown 
     
    10941097        } 
    10951098 
    10961099        /** 
     1100         * Delete all oEmbed caches. 
     1101         * 
     1102         * @param int $post_ID Post ID to delete the caches for. 
     1103         */ 
     1104        function delete_oembed_caches( $post_ID ) { 
     1105                $post_metas = get_post_custom_keys( $post_ID ); 
     1106                foreach( $post_metas as $post_meta_key ) { 
     1107                        if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) 
     1108                                delete_post_meta( $post_ID, $post_meta_key ); 
     1109                } 
     1110        } 
     1111 
     1112        /** 
    10971113         * Triggers a caching of all oEmbed results. 
    10981114         * 
    10991115         * @param int $post_ID Post ID to do the caching for. 
     
    11011117        function cache_oembed( $post_ID ) { 
    11021118                $post = get_post( $post_ID ); 
    11031119 
    1104                 // post_type check is incase of "save_post" usage 
    11051120                if ( empty($post->ID) || !in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', array( 'post', 'page' ) ) ) ) 
    11061121                        return; 
    11071122 
    1108                 // Dump existing caches 
    1109                 $post_metas = get_post_custom_keys( $post->ID ); 
    1110                 foreach( $post_metas as $post_meta_key ) { 
    1111                         if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) 
    1112                                 delete_post_meta( $post->ID, $post_meta_key ); 
    1113                 } 
    1114  
    11151123                // Trigger a caching 
    11161124                if ( !empty($post->post_content) ) { 
    11171125                        $this->post_ID = $post->ID; 
     
    11611169         * @return string Linked URL or the original URL. 
    11621170         */ 
    11631171        function maybe_make_link( $url ) { 
    1164                 return ( $this->linkifunknown ) ? '<a href="' . esc_attr($url) . '">' . esc_html($url) . '</a>' : $url; 
     1172                $output = ( $this->linkifunknown ) ? '<a href="' . esc_attr($url) . '">' . esc_html($url) . '</a>' : $url; 
     1173                return apply_filters( 'embed_maybe_make_link', $output, $url ); 
    11651174        } 
    11661175} 
    11671176$wp_embed = new WP_Embed();