WordPress.org

Make WordPress Core

Ticket #8994: 8994_mrss.diff

File 8994_mrss.diff, 6.3 KB (added by hailin, 9 years ago)

mrss feed

  • C:/xampp/htdocs/wordpress_trunk/wp-includes/feed-rss2.php

     
    1717        xmlns:dc="http://purl.org/dc/elements/1.1/"
    1818        xmlns:atom="http://www.w3.org/2005/Atom"
    1919        xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     20        xmlns:media="http://search.yahoo.com/mrss/"
    2021        <?php do_action('rss2_ns'); ?>
    2122>
    2223
     
    5455                <wfw:commentRss><?php echo get_post_comments_feed_link(); ?></wfw:commentRss>
    5556<?php rss_enclosure(); ?>
    5657        <?php do_action('rss2_item'); ?>
     58               
     59        <?php
     60                  $media_rss = apply_filters('media_rss', $media_rss = array());
     61                  media_print_rss( $media_rss );
     62        ?>
     63       
    5764        </item>
    5865        <?php endwhile; ?>
    5966</channel>
  • C:/xampp/htdocs/wordpress_trunk/wp-includes/feed.php

     
    558558
    559559        return $feed;
    560560}
     561
     562/**
     563 * search for post content for for img tags, and add them to media_rss array
     564 *
     565 * @package WordPress
     566 * @subpackage Feed
     567 * @since 2.8.0
     568 */
     569function wp_media_rss( $media_rss ){
     570       
     571        global $mrss_gallery_lookup;
     572       
     573        // Honor the feed settings. Don't include any media that isn't in the feed.
     574        if ( get_option( 'rss_use_excerpt' ) || !strlen( get_the_content() ) ) {
     575                $content = the_excerpt_rss();
     576        } else {
     577                // If any galleries are processed, we need to capture the attachment IDs.
     578                add_filter( 'wp_get_attachment_link', 'media_rss_gallery_lookup', 10, 5 );
     579                $content = apply_filters( 'the_content', get_the_content() );
     580                remove_filter( 'wp_get_attachment_link', 'media_rss_gallery_lookup', 10, 5 );
     581                $lookup = $mrss_gallery_lookup;
     582                unset( $mrss_gallery_lookup );
     583        }
     584
     585        // img tags
     586        $r = preg_match_all('/<img (.+?)>/', $content, $matches );
     587       
     588        if ( $r === false || $r === 0 )
     589                return $media_rss;
     590       
     591        $num = 0;
     592        foreach ( $matches[1] as $attrs ) {
     593                $item = $img = array();
     594                       
     595                // Construct $img array from <img> attributes
     596                foreach ( wp_kses_hair($attrs, array('http')) as $attr )
     597                        $img[$attr['name']] = $attr['value'];
     598                               
     599                if ( !isset($img['src']) )
     600                        continue;
     601                               
     602                $img['src'] = media_rss_url( $img['src'] );
     603                       
     604                // Skip emoticons
     605                if ( isset( $img['class'] ) && false !== strpos( $img['class'], 'wp-smiley' ) )
     606                        continue;
     607                       
     608                if ( false !== strpos( $img['src'], '&' ) )
     609                        continue;
     610                       
     611                $id = false;
     612                if ( isset( $lookup[$img['src']] ) ) {
     613                        $id = $lookup[$img['src']];
     614                } elseif ( isset( $img['class'] ) && preg_match( '/wp-image-(\d+)/', $img['class'], $match ) ) {
     615                        $id = $match[1];
     616                }
     617                       
     618                if ( $id ) {
     619                        // It's an attachment, so we will get the URLs, title, and description from functions
     620                        $attachment =& get_post( $id );
     621                        $src = wp_get_attachment_image_src( $id, 'full' );
     622                        if ( !empty( $src[0] ) )
     623                                $img['src'] = $src[0];
     624                                       
     625                        $thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' );
     626                        if ( !empty( $thumbnail[0] ) && $thumbnail[0] != $img['src'] )
     627                                $img['thumbnail'] = $thumbnail[0];
     628                                       
     629                        $title = get_the_title( $id );
     630                        if ( !empty( $title ) )
     631                                $img['title'] = trim($title);
     632                                       
     633                        $description = get_the_content( $id );
     634                        if ( !empty( $attachment->post_excerpt ) )
     635                                $img['description'] = trim($attachment->post_excerpt);
     636                }
     637                       
     638                // If this is the first image in the markup, make it the post thumbnail
     639                if ( ++$num == 1 ) {
     640                        if ( isset( $img['thumbnail'] ) )
     641                                $media_rss[]['thumbnail']['attr']['url'] = $img['thumbnail'];
     642                        else
     643                                $media_rss[]['thumbnail']['attr']['url'] = $img['src'];
     644                }
     645
     646                $item['content']['attr']['url'] = $img['src'];
     647                $item['content']['attr']['medium'] = 'image';
     648                if ( !empty($img['title']) ) {
     649                        $item['content']['children']['title']['attr']['type'] = 'plain';
     650                        $item['content']['children']['title']['children'][] = $img['title'];
     651                } elseif ( !empty($img['alt']) ) {
     652                        $item['content']['children']['title']['attr']['type'] = 'plain';
     653                        $item['content']['children']['title']['children'][] = $img['alt'];
     654                }
     655                if ( !empty($img['description']) ) {
     656                        $item['content']['children']['description']['attr']['type'] = 'html';
     657                        $item['content']['children']['description']['children'][] = $img['description'];
     658                        }
     659                if ( !empty($img['thumbnail']) )
     660                        $item['content']['children']['thumbnail']['attr']['url'] = $img['thumbnail'];
     661               
     662                $media_rss[] = $item;
     663        }
     664       
     665        return $media_rss;
     666}
     667add_filter( 'media_rss', 'wp_media_rss' );
     668
     669function media_rss_url( $url ) {
     670       
     671        if ( preg_match( '!^https?://!', $url ) )
     672                return $url;
     673        if ( $url{0} == '/' )
     674                return rtrim( get_bloginfo('home'), '/' ) . $url;
     675               
     676        return get_bloginfo('home') . $url;
     677}
     678
     679function media_rss_gallery_lookup( $link, $id, $size, $permalink, $icon ) {
     680        global $media_rss_gallery_lookup;
     681       
     682        preg_match( '/ src="(.*?)"/', $link, $matches );
     683        $media_rss_gallery_lookup[$matches[1]] = $id;
     684       
     685        return $link;
     686}
     687
     688/**
     689 * print media_rss array to generate mrss entries such as <media:content>
     690 *
     691 * @package WordPress
     692 * @subpackage Feed
     693 * @since 2.8.0
     694 */
     695function media_print_rss( $media_rss ) {
     696
     697        foreach( (array)$media_rss as $elements )
     698                media_print_element( $elements );
     699               
     700        echo "\n";
     701}
     702
     703function media_print_element( $elements, $indent = 2 ) {
     704       
     705        echo "\n";
     706        foreach ( (array)$elements as $name => $data ) {
     707               
     708                echo str_repeat("\t", $indent) . "<media:$name";
     709                if ( !empty($data['attr']) ) {
     710                        foreach ( $data['attr'] as $attr => $value )
     711                                echo " $attr=\"" . ent2ncr($value) . "\"";
     712                }
     713                if ( !empty($data['children']) ) {
     714                        $nl = false;
     715                        echo ">";
     716                        foreach ( $data['children'] as $_name => $_data ) {
     717                               
     718                                if ( is_int($_name) ) {
     719                                       
     720                                        if ( !is_array( $_data ) ){
     721                                                echo ent2ncr($_data);
     722                                        }else {
     723                                                //allow nested same level elements
     724                                                $nl = true;
     725                                                media_print_element( $_data, $indent + 1 );
     726                                        }
     727                                       
     728                                } else {
     729                                        $nl = true;
     730                                        media_print_element( array( $_name => $_data ), $indent + 1 );
     731                                }
     732                        }
     733                       
     734                        if ( $nl )
     735                                echo str_repeat("\t", $indent);
     736                               
     737                        echo "</media:$name>\n";
     738                } else {
     739                        echo " />\n";
     740                }
     741        }
     742}
     743
     744?>