Ticket #9510: 9510-v3.patch

File 9510-v3.patch, 17.4 KB (added by peaceablewhale, 4 years ago)

Version 3 of the patch, changes from #9515 adopted, with minor corrections

  • feed-atom.php

     
    1313  xmlns="http://www.w3.org/2005/Atom" 
    1414  xmlns:thr="http://purl.org/syndication/thread/1.0" 
    1515  xml:lang="<?php echo get_option('rss_language'); ?>" 
    16   xml:base="<?php bloginfo_rss('home') ?>/wp-atom.php" 
     16  xml:base="<?php bloginfo_rss('url') ?>/wp-atom.php" 
    1717  <?php do_action('atom_ns'); ?> 
    1818 > 
    1919        <title type="text"><?php bloginfo_rss('name'); wp_title_rss(); ?></title> 
    20         <subtitle type="text"><?php bloginfo_rss("description") ?></subtitle> 
    21  
     20        <?php atom_header(); the_generator('atom'); do_action('atom_head'); ?> 
    2221        <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'); ?> 
    3022        <?php while (have_posts()) : the_post(); ?> 
    3123        <entry> 
    3224                <author> 
     
    5244                <thr:total><?php echo get_comments_number()?></thr:total> 
    5345        </entry> 
    5446        <?php endwhile ; ?> 
    55 </feed> 
     47</feed> 
     48 No newline at end of file 
  • feed.php

     
    559559 
    560560        return $feed; 
    561561} 
     562 
     563function echo_atom_feed_id($feed_id) { 
     564        echo "<id>$feed_id</id>\n"; 
     565} 
     566function echo_atom_feed_subtitle($feed_subtitle) { 
     567        if(!empty($feed_subtitle)) { 
     568                echo '<subtitle type="text">'.$feed_subtitle.'</subtitle>'."\n"; 
     569        } 
     570} 
     571function echo_atom_feed_links($self_link,$alternate_link,$replies_link) { 
     572        echo '<link rel="self" type="application/atom+xml" href="'.$self_link.'" />'."\n".'<link rel="alternate" type="'.get_option('html_type').'" href="'.$alternate_link.'" />'."\n".'<link rel="replies" type="application/atom+xml" href="'.$replies_link.'" />'."\n"; 
     573} 
     574function atom_header() { 
     575        $feed_type="atom"; 
     576        if(is_category()) { 
     577                $cat_id=get_query_object_id(); 
     578                echo_atom_feed_id(get_category_feed_link($cat_id,$feed_type,true)); 
     579                echo_atom_feed_links(get_category_feed_link($cat_id,$feed_type),get_category_link($cat_id),get_category_comments_feed_link($cat_id,$feed_type)); 
     580        } 
     581        elseif(is_tag()) { 
     582                $tag_atom_id=get_query_object_id(); 
     583                echo_atom_feed_id(get_tag_feed_link($tag_id,$feed_type,true)); 
     584                echo_atom_feed_links(get_tag_feed_link($tag_id,$feed_type),get_tag_link($tag_id),get_tag_comments_feed_link($tag_id,$feed_type)); 
     585        } 
     586        elseif(is_author()) { 
     587                $author_id=get_query_object_id(); 
     588                echo_atom_feed_id(get_author_feed_link($author_id,$feed_type,true)); 
     589                echo_atom_feed_links(get_author_feed_link($author_id,$feed_type),get_author_posts_url($author_id),get_author_comments_feed_link($author_id,$feed_type)); 
     590        } 
     591        elseif(is_date()) { 
     592                $year=$month=$day=$hour=$minute=$second=$canonical_feed_link=$alternate_link=$comments_feed_link=null; 
     593                $year_string=get_query_var('year'); 
     594                $month_string=get_query_var('monthnum'); 
     595                $day_string=get_query_var('day'); 
     596                $hour_string=get_query_var('hour'); 
     597                $minute_string=get_query_var('minute'); 
     598                $second_string=get_query_var('second'); 
     599                $m=get_query_var('m'); 
     600                $week=get_query_var('w'); 
     601                if(!empty($week)) { 
     602                        if(!empty($year_string)) { 
     603                                $year=$year_string; 
     604                        } 
     605                        elseif(!empty($m)&&strlen($m)>=4) { 
     606                                $year=substr($m,0,4); 
     607                        } 
     608                        $canonical_feed_link=get_week_feed_link($year,$week,$feed_type); 
     609                        $alternate_link=get_week_link($year,$week); 
     610                        $comments_feed_link=get_week_comments_feed_link($year,$week,$feed_type); 
     611                } 
     612                elseif(empty($m)) { 
     613                        if(!empty($year_string)) { 
     614                                $year=$year_string; 
     615                        } 
     616                        if(!empty($month_string)) { 
     617                                $month=$month_string; 
     618                        } 
     619                        if(!empty($day_string)) { 
     620                                $day=$day_string; 
     621                        } 
     622                        if(!empty($hour_string)) { 
     623                                $hour=$hour_string; 
     624                        } 
     625                        if(!empty($minute_string)) { 
     626                                $minute=$minute_string; 
     627                        } 
     628                        if(!empty($second_string)) { 
     629                                $second=$second_string; 
     630                        } 
     631                } 
     632                else { 
     633                        $m_length=strlen($m); 
     634                        switch($m_length) { 
     635                                case 14: 
     636                                        $second=substr($m,12,2); 
     637                                case 12: 
     638                                        $minute=substr($m,10,2); 
     639                                case 10: 
     640                                        $hour=substr($m,8,2); 
     641                                case 8: 
     642                                        $day=substr($m,6,2); 
     643                                case 6: 
     644                                        $month=substr($m,4,2); 
     645                                case 4: 
     646                                        $year=substr($m,0,4); 
     647                                        break; 
     648                                default: 
     649                                        return false; 
     650                        } 
     651                } 
     652                if($canonical_feed_link===null) { 
     653                        $canonical_feed_link=get_archive_feed_link($year,$month,$day,$hour,$minute,$second,$feed_type); 
     654                } 
     655                if($alternate_link===null) { 
     656                        $alternate_link=get_archive_link($year,$month,$day,$hour,$minute,$second); 
     657                } 
     658                if($comments_feed_link===null) { 
     659                        $comments_feed_link=get_archive_comments_feed_link($year,$month,$day,$hour,$minute,$second,$feed_type); 
     660                } 
     661                echo_atom_feed_id($canonical_feed_link); 
     662                echo_atom_feed_links($canonical_feed_link,$alternate_link,$comments_feed_link); 
     663        } 
     664        else if(is_search()) { 
     665                $search_query=get_search_query(); 
     666                $canonical_feed_link=get_search_feed_link($search_query,$feed_type); 
     667                echo_atom_feed_id($canonical_feed_link); 
     668                echo_atom_feed_links($canonical_feed_link,get_search_link($search_query),get_search_comments_feed_link($search_query,$feed_type)); 
     669        } 
     670        else { 
     671                echo_atom_feed_subtitle(get_bloginfo_rss("description")); 
     672                echo_atom_feed_id(get_feed_link('atom',true)); 
     673                echo_atom_feed_links(get_bloginfo('atom_url'),trailingslashit(get_bloginfo_rss('url')),get_bloginfo_rss('comments_atom_url')); 
     674        } 
     675} 
  • link-template.php

     
    359359 * @param string $feed Optional, defaults to default feed. Feed type. 
    360360 * @return string 
    361361 */ 
    362 function get_feed_link($feed = '') { 
     362function get_feed_link($feed = '', $return_canonical_form = false) { 
    363363        global $wp_rewrite; 
    364364 
    365365        $permalink = $wp_rewrite->get_feed_permastruct(); 
    366         if ( '' != $permalink ) { 
     366        if ($return_canonical_form==true||empty($permalink)) { 
     367                if ( empty($feed) ) 
     368                        $feed = get_default_feed(); 
     369 
     370                if ( false !== strpos($feed, 'comments_') ) 
     371                        $feed = str_replace('comments_', 'comments-', $feed); 
     372 
     373                $output = trailingslashit(get_option('home')) . "?feed={$feed}"; 
     374        } 
     375        else { 
    367376                if ( false !== strpos($feed, 'comments_') ) { 
    368377                        $feed = str_replace('comments_', '', $feed); 
    369378                        $permalink = $wp_rewrite->get_comment_feed_permastruct(); 
     
    375384                $permalink = str_replace('%feed%', $feed, $permalink); 
    376385                $permalink = preg_replace('#/+#', '/', "/$permalink"); 
    377386                $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}"; 
    386387        } 
    387  
     388         
    388389        return apply_filters('feed_link', $output, $feed); 
    389390} 
    390391 
     
    397398 * @param string $feed Optional. Feed type. 
    398399 * @return string 
    399400 */ 
    400 function get_post_comments_feed_link($post_id = '', $feed = '') { 
     401function get_post_comments_feed_link($post_id = '', $feed = '', $return_canonical_form = false) { 
    401402        global $id; 
    402403 
    403404        if ( empty($post_id) ) 
     
    406407        if ( empty($feed) ) 
    407408                $feed = get_default_feed(); 
    408409 
    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 { 
     410        if ($return_canonical_form==true||empty($permalink)) { 
    415411                $type = get_post_field('post_type', $post_id); 
    416412                if ( 'page' == $type ) 
    417413                        $url = trailingslashit(get_option('home')) . "?feed=$feed&amp;page_id=$post_id"; 
    418414                else 
    419415                        $url = trailingslashit(get_option('home')) . "?feed=$feed&amp;p=$post_id"; 
    420416        } 
    421  
     417        else { 
     418                $url = trailingslashit( get_permalink($post_id) ) . 'feed'; 
     419                if ( $feed != get_default_feed() ) 
     420                        $url .= "/$feed"; 
     421                $url = user_trailingslashit($url, 'single_feed'); 
     422        } 
     423         
    422424        return apply_filters('post_comments_feed_link', $url); 
    423425} 
    424426 
     
    438440 * @param string $feed Optional. Feed format. 
    439441 * @return string Link to the comment feed for the current post. 
    440442*/ 
    441 function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) { 
    442         $url = get_post_comments_feed_link($post_id, $feed); 
     443function post_comments_feed_link( $link_text = '', $post_id = '', $feed = '', $return_canonical_form = false) { 
     444        $url = get_post_comments_feed_link($post_id, $feed, $return_canonical_form); 
    443445        if ( empty($link_text) ) 
    444446                $link_text = __('Comments Feed'); 
    445447 
     
    460462 * @param string $feed Optional. Feed type. 
    461463 * @return string Link to the feed for the author specified by $author_id. 
    462464*/ 
    463 function get_author_feed_link( $author_id, $feed = '' ) { 
     465function get_author_feed_link( $author_id, $feed = '', $return_canonical_form = false) { 
    464466        $author_id = (int) $author_id; 
    465467        $permalink_structure = get_option('permalink_structure'); 
    466468 
    467469        if ( empty($feed) ) 
    468470                $feed = get_default_feed(); 
    469471 
    470         if ( '' == $permalink_structure ) { 
     472        if ($return_canonical_form==true||empty($permalink_structure)) { 
    471473                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;author=" . $author_id; 
    472         } else { 
     474        } 
     475        else { 
    473476                $link = get_author_posts_url($author_id); 
    474477                if ( $feed == get_default_feed() ) 
    475478                        $feed_link = 'feed'; 
     
    484487        return $link; 
    485488} 
    486489 
     490function get_author_comments_feed_link($author_id, $feed = '', $return_canonical_form = false) { 
     491        $author_id = (int) $author_id; 
     492        $permalink_structure = get_option('permalink_structure'); 
     493 
     494        if ( empty($feed) ) 
     495                $feed = get_default_feed(); 
     496 
     497        if ($return_canonical_form==true||empty($permalink_structure)) { 
     498                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;author=" . $author_id; 
     499        } 
     500        else { 
     501                $link = get_author_posts_url($author_id); 
     502                if ( $feed == get_default_feed() ) 
     503                        $feed_link = 'comments/feed'; 
     504                else 
     505                        $feed_link = "comments/feed/$feed"; 
     506 
     507                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     508        } 
     509 
     510        $link = apply_filters('author_comments_feed_link', $link, $feed); 
     511 
     512        return $link; 
     513} 
     514 
    487515/** 
    488516 * Retrieve the feed link for a category. 
    489517 * 
     
    498526 * @param string $feed Optional. Feed type. 
    499527 * @return string Link to the feed for the category specified by $cat_id. 
    500528*/ 
    501 function get_category_feed_link($cat_id, $feed = '') { 
     529function get_category_feed_link($cat_id, $feed = '', $return_canonical_form = false) { 
    502530        $cat_id = (int) $cat_id; 
    503531 
    504532        $category = get_category($cat_id); 
     
    511539 
    512540        $permalink_structure = get_option('permalink_structure'); 
    513541 
    514         if ( '' == $permalink_structure ) { 
     542        if ($return_canonical_form==true||empty($permalink_structure)) { 
    515543                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;cat=" . $cat_id; 
    516         } else { 
     544        } 
     545        else { 
    517546                $link = get_category_link($cat_id); 
    518547                if( $feed == get_default_feed() ) 
    519548                        $feed_link = 'feed'; 
     
    528557        return $link; 
    529558} 
    530559 
     560function get_category_comments_feed_link($cat_id, $feed = '', $return_canonical_form = false) { 
     561        $cat_id = (int) $cat_id; 
     562 
     563        $category = get_category($cat_id); 
     564 
     565        if ( empty($category) || is_wp_error($category) ) 
     566                return false; 
     567 
     568        if ( empty($feed) ) 
     569                $feed = get_default_feed(); 
     570 
     571        $permalink_structure = get_option('permalink_structure'); 
     572 
     573        if ($return_canonical_form==true||empty($permalink_structure)) { 
     574                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;cat=" . $cat_id; 
     575        } 
     576        else { 
     577                $link = get_category_link($cat_id); 
     578                if( $feed == get_default_feed() ) 
     579                        $feed_link = 'comments/feed'; 
     580                else 
     581                        $feed_link = "comments/feed/$feed"; 
     582 
     583                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     584        } 
     585 
     586        $link = apply_filters('category_comments_feed_link', $link, $feed); 
     587 
     588        return $link; 
     589} 
     590 
    531591/** 
    532592 * Retrieve permalink for feed of tag. 
    533593 * 
     
    537597 * @param string $feed Optional. Feed type. 
    538598 * @return string 
    539599 */ 
    540 function get_tag_feed_link($tag_id, $feed = '') { 
     600function get_tag_feed_link($tag_id, $feed = '', $return_canonical_form = false) { 
    541601        $tag_id = (int) $tag_id; 
    542602 
    543603        $tag = get_tag($tag_id); 
     
    550610        if ( empty($feed) ) 
    551611                $feed = get_default_feed(); 
    552612 
    553         if ( '' == $permalink_structure ) { 
     613        if ($return_canonical_form==true||empty($permalink_structure)) { 
    554614                $link = trailingslashit(get_option('home')) . "?feed=$feed&amp;tag=" . $tag->slug; 
    555         } else { 
     615        } 
     616        else { 
    556617                $link = get_tag_link($tag->term_id); 
    557618                if ( $feed == get_default_feed() ) 
    558619                        $feed_link = 'feed'; 
     
    566627        return $link; 
    567628} 
    568629 
     630function get_tag_comments_feed_link($tag_id, $feed = '', $return_canonical_form = false) { 
     631        $tag_id = (int) $tag_id; 
     632 
     633        $tag = get_tag($tag_id); 
     634 
     635        if ( empty($tag) || is_wp_error($tag) ) 
     636                return false; 
     637 
     638        $permalink_structure = get_option('permalink_structure'); 
     639 
     640        if ( empty($feed) ) 
     641                $feed = get_default_feed(); 
     642 
     643        if ($return_canonical_form==true||empty($permalink_structure)) { 
     644                $link = trailingslashit(get_option('home')) . "?feed=comments-$feed&amp;tag=" . $tag->slug; 
     645        } 
     646        else { 
     647                $link = get_tag_link($tag->term_id); 
     648                if ( $feed == get_default_feed() ) 
     649                        $feed_link = 'comments/feed'; 
     650                else 
     651                        $feed_link = "comments/feed/$feed"; 
     652                $link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed'); 
     653        } 
     654 
     655        $link = apply_filters('tag_comments_feed_link', $link, $feed); 
     656 
     657        return $link; 
     658} 
     659 
    569660/** 
    570661 * Retrieve edit tag link. 
    571662 * 
     
    608699        echo $before . apply_filters( 'edit_tag_link', $link, $tag->term_id ) . $after; 
    609700} 
    610701 
     702function get_search_link($search_query) { 
     703        if (empty($search_query)) { 
     704                $search=attribute_escape(get_search_query()); 
     705        } 
     706        else { 
     707                $search=attribute_escape(stripslashes($search_query)); 
     708        } 
     709        $link=trailingslashit(get_option('home'))."?s=$search"; 
     710        $link=apply_filters('search_link',$link); 
     711        return $link; 
     712} 
     713 
    611714/** 
    612715 * Retrieve the permalink for the feed of the search results. 
    613716 * 
     
    658761        return $link; 
    659762} 
    660763 
     764function _archive_array_to_link($array) { 
     765        $link=$array[0]; 
     766        $array_length=count($array); 
     767        if($array_length>1) { 
     768                $link.="?$array[1]"; 
     769                if($array_length>2) { 
     770                        for($i=2;$i<$array_length;$i++) { 
     771                                $link.="&amp;$array[$i]"; 
     772                        } 
     773                } 
     774        } 
     775        return $link; 
     776} 
     777function get_archive_link($year,$month=null,$day=null,$hour=null,$minute=null,$second=null,$return_array=false) { 
     778        $array=array(trailingslashit(get_option('home'))); 
     779        if($year!==null) { 
     780                $year=(int)$year; 
     781                if($year<=0) { 
     782                        return false; 
     783                } 
     784                $array[]="year=$year"; 
     785        } 
     786        if($month!==null) { 
     787                $month=(int)$month; 
     788                if($month<1||$month>12) { 
     789                        return false; 
     790                } 
     791                $array[]="monthnum=$month"; 
     792        } 
     793        if($day!==null) { 
     794                $day=(int)$day; 
     795                if($day<1||$day>31) { 
     796                        return false; 
     797                } 
     798                $array[]="day=$day"; 
     799        } 
     800        if($hour!==null) { 
     801                $hour=(int)$hour; 
     802                if($hour<0||$hour>23) { 
     803                        return false; 
     804                } 
     805                $array[]="hour=$hour"; 
     806        } 
     807        if($minute!==null) { 
     808                $minute=(int)$minute; 
     809                if($minute<0||$minute>60) { 
     810                        return false; 
     811                } 
     812                $array[]="minute=$minute"; 
     813        } 
     814        if($second!==null) { 
     815                $second=(int)$second; 
     816                if($second<0||$second>60) { 
     817                        return false; 
     818                } 
     819                $array[]="second=$second"; 
     820        } 
     821        if($return_array==true) { 
     822                return $array; 
     823        } 
     824        else { 
     825                return apply_filters('archive_link',_archive_array_to_link($array)); 
     826        } 
     827} 
     828function get_archive_feed_link($year,$month=null,$day=null,$hour=null,$minute=null,$second=null,$feed='') { 
     829        $array=get_archive_link($year,$month,$day,$hour,$minute,$second,true); 
     830        if($array===false) { 
     831                return false; 
     832        } 
     833        if(empty($feed)) { 
     834                $feed=get_default_feed(); 
     835        } 
     836        $array[]="feed=$feed"; 
     837        return apply_filters('archive_feed_link',_archive_array_to_link($array),$feed); 
     838} 
     839function get_archive_comments_feed_link($year,$month=null,$day=null,$hour=null,$minute=null,$second=null,$feed='') { 
     840        $array=get_archive_link($year,$month,$day,$hour,$minute,$second,true); 
     841        if($array===false) { 
     842                return false; 
     843        } 
     844        if(empty($feed)) { 
     845                $feed=get_default_feed(); 
     846        } 
     847        $array[]="feed=comments-$feed"; 
     848        return apply_filters('archive_comments_feed_link',_archive_array_to_link($array),$feed); 
     849} 
     850function get_week_link($year,$week,$return_array=false) { 
     851        $array=get_archive_link($year,null,null,null,null,null,true); 
     852        $week=(int)$week; 
     853        if($array===false||$week<0||$week>53) { 
     854                return false; 
     855        } 
     856        $array[]="w=$week"; 
     857        if($return_array==true) { 
     858                return $array; 
     859        } 
     860        else { 
     861                return apply_filters('week_link',_archive_array_to_link($array)); 
     862        } 
     863} 
     864function get_week_feed_link($year,$week,$feed='') { 
     865        $array=get_week_link($year,$week,true); 
     866        if($array===false) { 
     867                return false; 
     868        } 
     869        if(empty($feed)) { 
     870                $feed=get_default_feed(); 
     871        } 
     872        $array[]="feed=$feed"; 
     873        return apply_filters('week_feed_link',_archive_array_to_link($array),$feed); 
     874} 
     875function get_week_comments_feed_link($year,$week,$feed='') { 
     876        $array=get_week_link($year,$week,true); 
     877        if($array===false) { 
     878                return false; 
     879        } 
     880        if(empty($feed)) { 
     881                $feed=get_default_feed(); 
     882        } 
     883        $array[]="feed=comments-$feed"; 
     884        return apply_filters('week_comments_feed_link',_archive_array_to_link($array),$feed); 
     885} 
     886 
    661887/** 
    662888 * Retrieve edit posts link for post. 
    663889 * 
  • query.php

     
    1111 * @subpackage Query 
    1212 */ 
    1313 
     14function get_query_object_id() { 
     15        global $wp_query; 
     16        return $wp_query->get_queried_object_id(); 
     17} 
     18 
    1419/** 
    1520 * Retrieve variable in the WP_Query class. 
    1621 *