WordPress.org

Make WordPress Core

Ticket #9510: 9510-v4.patch

File 9510-v4.patch, 48.6 KB (added by peaceablewhale, 6 years ago)
  • feed-atom.php

     
    44 * 
    55 * @package WordPress 
    66 */ 
    7  
    8 header('Content-Type: ' . feed_content_type('atom') . '; charset=' . get_option('blog_charset'), true); 
     7  
     8$feed_type='atom'; 
     9header('Content-Type: ' . feed_content_type($feed_type) . '; charset=' . get_option('blog_charset'), true); 
    910$more = 1; 
    1011 
    1112echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?> 
    12 <feed 
    13   xmlns="http://www.w3.org/2005/Atom" 
    14   xmlns:thr="http://purl.org/syndication/thread/1.0" 
    15   xml:lang="<?php echo get_option('rss_language'); ?>" 
    16   xml:base="<?php bloginfo_rss('home') ?>/wp-atom.php" 
    17   <?php do_action('atom_ns'); ?> 
    18  > 
    19         <title type="text"><?php bloginfo_rss('name'); wp_title_rss(); ?></title> 
    20         <subtitle type="text"><?php bloginfo_rss("description") ?></subtitle> 
    2113 
    22         <updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT'), false); ?></updated> 
    23         <?php the_generator( 'atom' ); ?> 
    24  
    25         <link rel="alternate" type="text/html" href="<?php bloginfo_rss('home') ?>" /> 
    26         <id><?php bloginfo('atom_url'); ?></id> 
    27         <link rel="self" type="application/atom+xml" href="<?php self_link(); ?>" /> 
    28  
    29         <?php do_action('atom_head'); ?> 
    30         <?php while (have_posts()) : the_post(); ?> 
    31         <entry> 
    32                 <author> 
    33                         <name><?php the_author() ?></name> 
    34                         <?php $author_url = get_the_author_meta('url'); if ( !empty($author_url) ) : ?> 
    35                         <uri><?php the_author_meta('url')?></uri> 
    36                         <?php endif; ?> 
    37                 </author> 
    38                 <title type="<?php html_type_rss(); ?>"><![CDATA[<?php the_title_rss() ?>]]></title> 
    39                 <link rel="alternate" type="text/html" href="<?php the_permalink_rss() ?>" /> 
    40                 <id><?php the_guid(); ?></id> 
    41                 <updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></updated> 
    42                 <published><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></published> 
    43                 <?php the_category_rss('atom') ?> 
    44                 <summary type="<?php html_type_rss(); ?>"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary> 
    45 <?php if ( !get_option('rss_use_excerpt') ) : ?> 
    46                 <content type="<?php html_type_rss(); ?>" xml:base="<?php the_permalink_rss() ?>"><![CDATA[<?php the_content_feed('atom') ?>]]></content> 
    47 <?php endif; ?> 
    48 <?php atom_enclosure(); ?> 
    49 <?php do_action('atom_entry'); ?> 
    50                 <link rel="replies" type="text/html" href="<?php the_permalink_rss() ?>#comments" thr:count="<?php echo get_comments_number()?>"/> 
    51                 <link rel="replies" type="application/atom+xml" href="<?php echo get_post_comments_feed_link(0,'atom') ?>" thr:count="<?php echo get_comments_number()?>"/> 
    52                 <thr:total><?php echo get_comments_number()?></thr:total> 
    53         </entry> 
    54         <?php endwhile ; ?> 
    55 </feed> 
     14<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xml:lang="<?php echo get_option('rss_language'); ?>" xml:base="<?php bloginfo_rss('url') ?>/wp-atom.php" <?php do_action('atom_ns'); ?>> 
     15<?php 
     16        feed_headers($feed_type); 
     17        while (have_posts()) { 
     18                the_post(); 
     19                feed_entry($feed_type, 'entry', apply_filters('feed_entry_element_preceding', "\t"), apply_filters('feed_entry_element_trailing', "\n")); 
     20        } 
     21?> 
     22</feed> 
     23 No newline at end of file 
  • feed-rss2.php

     
    55 * @package WordPress 
    66 */ 
    77 
     8$feed_type='rss2'; 
    89header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true); 
    910$more = 1; 
    1011 
    1112echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?> 
    1213 
    13 <rss version="2.0" 
    14         xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    15         xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    16         xmlns:dc="http://purl.org/dc/elements/1.1/" 
    17         xmlns:atom="http://www.w3.org/2005/Atom" 
    18         xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    19         xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
    20         <?php do_action('rss2_ns'); ?> 
    21 > 
    22  
     14<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" <?php do_action('rss2_ns'); ?>> 
    2315<channel> 
    24         <title><?php bloginfo_rss('name'); wp_title_rss(); ?></title> 
    25         <atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" /> 
    26         <link><?php bloginfo_rss('url') ?></link> 
    27         <description><?php bloginfo_rss("description") ?></description> 
    28         <lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate> 
    29         <?php the_generator( 'rss2' ); ?> 
    3016        <language><?php echo get_option('rss_language'); ?></language> 
    31         <sy:updatePeriod><?php echo apply_filters( 'rss_update_period', 'hourly' ); ?></sy:updatePeriod> 
    32         <sy:updateFrequency><?php echo apply_filters( 'rss_update_frequency', '1' ); ?></sy:updateFrequency> 
    33         <?php do_action('rss2_head'); ?> 
    34         <?php while( have_posts()) : the_post(); ?> 
    35         <item> 
    36                 <title><?php the_title_rss() ?></title> 
    37                 <link><?php the_permalink_rss() ?></link> 
    38                 <comments><?php comments_link(); ?></comments> 
    39                 <pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate> 
    40                 <dc:creator><?php the_author() ?></dc:creator> 
    41                 <?php the_category_rss() ?> 
    42  
    43                 <guid isPermaLink="false"><?php the_guid(); ?></guid> 
    44 <?php if (get_option('rss_use_excerpt')) : ?> 
    45                 <description><![CDATA[<?php the_excerpt_rss() ?>]]></description> 
    46 <?php else : ?> 
    47                 <description><![CDATA[<?php the_excerpt_rss() ?>]]></description> 
    48         <?php if ( strlen( $post->post_content ) > 0 ) : ?> 
    49                 <content:encoded><![CDATA[<?php the_content_feed('rss2') ?>]]></content:encoded> 
    50         <?php else : ?> 
    51                 <content:encoded><![CDATA[<?php the_excerpt_rss() ?>]]></content:encoded> 
    52         <?php endif; ?> 
    53 <?php endif; ?> 
    54                 <wfw:commentRss><?php echo get_post_comments_feed_link(null, 'rss2'); ?></wfw:commentRss> 
    55                 <slash:comments><?php echo get_comments_number(); ?></slash:comments> 
    56 <?php rss_enclosure(); ?> 
    57         <?php do_action('rss2_item'); ?> 
    58         </item> 
    59         <?php endwhile; ?> 
     17<?php 
     18        feed_headers($feed_type); 
     19        while (have_posts()) { 
     20                the_post(); 
     21                feed_entry($feed_type, 'item', apply_filters('feed_entry_element_preceding', "\t"), apply_filters('feed_entry_element_trailing', "\n")); 
     22        } 
     23?> 
    6024</channel> 
    61 </rss> 
     25</rss> 
     26 No newline at end of file 
  • feed.php

     
    183183 * @package WordPress 
    184184 * @subpackage Feed 
    185185 * @since 2.3.0 
    186  * @uses apply_filters() Call 'the_permalink_rss' on the post permalink 
     186 * @return get_the_permalink_rss() 
    187187 */ 
    188188function the_permalink_rss() { 
    189         echo apply_filters('the_permalink_rss', get_permalink()); 
     189        echo get_the_permalink_rss(); 
    190190} 
    191191 
    192192/** 
     193 * Retrieve the permalink to the post for use in feeds. 
     194 * 
     195 * @since 2.9 
     196 * @uses apply_filters() Call 'the_permalink_rss' on the post permalink 
     197 */ 
     198function get_the_permalink_rss() { 
     199        return apply_filters('the_permalink_rss', get_permalink()); 
     200} 
     201 
     202/** 
    193203 * Display the feed GUID for the current comment. 
    194204 * 
    195205 * @package WordPress 
     
    276286 * 
    277287 * All of the categories for the current post in the feed loop, will be 
    278288 * retrieved and have feed markup added, so that they can easily be added to the 
    279  * RSS2, Atom, or RSS1 and RSS0.91 RDF feeds. 
     289 * feeds. 
    280290 * 
    281291 * @package WordPress 
    282292 * @subpackage Feed 
    283293 * @since 2.1.0 
    284294 * @uses apply_filters() 
     295 * @uses feed_entry_category() 
    285296 * 
    286297 * @param string $type Optional, default is 'rss'. Either 'rss', 'atom', or 'rdf'. 
    287298 * @return string All of the post categories for displaying in the feed. 
    288299 */ 
    289300function get_the_category_rss($type = 'rss') { 
    290         $categories = get_the_category(); 
    291         $tags = get_the_tags(); 
     301        $categories = (array)get_the_category(); 
     302        $tags = (array)get_the_tags(); 
     303        $base_scheme = untrailingslashit(get_bloginfo_rss('url')); 
     304        $category_scheme = "$base_scheme/category/"; 
     305        $tag_scheme = "$base_scheme/tag/"; 
    292306        $the_list = ''; 
    293         $cat_names = array(); 
    294  
    295         $filter = 'rss'; 
    296         if ( 'atom' == $type ) 
    297                 $filter = 'raw'; 
    298  
    299         if ( !empty($categories) ) foreach ( (array) $categories as $category ) { 
    300                 $cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter); 
     307        foreach ($categories as $category) { 
     308                if (!empty($category->slug)) { 
     309                        $the_list .= feed_entry_category($type, $category->name, $category->slug, $category_scheme); 
     310                } 
    301311        } 
    302  
    303         if ( !empty($tags) ) foreach ( (array) $tags as $tag ) { 
    304                 $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter); 
     312        foreach ($tags as $tag) { 
     313                if (!empty($tag->slug)) { 
     314                        $the_list .= feed_entry_category($type, $tag->name, $tag->slug, $tag_scheme); 
     315                } 
    305316        } 
    306  
    307         $cat_names = array_unique($cat_names); 
    308  
    309         foreach ( $cat_names as $cat_name ) { 
    310                 if ( 'rdf' == $type ) 
    311                         $the_list .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n"; 
    312                 elseif ( 'atom' == $type ) 
    313                         $the_list .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) ); 
    314                 else 
    315                         $the_list .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n"; 
    316         } 
    317  
    318317        return apply_filters('the_category_rss', $the_list, $type); 
    319318} 
    320319 
     
    531530 
    532531        return $feed; 
    533532} 
     533 
     534/** 
     535 * Feed ID Template 
     536 * 
     537 * @since 2.9 
     538 * 
     539 * @param string $feed_type : Feed Type 
     540 * @param string $id : Feed ID 
     541 * @param string $preceding Optional : Whitespaces before the element 
     542 * @param string $trailing Optional : Whitespaces after the element 
     543 * @uses apply_filters() Calls 'feed_id' 
     544 * @return XML string 
     545 */ 
     546function feed_id($feed_type, $id, $preceding = "\t", $trailing = "\n") { 
     547        $prefix = ($feed_type == 'atom' ? '' : 'atom:'); 
     548        return apply_filters('feed_id', "$preceding<{$prefix}id>$id</{$prefix}id>$trailing", $feed_type, $id, $preceding, $trailing); 
     549} 
     550 
     551/** 
     552 * Feed Title Template 
     553 * 
     554 * @since 2.9 
     555 * 
     556 * @param string $feed_type : Feed Type 
     557 * @param string $text : Text of the feed title 
     558 * @param string $preceding Optional : Whitespaces before the element 
     559 * @param string $trailing Optional : Whitespaces after the element 
     560 * @uses apply_filters() Calls 'feed_title' 
     561 * @return XML string 
     562 */ 
     563function feed_title($feed_type, $text, $preceding = "\t", $trailing = "\n") { 
     564        return apply_filters('feed_title', "$preceding<title>$text</title>$trailing", $feed_type, $text, $preceding, $trailing); 
     565} 
     566 
     567/** 
     568 * Feed Subtitle Template 
     569 * 
     570 * @since 2.9 
     571 * 
     572 * @param string $feed_type : Feed Type 
     573 * @param string $text : Text of the feed subtitle/description 
     574 * @param string $preceding Optional : Whitespaces before the element 
     575 * @param string $trailing Optional : Whitespaces after the element 
     576 * @uses apply_filters() Calls 'feed_subtitle' 
     577 * @return XML string 
     578 */ 
     579function feed_subtitle($feed_type, $text, $preceding = "\t", $trailing = "\n") { 
     580        if ($feed_type == 'atom' && !empty($text)) { 
     581                $subtitle = "$preceding<subtitle>$text</subtitle>$trailing"; 
     582        } 
     583        elseif ($feed_type == 'rss2') { 
     584                if (empty($text)) { 
     585                        $subtitle = "$preceding<description />$trailing"; 
     586                } 
     587                else { 
     588                        $subtitle = "$preceding<description>$text</description>$trailing"; 
     589                } 
     590        } 
     591        else { 
     592                $subtitle = ''; 
     593        } 
     594        return apply_filters('feed_subtitle', $subtitle, $feed_type, $text, $preceding, $trailing); 
     595} 
     596 
     597/** 
     598 * Feed Self Link Template 
     599 * 
     600 * @since 2.9 
     601 * 
     602 * @param string $feed_type : Feed Type 
     603 * @param string $href : The self link of the feed 
     604 * @param string $preceding Optional : Whitespaces before the element 
     605 * @param string $trailing Optional : Whitespaces after the element 
     606 * @uses apply_filters() Calls 'feed_self_link' 
     607 * @return XML string 
     608 */ 
     609function feed_self_link($feed_type, $href, $preceding = "\t", $trailing = "\n") { 
     610        $prefix = ($feed_type == 'atom' ? '' : 'atom:'); 
     611        $self_link = "$preceding<{$prefix}link rel=\"self\" type=\"" . feed_content_type($feed_type) . "\" href=\"$href\" />$trailing"; 
     612        return apply_filters('feed_self_link', $self_link, $feed_type, $href, $preceding, $trailing); 
     613} 
     614 
     615/** 
     616 * Feed Link Template 
     617 * 
     618 * @since 2.9 
     619 * 
     620 * @param string $feed_type : Feed Type 
     621 * @param bool $is_entry : if the link is entry link 
     622 * @param string $href : The link of the feed 
     623 * @param string $href_type : The content type of the link 
     624 * @param string $preceding Optional : Whitespaces before the element 
     625 * @param string $trailing Optional : Whitespaces after the element 
     626 * @uses apply_filters() Calls 'feed_link' or 'feed_entry_link' depending on $is_entry 
     627 * @return XML string 
     628 */ 
     629function feed_link($feed_type, $is_entry, $href, $href_type = null, $preceding = "\t", $trailing = "\n") { 
     630        switch ($feed_type) { 
     631                case 'atom': 
     632                        $link = '<link rel="alternate"'; 
     633                        if (!empty($href_type)) { 
     634                                $link .= " type=\"$href_type\""; 
     635                        } 
     636                        $link .= " href=\"$href\" />"; 
     637                        break; 
     638                case 'rss2': 
     639                        $link = "<link>$href</link>"; 
     640                        break; 
     641        } 
     642        $link = $preceding . $link . $trailing; 
     643        return apply_filters(($is_entry == true ? 'feed_entry_link' : 'feed_link'), $link, $feed_type, $href, $href_type, $preceding, $trailing); 
     644} 
     645 
     646/** 
     647 * Feed Replies Link Template 
     648 * 
     649 * @since 2.9 
     650 * 
     651 * @param string $feed_type : Feed Type 
     652 * @param string $href : The location of the replies to the feed 
     653 * @param string $href_type : The content type of the link 
     654 * @param string $preceding Optional : Whitespaces before the element 
     655 * @param string $trailing Optional : Whitespaces after the element 
     656 * @uses apply_filters() Calls 'feed_replies_link' 
     657 * @return XML string 
     658 */ 
     659function feed_replies_link($feed_type, $href, $href_type = null, $preceding = "\t", $trailing = "\n") { 
     660        $prefix = ($feed_type == 'atom' ? '' : 'atom:'); 
     661        $replies_link = "$preceding<{$prefix}link rel=\"replies\""; 
     662        if (!empty($href_type)) { 
     663                $replies_link .= " type=\"$href_type\""; 
     664        } 
     665        $replies_link .= " href=\"$href\" />$trailing"; 
     666        return apply_filters('feed_replies_link', $replies_link, $feed_type, $href, $href_type, $preceding, $trailing); 
     667} 
     668 
     669/** 
     670 * Feed Last-Updated Timestamp Template 
     671 * 
     672 * @since 2.9 
     673 * 
     674 * @param string $feed_type : Feed Type 
     675 * @param int $updated_time: The last-updated timestamp of the feed 
     676 * @param string $preceding Optional : Whitespaces before the element 
     677 * @param string $trailing Optional : Whitespaces after the element 
     678 * @uses apply_filters() Calls 'feed_updated' 
     679 * @return XML string 
     680 */ 
     681function feed_updated($feed_type, $updated_time, $preceding="\t", $trailing="\n") { 
     682        switch ($feed_type) { 
     683                case 'atom': 
     684                        $updated = '<updated>' . gmdate('Y-m-d\TH:i:s\Z', $updated_time).'</updated>'; 
     685                        break; 
     686                case 'rss2': 
     687                        $updated = '<lastBuildDate>' . gmdate('D, d M Y H:i:s +0000', $updated_time). '</lastBuildDate>'; 
     688                        break; 
     689        } 
     690        $updated = $preceding . $updated . $trailing; 
     691        return apply_filters('feed_updated', $updated, $feed_type, $updated_time, $preceding, $trailing); 
     692} 
     693 
     694/** 
     695 * Feed Update Limit Template 
     696 * 
     697 * @since 2.9 
     698 * 
     699 * @param string $feed_type : Feed Type 
     700 * @param string $period: Feed update period: 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' 
     701 * @param int $frequency: Feed update frequency, relative to $period 
     702 * @param string $preceding Optional : Whitespaces before the element 
     703 * @param string $trailing Optional : Whitespaces after the element 
     704 * @uses apply_filters() Calls 'feed_update_limit' 
     705 * @return XML string 
     706 */ 
     707function feed_update_limit($feed_type, $period, $frequency, $preceding = "\t", $trailing = "\n") { 
     708        $update_limit = $preceding . "<sy:updatePeriod>$period</sy:updatePeriod>" . $trailing . 
     709                                        $preceding . "<sy:updateFrequency>$frequency</sy:updateFrequency>" . $trailing; 
     710        return apply_filters('feed_update_limit', $update_limit, $feed_type, $period, $frequency, $preceding, $trailing); 
     711} 
     712 
     713/** 
     714 * Feed Entry ID Template 
     715 * 
     716 * @since 2.9 
     717 * 
     718 * @param string $feed_type : Feed Type 
     719 * @param string $id: The entry id 
     720 * @param string $preceding Optional : Whitespaces before the element 
     721 * @param string $trailing Optional : Whitespaces after the element 
     722 * @uses apply_filters() Calls 'feed_entry_id' 
     723 * @return XML string 
     724 */ 
     725function feed_entry_id($feed_type, $id, $preceding = "\t\t", $trailing = "\n") { 
     726        switch ($feed_type) { 
     727                case 'atom': 
     728                        $entry_id = "<id>$id</id>"; 
     729                        break; 
     730                case 'rss2': 
     731                        $entry_id = "<guid isPermaLink=\"false\">$id</guid>"; 
     732                        break; 
     733        } 
     734        $entry_id = $preceding . $entry_id . $trailing; 
     735        return apply_filters('feed_entry_id', $entry_id, $feed_type, $id, $preceding, $trailing); 
     736} 
     737 
     738/** 
     739 * Feed Entry Title Template 
     740 * 
     741 * @since 2.9 
     742 * 
     743 * @param string $feed_type : Feed Type 
     744 * @param string $text: The text of the entry title 
     745 * @param string $preceding Optional : Whitespaces before the element 
     746 * @param string $trailing Optional : Whitespaces after the element 
     747 * @uses apply_filters() Calls 'feed_entry_title' 
     748 * @return XML string 
     749 */ 
     750function feed_entry_title($feed_type, $text, $preceding = "\t\t", $trailing = "\n") { 
     751        return apply_filters('feed_entry_title', "$preceding<title>$text</title>$trailing", $feed_type, $text, $preceding, $trailing); 
     752} 
     753 
     754/** 
     755 * Feed Entry Category Template 
     756 * 
     757 * @since 2.9 
     758 * 
     759 * @param string $feed_type : Feed Type 
     760 * @param string $category_label: The display name of the category 
     761 * @param string $category_term Optional : The slug of the category 
     762 * @param string $category_scheme Optional : The scheme of the category 
     763 * @param string $preceding Optional : Whitespaces before the element 
     764 * @param string $trailing Optional : Whitespaces after the element 
     765 * @uses apply_filters() Calls 'feed_entry_category' 
     766 * @return XML string 
     767 */ 
     768function feed_entry_category($feed_type, $category_label, $category_term = null, $category_scheme = null, $preceding = "\t\t", $trailing = "\n") { 
     769        if (empty($category_term)) { 
     770                $category_term = $category_label; 
     771        } 
     772        switch ($feed_type) { 
     773                case 'atom': 
     774                        $entry_category = '<category'; 
     775                        if (!empty($category_scheme)) { 
     776                                $entry_category .= " scheme=\"$category_scheme\""; 
     777                        } 
     778                        $entry_category .= " term=\"$category_term\" label=\"$category_label\" />"; 
     779                        break; 
     780                case 'rss2': 
     781                        $entry_category = '<category'; 
     782                        if (!empty($category_scheme)) { 
     783                                $entry_category .= " domain=\"$category_scheme\""; 
     784                        } 
     785                        $entry_category .= ">$category_label</category>"; 
     786                        break; 
     787        } 
     788        $entry_category = $preceding . $entry_category . $trailing; 
     789        return apply_filters('feed_entry_category', $entry_category, $feed_type, $category_label, $category_term, $category_scheme, $preceding, $trailing); 
     790} 
     791 
     792/** 
     793 * Feed Entry Author Template 
     794 * 
     795 * @since 2.9 
     796 * 
     797 * @param string $feed_type : Feed Type 
     798 * @param string $author_name: The author's display name 
     799 * @param string $author_email Optional : The author's email address 
     800 * @param string $author_uri Optional : The author's URI 
     801 * @param string $preceding Optional : Whitespaces before the element 
     802 * @param string $trailing Optional : Whitespaces after the element 
     803 * @uses apply_filters() Calls 'feed_entry_author' 
     804 * @return XML string 
     805 */ 
     806function feed_entry_author($feed_type, $author_name, $author_email = null, $author_uri = null, $preceding = "\t\t", $trailing = "\n") { 
     807        $feed_display_author_email = apply_filters('feed_display_author_email', false); 
     808        switch ($feed_type) { 
     809                case 'atom': 
     810                        $entry_author = "<author><name>$author_name</name>"; 
     811                        if ($feed_display_author_email == true && !empty($author_email)) { 
     812                                $entry_author .= "<email>$author_email</email>"; 
     813                        } 
     814                        if (!empty($author_uri)) { 
     815                                $entry_author .= "<uri>$author_uri</uri>"; 
     816                        } 
     817                        $entry_author .= "</author>"; 
     818                        break; 
     819                case 'rss2': 
     820                        if ($feed_display_author_email == true && !empty($author_email)) { 
     821                                $entry_author = "<author>$author_email ($author_name)</author>"; 
     822                        } 
     823                        else { 
     824                                $entry_author = "<dc:creator>$author_name</dc:creator>"; 
     825                        } 
     826                        break; 
     827        } 
     828        $entry_author = $preceding . $entry_author . $trailing; 
     829        return apply_filters('feed_entry_author', $entry_author, $feed_type, $author_name, $author_email, $author_uri, $preceding, $trailing); 
     830} 
     831 
     832/** 
     833 * Feed Entry Summary Template 
     834 * 
     835 * @since 2.9 
     836 * 
     837 * @param string $feed_type : Feed Type 
     838 * @param string $summary: The feed entry's summary 
     839 * @param string $preceding Optional : Whitespaces before the element 
     840 * @param string $trailing Optional : Whitespaces after the element 
     841 * @uses apply_filters() Calls 'feed_entry_summary' 
     842 * @return XML string 
     843 */ 
     844function feed_entry_summary($feed_type, $summary, $preceding = "\t\t", $trailing = "\n") { 
     845        switch ($feed_type) { 
     846                case 'atom': 
     847                        $entry_summary = "<summary type=\"text\">$summary</summary>"; 
     848                        break; 
     849                case 'rss2': 
     850                        $entry_summary = "<description><![CDATA[$summary]]></description>"; 
     851                        break; 
     852        } 
     853        $entry_summary = $preceding . $entry_summary . $trailing; 
     854        return apply_filters('feed_entry_summary', $entry_summary, $feed_type, $summary, $preceding, $trailing); 
     855} 
     856 
     857/** 
     858 * Feed Entry Content Template 
     859 * 
     860 * @since 2.9 
     861 * 
     862 * @param string $feed_type : Feed Type 
     863 * @param string $content: The feed entry's content 
     864 * @param string $content_type Optional: content type: null | 'text' | 'html' | 'xhtml' 
     865 * @param string $content_base_url Optional: The base url of the content 
     866 * @param string $preceding Optional : Whitespaces before the element 
     867 * @param string $trailing Optional : Whitespaces after the element 
     868 * @uses apply_filters() Calls 'feed_entry_content' 
     869 * @return XML string 
     870 */ 
     871function feed_entry_content($feed_type, $content, $content_type = null, $content_base_url = null, $preceding = "\t\t", $trailing = "\n") { 
     872        if (empty($content_type)) { 
     873                $content_type = (strpos(get_bloginfo('html_type'), 'xhtml') !== false ? 'xhtml' : 'html'); 
     874        } 
     875        if (!empty($content)) { 
     876                switch ($feed_type) { 
     877                        case 'atom': 
     878                                $entry_content = "<content type=\"$content_type\""; 
     879                                if (!empty($content_base_url)) { 
     880                                        $entry_content .= " xml:base=\"$content_base_url\""; 
     881                                } 
     882                                $entry_content .= '>'; 
     883                                switch ($content_type) { 
     884                                        case 'xhtml': 
     885                                                $entry_content .= "<div xmlns=\"http://www.w3.org/1999/xhtml\">$content</div>"; 
     886                                                break; 
     887                                        case 'html': 
     888                                                $entry_content .= "<![CDATA[$content]]>"; 
     889                                                break; 
     890                                        default: 
     891                                                $entry_content .= $content; 
     892                                                break; 
     893                                } 
     894                                $entry_content .= '</content>'; 
     895                                break; 
     896                        case 'rss2': 
     897                                $entry_content = "<content:encoded><![CDATA[$content]]></content:encoded>"; 
     898                                break; 
     899                } 
     900                $entry_content = $preceding . $entry_content . $trailing; 
     901        } 
     902        else { 
     903                $entry_content = ''; 
     904        } 
     905        return apply_filters('feed_entry_content', $entry_content, $feed_type, $content, $content_type, $content_base_url, $preceding, $trailing); 
     906} 
     907 
     908/** 
     909 * Feed Entry Comment Information Template 
     910 * 
     911 * @since 2.9 
     912 * 
     913 * @param string $feed_type : Feed Type 
     914 * @param string $blog_comment_link: The link to the feed entry's comment part 
     915 * @param string $feed_comment_link: The link to the feed entry's comment feed 
     916 * @param int $comment_number: Number of comments 
     917 * @param string $preceding Optional : Whitespaces before the element 
     918 * @param string $trailing Optional : Whitespaces after the element 
     919 * @uses apply_filters() Calls 'feed_entry_comment_info' 
     920 * @return XML string 
     921 */ 
     922function feed_entry_comment_info($feed_type, $blog_comment_link, $feed_comment_link, $comment_number, $preceding = "\t\t", $trailing = "\n") { 
     923        switch ($feed_type) { 
     924                case 'atom': 
     925                        $entry_comment_info= 
     926                                $preceding . '<link rel="replies" type="' . get_bloginfo('html_type') . "\" href=\"$blog_comment_link\" thr:count=\"$comment_number\" />" . $trailing . 
     927                                $preceding . '<link rel="replies" type="' . feed_content_type($feed_type) . "\" href=\"$feed_comment_link\" thr:count=\"$comment_number\" />" . $trailing . 
     928                                $preceding . "<thr:total>$comment_number</thr:total>" . $trailing; 
     929                        break; 
     930                case 'rss2': 
     931                        $entry_comment_info= 
     932                                $preceding . "<comments>$blog_comment_link</comments>" . $trailing . 
     933                                $preceding . "<wfw:commentRss>$feed_comment_link</wfw:commentRss>" . $trailing . 
     934                                $preceding . "<slash:comments>$comment_number</slash:comments>" . $trailing; 
     935                        break; 
     936        } 
     937        return apply_filters('feed_entry_comment_info', $entry_comment_info, $feed_type, $blog_comment_link, $feed_comment_link, $comment_number, $preceding, $trailing); 
     938} 
     939 
     940/** 
     941 * Feed Entry Published TimeStamp Template 
     942 * 
     943 * @since 2.9 
     944 * 
     945 * @param string $feed_type : Feed Type 
     946 * @param int $published_time: The published time of the feed entry 
     947 * @param string $preceding Optional : Whitespaces before the element 
     948 * @param string $trailing Optional : Whitespaces after the element 
     949 * @uses apply_filters() Calls 'feed_entry_published' 
     950 * @return XML string 
     951 */ 
     952function feed_entry_published($feed_type, $published_time, $preceding = "\t\t", $trailing = "\n") { 
     953        switch ($feed_type) { 
     954                case 'atom': 
     955                        $entry_published = '<published>' . gmdate('Y-m-d\TH:i:s\Z',$published_time) . '</published>'; 
     956                        break; 
     957                case 'rss2': 
     958                        $entry_published = '<pubDate>' . gmdate('D, d M Y H:i:s +0000',$published_time) . '</pubDate>'; 
     959                        break; 
     960        } 
     961        $entry_published = $preceding . $entry_published . $trailing; 
     962        return apply_filters('feed_entry_published', $entry_published, $feed_type, $published_time, $preceding, $trailing); 
     963} 
     964 
     965/** 
     966 * Feed Entry Updated TimeStamp Template 
     967 * 
     968 * @since 2.9 
     969 * 
     970 * @param string $feed_type : Feed Type 
     971 * @param int $updated_time: The updated time of the feed entry 
     972 * @param string $preceding Optional : Whitespaces before the element 
     973 * @param string $trailing Optional : Whitespaces after the element 
     974 * @uses apply_filters() Calls 'feed_entry_updated' 
     975 * @return XML string 
     976 */ 
     977function feed_entry_updated($feed_type, $updated_time, $preceding = "\t\t", $trailing = "\n") { 
     978        if ($feed_type == 'atom') { 
     979                $entry_updated = $preceding . '<updated>' . gmdate('Y-m-d\TH:i:s\Z', $updated_time) . '</updated>' . $trailing; 
     980        } 
     981        else { 
     982                $entry_updated = ''; 
     983        } 
     984        return apply_filters('feed_entry_updated', $entry_updated, $feed_type, $updated_time, $preceding, $trailing); 
     985} 
     986 
     987/** 
     988 * Feed Headers Generator 
     989 * 
     990 * @since 2.9 
     991 * 
     992 * @param string $feed_type : Feed Type 
     993 */ 
     994function feed_headers($feed_type) { 
     995        global $wp_query; 
     996        if (is_category()) { 
     997                $cat_id = $wp_query->get_queried_object_id(); 
     998                $id = get_category_feed_link($cat_id, $feed_type, true); 
     999                $subtitle = trim(strip_tags(category_description($cat_id))); 
     1000                $self_link = get_category_feed_link($cat_id, $feed_type); 
     1001                $feed_link = get_category_link($cat_id); 
     1002                $replies_link = get_category_comments_feed_link($cat_id, $feed_type); 
     1003        } 
     1004        elseif (is_tag()) { 
     1005                $tag_atom_id = $wp_query->get_queried_object_id(); 
     1006                $id = get_tag_feed_link($tag_id, $feed_type, true); 
     1007                $subtitle = trim(strip_tags(tag_description($cat_id))); 
     1008                $self_link = get_tag_feed_link($tag_id, $feed_type); 
     1009                $feed_link = get_tag_link($tag_id); 
     1010                $replies_link = get_tag_comments_feed_link($tag_id, $feed_type); 
     1011        } 
     1012        elseif (is_author()) { 
     1013                $author_id = $wp_query->get_queried_object_id(); 
     1014                $id = get_author_feed_link($author_id, $feed_type, true); 
     1015                $subtitle = null; 
     1016                $self_link = get_author_feed_link($author_id, $feed_type); 
     1017                $feed_link = get_author_posts_url($author_id); 
     1018                $replies_link = get_author_comments_feed_link($author_id, $feed_type); 
     1019        } 
     1020        elseif (is_date()) { 
     1021                $year = $month = $day = $hour = $minute = $second = $canonical_feed_link = $alternate_link = $comments_feed_link = null; 
     1022                $year_string = get_query_var('year'); 
     1023                $month_string = get_query_var('monthnum'); 
     1024                $day_string = get_query_var('day'); 
     1025                $hour_string = get_query_var('hour'); 
     1026                $minute_string = get_query_var('minute'); 
     1027                $second_string = get_query_var('second'); 
     1028                $m = get_query_var('m'); 
     1029                $week = get_query_var('w'); 
     1030                if (!empty($week)) { 
     1031                        if (!empty($year_string)) { 
     1032                                $year = $year_string; 
     1033                        } 
     1034                        elseif (!empty($m) && strlen($m) >= 4) { 
     1035                                $year = substr($m, 0, 4); 
     1036                        } 
     1037                        $canonical_feed_link = get_week_feed_link($year, $week, $feed_type); 
     1038                        $alternate_link = get_week_link($year, $week); 
     1039                        $comments_feed_link = get_week_comments_feed_link($year, $week, $feed_type); 
     1040                } 
     1041                elseif (empty($m)) { 
     1042                        if (!empty($year_string)) { 
     1043                                $year = $year_string; 
     1044                        } 
     1045                        if (!empty($month_string)) { 
     1046                                $month = $month_string; 
     1047                        } 
     1048                        if (!empty($day_string)) { 
     1049                                $day = $day_string; 
     1050                        } 
     1051                        if (!empty($hour_string)) { 
     1052                                $hour = $hour_string; 
     1053                        } 
     1054                        if (!empty($minute_string)) { 
     1055                                $minute = $minute_string; 
     1056                        } 
     1057                        if (!empty($second_string)) { 
     1058                                $second = $second_string; 
     1059                        } 
     1060                } 
     1061                else { 
     1062                        $m_length = strlen($m); 
     1063                        switch ($m_length) { 
     1064                                case 14: 
     1065                                        $second = substr($m, 12, 2); 
     1066                                case 12: 
     1067                                        $minute = substr($m, 10, 2); 
     1068                                case 10: 
     1069                                        $hour = substr($m, 8, 2); 
     1070                                case 8: 
     1071                                        $day = substr($m, 6, 2); 
     1072                                case 6: 
     1073                                        $month = substr($m, 4, 2); 
     1074                                case 4: 
     1075                                        $year = substr($m, 0, 4); 
     1076                                        break; 
     1077                                default: 
     1078                                        return false; 
     1079                        } 
     1080                } 
     1081                if ($canonical_feed_link === null) { 
     1082                        $canonical_feed_link = get_archive_feed_link($year, $month, $day, $hour, $minute, $second, $feed_type); 
     1083                } 
     1084                if ($alternate_link === null) { 
     1085                        $alternate_link = get_archive_link($year, $month, $day, $hour, $minute, $second); 
     1086                } 
     1087                if ($comments_feed_link === null) { 
     1088                        $comments_feed_link = get_archive_comments_feed_link($year, $month, $day, $hour, $minute, $second, $feed_type); 
     1089                } 
     1090                $subtitle = null; 
     1091                $id=$self_link = $canonical_feed_link; 
     1092                $feed_link = $alternate_link; 
     1093                $replies_link = $comments_feed_link; 
     1094        } 
     1095        elseif (is_search()) { 
     1096                $search_query = get_search_query(); 
     1097                $subtitle = null; 
     1098                $id = $self_link = get_search_feed_link($search_query, $feed_type); 
     1099                $feed_link = get_search_link($search_query); 
     1100                $replies_link = get_search_comments_feed_link($search_query, $feed_type); 
     1101        } 
     1102        else { 
     1103                $id = get_feed_link($feed_type, true); 
     1104                $subtitle = get_bloginfo_rss('description'); 
     1105                $self_link = get_bloginfo("{$feed_type}_url"); 
     1106                $feed_link = trailingslashit(get_bloginfo_rss('url')); 
     1107                $replies_link = get_bloginfo_rss("comments_{$feed_type}_url"); 
     1108        } 
     1109        echo feed_id($feed_type, $id); 
     1110        echo feed_title($feed_type, get_bloginfo_rss('name') . get_wp_title_rss()); 
     1111        echo feed_subtitle($feed_type, $subtitle); 
     1112        echo feed_self_link($feed_type, $self_link); 
     1113        echo feed_link($feed_type, false, $feed_link, get_bloginfo('html_type')); 
     1114        echo feed_replies_link($feed_type, $replies_link, feed_content_type($feed_type)); 
     1115        echo "\t"; 
     1116        the_generator($feed_type); 
     1117        if (apply_filters('feed_set_update_limit', true) == true) { 
     1118                echo feed_update_limit($feed_type, apply_filters('rss_update_period', 'hourly'), apply_filters('rss_update_frequency', 1)); 
     1119        } 
     1120        do_action("{$feed_type}_head"); 
     1121        echo feed_updated($feed_type, strtotime(get_lastpostmodified('GMT'))); 
     1122} 
     1123 
     1124/** 
     1125 * Feed Entry Generator 
     1126 * 
     1127 * @since 2.9 
     1128 * 
     1129 * @param string $feed_type : Feed Type 
     1130 * @param string $entry_element_name : Name of the entry element 
     1131 * @param string $preceding Optional : Whitespaces before the element 
     1132 * @param string $trailing Optional : Whitespaces after the element 
     1133 */ 
     1134function feed_entry($feed_type, $entry_element_name, $preceding = "\t", $trailing = "\n") { 
     1135        echo $preceding . "<$entry_element_name>" . $trailing; 
     1136        echo feed_entry_id($feed_type, get_the_guid()); 
     1137        echo feed_entry_title($feed_type, get_the_title_rss()); 
     1138        echo get_the_category_rss($feed_type); 
     1139        echo feed_entry_author($feed_type, get_the_author(), get_the_author_meta('user_email'), get_the_author_meta('user_url')); 
     1140        echo feed_entry_summary($feed_type, trim(get_the_excerpt())); 
     1141        $feed_entry_link = get_the_permalink_rss(); 
     1142        if (get_option('rss_use_excerpt') == false) { 
     1143                echo feed_entry_content($feed_type, trim(get_the_content_feed($feed_type)), null, $feed_entry_link); 
     1144        } 
     1145        echo feed_link($feed_type, true, $feed_entry_link, get_bloginfo('html_type'), "\t\t"); 
     1146        echo feed_entry_comment_info($feed_type, $feed_entry_link . '#comments', get_post_comments_feed_link(null, $feed_type), get_comments_number()); 
     1147        switch ($feed_type) { 
     1148                case 'atom': 
     1149                        atom_enclosure(); 
     1150                        do_action('atom_entry'); 
     1151                        break; 
     1152                case 'rss2': 
     1153                        rss_enclosure(); 
     1154                        do_action('rss2_item'); 
     1155                        break; 
     1156        } 
     1157        echo feed_entry_published($feed_type, get_post_time('U', true)); 
     1158        echo feed_entry_updated($feed_type, get_post_modified_time('U', true)); 
     1159        echo $preceding . "</$entry_element_name>" . $trailing; 
     1160} 
     1161 No newline at end of file 
  • link-template.php

     
    357357 * @since 1.5.0 
    358358 * 
    359359 * @param string $feed Optional, defaults to default feed. Feed type. 
     360 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    360361 * @return string 
    361362 */ 
    362 function get_feed_link($feed = '') { 
     363function get_feed_link($feed = '', $return_canonical_form = false) { 
    363364        global $wp_rewrite; 
    364365 
    365366        $permalink = $wp_rewrite->get_feed_permastruct(); 
    366         if ( '' != $permalink ) { 
     367        if ($return_canonical_form==true||empty($permalink)) { 
     368                if ( empty($feed) ) 
     369                        $feed = get_default_feed(); 
     370 
     371                if ( false !== strpos($feed, 'comments_') ) 
     372                        $feed = str_replace('comments_', 'comments-', $feed); 
     373 
     374                $output = trailingslashit(get_option('home')) . "?feed={$feed}"; 
     375        } 
     376        else { 
    367377                if ( false !== strpos($feed, 'comments_') ) { 
    368378                        $feed = str_replace('comments_', '', $feed); 
    369379                        $permalink = $wp_rewrite->get_comment_feed_permastruct(); 
     
    375385                $permalink = str_replace('%feed%', $feed, $permalink); 
    376386                $permalink = preg_replace('#/+#', '/', "/$permalink"); 
    377387                $output =  get_option('home') . user_trailingslashit($permalink, 'feed'); 
    378         } else { 
    379                 if ( empty($feed) ) 
    380                         $feed = get_default_feed(); 
    381  
    382                 if ( false !== strpos($feed, 'comments_') ) 
    383                         $feed = str_replace('comments_', 'comments-', $feed); 
    384  
    385                 $output = trailingslashit(get_option('home')) . "?feed={$feed}"; 
    386388        } 
    387  
     389         
    388390        return apply_filters('feed_link', $output, $feed); 
    389391} 
    390392 
     
    395397 * 
    396398 * @param int $post_id Optional. Post ID. 
    397399 * @param string $feed Optional. Feed type. 
     400 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    398401 * @return string 
    399402 */ 
    400 function get_post_comments_feed_link($post_id = '', $feed = '') { 
     403function get_post_comments_feed_link($post_id = '', $feed = '', $return_canonical_form = false) { 
    401404        global $id; 
    402405 
    403406        if ( empty($post_id) ) 
     
    406409        if ( empty($feed) ) 
    407410                $feed = get_default_feed(); 
    408411 
    409         if ( '' != get_option('permalink_structure') ) { 
    410                 $url = trailingslashit( get_permalink($post_id) ) . 'feed'; 
    411                 if ( $feed != get_default_feed() ) 
    412                         $url .= "/$feed"; 
    413                 $url = user_trailingslashit($url, 'single_feed'); 
    414         } else { 
     412        if ($return_canonical_form==true||empty($permalink)) { 
    415413                $type = get_post_field('post_type', $post_id); 
    416414                if ( 'page' == $type ) 
    417415                        $url = trailingslashit(get_option('home')) . "?feed=$feed&amp;page_id=$post_id"; 
    418416                else 
    419417                        $url = trailingslashit(get_option('home')) . "?feed=$feed&amp;p=$post_id"; 
    420418        } 
    421  
     419        else { 
     420                $url = trailingslashit( get_permalink($post_id) ) . 'feed'; 
     421                if ( $feed != get_default_feed() ) 
     422                        $url .= "/$feed"; 
     423                $url = user_trailingslashit($url, 'single_feed'); 
     424        } 
     425         
    422426        return apply_filters('post_comments_feed_link', $url); 
    423427} 
    424428 
     
    436440 * @param string $link_text Descriptive text. 
    437441 * @param int $post_id Optional post ID.  Default to current post. 
    438442 * @param string $feed Optional. Feed format. 
     443 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    439444 * @return string Link to the comment feed for the current post. 
    440445*/ 
    441 function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) { 
    442         $url = get_post_comments_feed_link($post_id, $feed); 
     446function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '', $return_canonical_form = false) { 
     447        $url = get_post_comments_feed_link($post_id, $feed, $return_canonical_form); 
    443448        if ( empty($link_text) ) 
    444449                $link_text = __('Comments Feed'); 
    445450 
     
    458463 * 
    459464 * @param int $author_id ID of an author. 
    460465 * @param string $feed Optional. Feed type. 
     466 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    461467 * @return string Link to the feed for the author specified by $author_id. 
    462468*/ 
    463 function get_author_feed_link( $author_id, $feed = '' ) { 
     469function get_author_feed_link( $author_id, $feed = '', $return_canonical_form = false) { 
    464470        $author_id = (int) $author_id; 
    465471        $permalink_structure = get_option('permalink_structure'); 
    466472 
    467473        if ( empty($feed) ) 
    468474                $feed = get_default_feed(); 
    469475 
    470         if ( '' == $permalink_structure ) { 
     476        if ($return_canonical_form==true||empty($permalink_structure)) { 
    471477                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;author=" . $author_id; 
    472         } else { 
     478        } 
     479        else { 
    473480                $link = get_author_posts_url($author_id); 
    474481                if ( $feed == get_default_feed() ) 
    475482                        $feed_link = 'feed'; 
     
    485492} 
    486493 
    487494/** 
     495 * Retrieve the comments feed link for a given author. 
     496 * 
     497 * @since 2.9 
     498 * 
     499 * @param int $author_id ID of an author. 
     500 * @param string $feed Optional. Feed type. 
     501 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes 
     502 * @return string Link to the comments feed for the author specified by $author_id. 
     503*/ 
     504function get_author_comments_feed_link($author_id, $feed = '', $return_canonical_form = false) { 
     505        $author_id = (int) $author_id; 
     506        $permalink_structure = get_option('permalink_structure'); 
     507 
     508        if ( empty($feed) ) 
     509                $feed = get_default_feed(); 
     510 
     511        if ($return_canonical_form==true||empty($permalink_structure)) { 
     512                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;author=" . $author_id; 
     513        } 
     514        else { 
     515                $link = get_author_posts_url($author_id); 
     516                if ( $feed == get_default_feed() ) 
     517                        $feed_link = 'comments/feed'; 
     518                else 
     519                        $feed_link = "comments/feed/$feed"; 
     520 
     521                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     522        } 
     523 
     524        $link = apply_filters('author_comments_feed_link', $link, $feed); 
     525 
     526        return $link; 
     527} 
     528 
     529/** 
    488530 * Retrieve the feed link for a category. 
    489531 * 
    490532 * Returns a link to the feed for all post in a given category. A specific feed 
     
    496538 * 
    497539 * @param int $cat_id ID of a category. 
    498540 * @param string $feed Optional. Feed type. 
     541 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    499542 * @return string Link to the feed for the category specified by $cat_id. 
    500543*/ 
    501 function get_category_feed_link($cat_id, $feed = '') { 
     544function get_category_feed_link($cat_id, $feed = '', $return_canonical_form = false) { 
    502545        $cat_id = (int) $cat_id; 
    503546 
    504547        $category = get_category($cat_id); 
     
    511554 
    512555        $permalink_structure = get_option('permalink_structure'); 
    513556 
    514         if ( '' == $permalink_structure ) { 
     557        if ($return_canonical_form==true||empty($permalink_structure)) { 
    515558                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;cat=" . $cat_id; 
    516         } else { 
     559        } 
     560        else { 
    517561                $link = get_category_link($cat_id); 
    518562                if( $feed == get_default_feed() ) 
    519563                        $feed_link = 'feed'; 
     
    529573} 
    530574 
    531575/** 
     576 * Retrieve the comments feed link for a category. 
     577 * 
     578 * @since 2.9 
     579 * 
     580 * @param int $cat_id ID of a category. 
     581 * @param string $feed Optional. Feed type. 
     582 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes 
     583 * @return string Link to the comments feed for the category specified by $cat_id. 
     584*/ 
     585function get_category_comments_feed_link($cat_id, $feed = '', $return_canonical_form = false) { 
     586        $cat_id = (int) $cat_id; 
     587 
     588        $category = get_category($cat_id); 
     589 
     590        if ( empty($category) || is_wp_error($category) ) 
     591                return false; 
     592 
     593        if ( empty($feed) ) 
     594                $feed = get_default_feed(); 
     595 
     596        $permalink_structure = get_option('permalink_structure'); 
     597 
     598        if ($return_canonical_form==true||empty($permalink_structure)) { 
     599                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;cat=" . $cat_id; 
     600        } 
     601        else { 
     602                $link = get_category_link($cat_id); 
     603                if( $feed == get_default_feed() ) 
     604                        $feed_link = 'comments/feed'; 
     605                else 
     606                        $feed_link = "comments/feed/$feed"; 
     607 
     608                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     609        } 
     610 
     611        $link = apply_filters('category_comments_feed_link', $link, $feed); 
     612 
     613        return $link; 
     614} 
     615 
     616/** 
    532617 * Retrieve permalink for feed of tag. 
    533618 * 
    534619 * @since 2.3.0 
    535620 * 
    536621 * @param int $tag_id Tag ID. 
    537622 * @param string $feed Optional. Feed type. 
     623 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes (since 2.9) 
    538624 * @return string 
    539625 */ 
    540 function get_tag_feed_link($tag_id, $feed = '') { 
     626function get_tag_feed_link($tag_id, $feed = '', $return_canonical_form = false) { 
    541627        $tag_id = (int) $tag_id; 
    542628 
    543629        $tag = get_tag($tag_id); 
     
    550636        if ( empty($feed) ) 
    551637                $feed = get_default_feed(); 
    552638 
    553         if ( '' == $permalink_structure ) { 
     639        if ($return_canonical_form==true||empty($permalink_structure)) { 
    554640                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;tag=" . $tag->slug; 
    555         } else { 
     641        } 
     642        else { 
    556643                $link = get_tag_link($tag->term_id); 
    557644                if ( $feed == get_default_feed() ) 
    558645                        $feed_link = 'feed'; 
     
    567654} 
    568655 
    569656/** 
     657 * Retrieve permalink for the comments feed of tag. 
     658 * 
     659 * @since 2.9 
     660 * 
     661 * @param int $tag_id Tag ID. 
     662 * @param string $feed Optional. Feed type. 
     663 * @param bool $return_canonical_form Optional. Whether the function should generate a link that will not change even when the permalink format changes 
     664 * @return string 
     665 */ 
     666function get_tag_comments_feed_link($tag_id, $feed = '', $return_canonical_form = false) { 
     667        $tag_id = (int) $tag_id; 
     668 
     669        $tag = get_tag($tag_id); 
     670 
     671        if ( empty($tag) || is_wp_error($tag) ) 
     672                return false; 
     673 
     674        $permalink_structure = get_option('permalink_structure'); 
     675 
     676        if ( empty($feed) ) 
     677                $feed = get_default_feed(); 
     678 
     679        if ($return_canonical_form==true||empty($permalink_structure)) { 
     680                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;tag=" . $tag->slug; 
     681        } 
     682        else { 
     683                $link = get_tag_link($tag->term_id); 
     684                if ( $feed == get_default_feed() ) 
     685                        $feed_link = 'comments/feed'; 
     686                else 
     687                        $feed_link = "comments/feed/$feed"; 
     688                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     689        } 
     690 
     691        $link = apply_filters('tag_comments_feed_link', $link, $feed); 
     692 
     693        return $link; 
     694} 
     695 
     696/** 
    570697 * Retrieve edit tag link. 
    571698 * 
    572699 * @since 2.7.0 
     
    609736} 
    610737 
    611738/** 
     739 * Retrieve the permalink for the search results. 
     740 * 
     741 * @since 2.9 
     742 * 
     743 * @param string $search_query Optional. Search query. 
     744 * @return string 
     745 */ 
     746function get_search_link($search_query = '') { 
     747        if(empty($search_query)) { 
     748                $search=esc_attr(get_search_query()); 
     749        } 
     750        else { 
     751                $search=esc_attr(stripslashes($search_query)); 
     752        } 
     753        $link=trailingslashit(get_option('home'))."?s=$search"; 
     754        $link=apply_filters('search_link',$link); 
     755        return $link; 
     756} 
     757 
     758/** 
    612759 * Retrieve the permalink for the feed of the search results. 
    613760 * 
    614761 * @since 2.5.0 
     
    659806} 
    660807 
    661808/** 
     809 * Convert link array to link string. For internal use only. 
     810 * 
     811 * @since 2.9 
     812 * 
     813 * @param array $array The link array 
     814 * @return string 
     815 */ 
     816function _archive_array_to_link($array) { 
     817        $link = $array[0]; 
     818        $array_length = count($array); 
     819        if ($array_length > 1) { 
     820                $link .= "?$array[1]"; 
     821                if ($array_length > 2) { 
     822                        for ($i = 2; $i < $array_length ; $i++) { 
     823                                $link .= "&amp;$array[$i]"; 
     824                        } 
     825                } 
     826        } 
     827        return $link; 
     828} 
     829 
     830/** 
     831 * Retrieve the archive link of a specific time 
     832 * 
     833 * @since 2.9 
     834 * 
     835 * @param int $year 
     836 * @param int $month Optional 
     837 * @param int $day Optional 
     838 * @param int $hour Optional 
     839 * @param int $minute Optional 
     840 * @param int $second Optional 
     841 * @param bool $return_array Optional 
     842 * @return array or string depending on $return_array 
     843 */ 
     844function get_archive_link($year, $month = null, $day = null, $hour = null, $minute = null, $second = null, $return_array = false) { 
     845        $array = array(trailingslashit(get_option('home'))); 
     846        if ($year !== null) { 
     847                $year = (int)$year; 
     848                if ($year <= 0) { 
     849                        return false; 
     850                } 
     851                $array[] = "year=$year"; 
     852        } 
     853        if ($month!==null) { 
     854                $month = (int)$month; 
     855                if ($month < 1 || $month > 12) { 
     856                        return false; 
     857                } 
     858                $array[] = "monthnum=$month"; 
     859        } 
     860        if ($day !== null) { 
     861                $day = (int)$day; 
     862                if ($day < 1 || $day > 31) { 
     863                        return false; 
     864                } 
     865                $array[] = "day=$day"; 
     866        } 
     867        if ($hour !== null) { 
     868                $hour = (int)$hour; 
     869                if ($hour < 0 || $hour > 23) { 
     870                        return false; 
     871                } 
     872                $array[] = "hour=$hour"; 
     873        } 
     874        if ($minute !== null) { 
     875                $minute = (int)$minute; 
     876                if($minute < 0 || $minute > 60) { 
     877                        return false; 
     878                } 
     879                $array[] = "minute=$minute"; 
     880        } 
     881        if ($second !== null) { 
     882                $second = (int)$second; 
     883                if($second < 0 || $second > 60) { 
     884                        return false; 
     885                } 
     886                $array[] = "second=$second"; 
     887        } 
     888        if ($return_array == true) { 
     889                return $array; 
     890        } 
     891        else { 
     892                return apply_filters('archive_link', _archive_array_to_link($array), $year, $month, $day, $hour, $minute, $second); 
     893        } 
     894} 
     895 
     896/** 
     897 * Retrieve the feed link of a specific time 
     898 * 
     899 * @since 2.9 
     900 * 
     901 * @param int $year 
     902 * @param int $month Optional 
     903 * @param int $day Optional 
     904 * @param int $hour Optional 
     905 * @param int $minute Optional 
     906 * @param int $second Optional 
     907 * @param string $feed Optional. Feed Type 
     908 * @return string 
     909 */ 
     910function get_archive_feed_link($year, $month = null, $day = null, $hour = null, $minute = null, $second = null, $feed = '') { 
     911        $array = get_archive_link($year, $month, $day, $hour, $minute, $second, true); 
     912        if ($array === false) { 
     913                return false; 
     914        } 
     915        if (empty($feed)) { 
     916                $feed = get_default_feed(); 
     917        } 
     918        $array[] = "feed=$feed"; 
     919        return apply_filters('archive_feed_link', _archive_array_to_link($array), $year, $month, $day, $hour, $minute, $second, $feed); 
     920} 
     921 
     922/** 
     923 * Retrieve the comments feed link of a specific time 
     924 * 
     925 * @since 2.9 
     926 * 
     927 * @param int $year 
     928 * @param int $month Optional 
     929 * @param int $day Optional 
     930 * @param int $hour Optional 
     931 * @param int $minute Optional 
     932 * @param int $second Optional 
     933 * @param string $feed Optional. Feed Type 
     934 * @return string 
     935 */ 
     936function get_archive_comments_feed_link($year, $month = null, $day = null, $hour = null, $minute = null, $second = null, $feed = '') { 
     937        $array = get_archive_link($year, $month, $day, $hour, $minute, $second, true); 
     938        if ($array === false) { 
     939                return false; 
     940        } 
     941        if (empty($feed)) { 
     942                $feed = get_default_feed(); 
     943        } 
     944        $array[] = "feed=comments-$feed"; 
     945        return apply_filters('archive_comments_feed_link', _archive_array_to_link($array), $year, $month, $day, $hour, $minute, $second, $feed); 
     946} 
     947 
     948/** 
     949 * Retrieve the archive link of a specific week 
     950 * 
     951 * @since 2.9 
     952 * 
     953 * @param int $year 
     954 * @param int $week 
     955 * @param bool $return_array Optional 
     956 * @return array or string depending on $return_array 
     957 */ 
     958function get_week_link($year, $week, $return_array = false) { 
     959        $array = get_archive_link($year, null, null, null, null, null, true); 
     960        $week = (int)$week; 
     961        if ($array === false || $week < 0 || $week > 53) { 
     962                return false; 
     963        } 
     964        $array[] = "w=$week"; 
     965        if ($return_array == true) { 
     966                return $array; 
     967        } 
     968        else { 
     969                return apply_filters('week_link', _archive_array_to_link($array)); 
     970        } 
     971} 
     972 
     973/** 
     974 * Retrieve the feed link of a specific week 
     975 * 
     976 * @since 2.9 
     977 * 
     978 * @param int $year 
     979 * @param int $week 
     980 * @param string $feed Optional. Feed Type 
     981 * @return string 
     982 */ 
     983function get_week_feed_link($year, $week, $feed = '') { 
     984        $array = get_week_link($year, $week, true); 
     985        if ($array === false) { 
     986                return false; 
     987        } 
     988        if (empty($feed)) { 
     989                $feed = get_default_feed(); 
     990        } 
     991        $array[] = "feed=$feed"; 
     992        return apply_filters('week_feed_link', _archive_array_to_link($array), $feed); 
     993} 
     994 
     995/** 
     996 * Retrieve the comments feed link of a specific week 
     997 * 
     998 * @since 2.9 
     999 * 
     1000 * @param int $year 
     1001 * @param int $week 
     1002 * @param string $feed Optional. Feed Type 
     1003 * @return string 
     1004 */ 
     1005function get_week_comments_feed_link($year, $week, $feed = '') { 
     1006        $array = get_week_link($year, $week, true); 
     1007        if ($array === false) { 
     1008                return false; 
     1009        } 
     1010        if (empty($feed)) { 
     1011                $feed = get_default_feed(); 
     1012        } 
     1013        $array[] = "feed=comments-$feed"; 
     1014        return apply_filters('week_comments_feed_link', _archive_array_to_link($array), $feed); 
     1015} 
     1016 
     1017/** 
    6621018 * Retrieve edit posts link for post. 
    6631019 * 
    6641020 * Can be used within the WordPress loop or outside of it. Can be used with