Make WordPress Core

Changeset 4378


Ignore:
Timestamp:
10/11/2006 11:03:17 PM (20 years ago)
Author:
markjaquith
Message:

The changing of the pies. Now using SimplePie. props to gsnedders. fixes #2864

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/index.php

    r4349 r4378  
    1717
    1818<?php
    19 $rss = @fetch_rss('http://feeds.technorati.com/cosmos/rss/?url='. trailingslashit(get_option('home')) .'&partner=wordpress');
    20 if ( isset($rss->items) && 0 != count($rss->items) ) {
     19$rss = fetch_simplepie('http://feeds.technorati.com/cosmos/rss/?url='. trailingslashit(get_option('home')) .'&partner=wordpress');
     20if ( $rss && $rss->get_item_quantity() > 0 ) {
    2121?>
    2222<div id="incominglinks">
     
    2424<ul>
    2525<?php
    26 $rss->items = array_slice($rss->items, 0, 10);
    27 foreach ($rss->items as $item ) {
     26foreach ($rss->get_items(0, 10) as $item ) {
    2827?>
    29         <li><a href="<?php echo wp_filter_kses($item['link']); ?>"><?php echo wptexturize(wp_specialchars($item['title'])); ?></a></li>
     28        <li><a href="<?php echo wp_filter_kses($item->get_permalink()); ?>"><?php echo wptexturize(wp_specialchars($item->get_title())); ?></a></li>
    3029<?php } ?>
    3130</ul>
     
    130129<p><?php _e("Need help with WordPress? Please see our <a href='http://codex.wordpress.org/'>documentation</a> or visit the <a href='http://wordpress.org/support/'>support forums</a>."); ?></p>
    131130<?php
    132 $rss = @fetch_rss('http://wordpress.org/development/feed/');
    133 if ( isset($rss->items) && 0 != count($rss->items) ) {
     131$rss = fetch_simplepie('http://wordpress.org/development/feed/');
     132if ( $rss && $rss->get_item_quantity() > 0 ) {
    134133?>
    135134<div id="devnews">
    136135<h3><?php _e('WordPress Development Blog'); ?></h3>
    137136<?php
    138 $rss->items = array_slice($rss->items, 0, 3);
    139 foreach ($rss->items as $item ) {
     137foreach ($rss->get_items(0, 3) as $item ) {
    140138?>
    141 <h4><a href='<?php echo wp_filter_kses($item['link']); ?>'><?php echo wp_specialchars($item['title']); ?></a> &#8212; <?php printf(__('%s ago'), human_time_diff(strtotime($item['pubdate'], time() ) ) ); ?></h4>
    142 <p><?php echo $item['description']; ?></p>
     139<h4><a href='<?php echo wp_filter_kses($item->get_permalink()); ?>'><?php echo wp_specialchars($item->get_title()); ?></a> &#8212; <?php printf(__('%s ago'), human_time_diff( $item->get_date('U') ) ); ?></h4>
     140<p><?php echo $item->get_description(); ?></p>
    143141<?php
    144142        }
     
    148146
    149147<?php
    150 $rss = @fetch_rss('http://planet.wordpress.org/feed/');
    151 if ( isset($rss->items) && 0 != count($rss->items) ) {
     148$rss = fetch_simplepie('http://planet.wordpress.org/feed/');
     149if ( $rss && $rss->get_item_quantity() > 0 ) {
    152150?>
    153151<div id="planetnews">
     
    155153<ul>
    156154<?php
    157 $rss->items = array_slice($rss->items, 0, 20);
    158 foreach ($rss->items as $item ) {
    159 $title = wp_specialchars($item['title']);
    160 $author = preg_replace( '|(.+?):.+|s', '$1', $item['title'] );
    161 $post = preg_replace( '|.+?:(.+)|s', '$1', $item['title'] );
     155foreach ($rss->get_items(0, 20) as $item ) {
     156$title = wp_specialchars($item->get_title());
     157$author = preg_replace( '|(.+?):.+|s', '$1', $item->get_title() );
     158$post = preg_replace( '|.+?:(.+)|s', '$1', $item->get_title() );
    162159?>
    163 <li><a href='<?php echo wp_filter_kses($item['link']); ?>'><span class="post"><?php echo $post; ?></span><span class="hidden"> - </span><cite><?php echo $author; ?></cite></a></li>
     160<li><a href='<?php echo wp_filter_kses($item->get_permalink()); ?>'><span class="post"><?php echo $post; ?></span><span class="hidden"> - </span><cite><?php echo $author; ?></cite></a></li>
    164161<?php
    165162        }
  • trunk/wp-includes/rss.php

    r3862 r4378  
    11<?php
    2 /*
    3  * Project:     MagpieRSS: a simple RSS integration tool
    4  * File:        A compiled file for RSS syndication
    5  * Author:      Kellan Elliott-McCrea <kellan@protest.net>
    6  * Version:             0.51
    7  * License:             GPL
    8  */
    92
    10 define('RSS', 'RSS');
    11 define('ATOM', 'Atom');
    12 define('MAGPIE_USER_AGENT', 'WordPress/' . $wp_version);
     3require_once('simplepie.php');
    134
    14 class MagpieRSS {
    15         var $parser;
    16         var $current_item       = array();      // item currently being parsed
    17         var $items                      = array();      // collection of parsed items
    18         var $channel            = array();      // hash of channel fields
    19         var $textinput          = array();
    20         var $image                      = array();
    21         var $feed_type;
    22         var $feed_version;
    23 
    24         // parser variables
    25         var $stack                              = array(); // parser stack
    26         var $inchannel                  = false;
    27         var $initem                     = false;
    28         var $incontent                  = false; // if in Atom <content mode="xml"> field
    29         var $intextinput                = false;
    30         var $inimage                    = false;
    31         var $current_field              = '';
    32         var $current_namespace  = false;
    33 
    34         //var $ERROR = "";
    35 
    36         var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright');
    37 
    38         function MagpieRSS ($source) {
    39 
    40                 # if PHP xml isn't compiled in, die
    41                 #
    42                 if ( !function_exists('xml_parser_create') )
    43                         trigger_error( "Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php" );
    44 
    45                 $parser = @xml_parser_create();
    46 
    47                 if ( !is_resource($parser) )
    48                         trigger_error( "Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php");
    49 
    50 
    51                 $this->parser = $parser;
    52 
    53                 # pass in parser, and a reference to this object
    54                 # setup handlers
    55                 #
    56                 xml_set_object( $this->parser, $this );
    57                 xml_set_element_handler($this->parser,
    58                                 'feed_start_element', 'feed_end_element' );
    59 
    60                 xml_set_character_data_handler( $this->parser, 'feed_cdata' );
    61 
    62                 $status = xml_parse( $this->parser, $source );
    63 
    64                 if (! $status ) {
    65                         $errorcode = xml_get_error_code( $this->parser );
    66                         if ( $errorcode != XML_ERROR_NONE ) {
    67                                 $xml_error = xml_error_string( $errorcode );
    68                                 $error_line = xml_get_current_line_number($this->parser);
    69                                 $error_col = xml_get_current_column_number($this->parser);
    70                                 $errormsg = "$xml_error at line $error_line, column $error_col";
    71 
    72                                 $this->error( $errormsg );
    73                         }
     5class WordPress_SimplePie_Cache extends SimplePie_Cache {
     6        var $name;
     7       
     8        function WordPress_SimplePie_Cache($location, $filename, $extension) {
     9                $this->name = rawurlencode($filename);
     10        }
     11       
     12        function save($data) {
     13                $cache_option = "rss_$this->name";
     14                $cache_timestamp = $cache_option . '_ts';
     15                if ( false !== get_option($cache_option) ) {
     16                        update_option($cache_option, $data);
     17                } else {
     18                        add_option($cache_option, $data, '', 'no');
    7419                }
    75 
    76                 xml_parser_free( $this->parser );
    77 
    78                 $this->normalize();
     20                if ( false !== get_option($cache_timestamp) ) {
     21                        update_option($cache_timestamp, time());
     22                } else {
     23                        add_option($cache_timestamp, time(), '', 'no');
     24                }
     25                return true;
    7926        }
    80 
    81         function feed_start_element($p, $element, &$attrs) {
    82                 $el = $element = strtolower($element);
    83                 $attrs = array_change_key_case($attrs, CASE_LOWER);
    84 
    85                 // check for a namespace, and split if found
    86                 $ns     = false;
    87                 if ( strpos( $element, ':' ) ) {
    88                         list($ns, $el) = split( ':', $element, 2);
    89                 }
    90                 if ( $ns and $ns != 'rdf' ) {
    91                         $this->current_namespace = $ns;
    92                 }
    93 
    94                 # if feed type isn't set, then this is first element of feed
    95                 # identify feed from root element
    96                 #
    97                 if (!isset($this->feed_type) ) {
    98                         if ( $el == 'rdf' ) {
    99                                 $this->feed_type = RSS;
    100                                 $this->feed_version = '1.0';
    101                         }
    102                         elseif ( $el == 'rss' ) {
    103                                 $this->feed_type = RSS;
    104                                 $this->feed_version = $attrs['version'];
    105                         }
    106                         elseif ( $el == 'feed' ) {
    107                                 $this->feed_type = ATOM;
    108                                 $this->feed_version = $attrs['version'];
    109                                 $this->inchannel = true;
    110                         }
    111                         return;
    112                 }
    113 
    114                 if ( $el == 'channel' )
    115                 {
    116                         $this->inchannel = true;
    117                 }
    118                 elseif ($el == 'item' or $el == 'entry' )
    119                 {
    120                         $this->initem = true;
    121                         if ( isset($attrs['rdf:about']) ) {
    122                                 $this->current_item['about'] = $attrs['rdf:about'];
    123                         }
    124                 }
    125 
    126                 // if we're in the default namespace of an RSS feed,
    127                 //  record textinput or image fields
    128                 elseif (
    129                         $this->feed_type == RSS and
    130                         $this->current_namespace == '' and
    131                         $el == 'textinput' )
    132                 {
    133                         $this->intextinput = true;
    134                 }
    135 
    136                 elseif (
    137                         $this->feed_type == RSS and
    138                         $this->current_namespace == '' and
    139                         $el == 'image' )
    140                 {
    141                         $this->inimage = true;
    142                 }
    143 
    144                 # handle atom content constructs
    145                 elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
    146                 {
    147                         // avoid clashing w/ RSS mod_content
    148                         if ($el == 'content' ) {
    149                                 $el = 'atom_content';
    150                         }
    151 
    152                         $this->incontent = $el;
    153 
    154 
    155                 }
    156 
    157                 // if inside an Atom content construct (e.g. content or summary) field treat tags as text
    158                 elseif ($this->feed_type == ATOM and $this->incontent )
    159                 {
    160                         // if tags are inlined, then flatten
    161                         $attrs_str = join(' ',
    162                                         array_map('map_attrs',
    163                                         array_keys($attrs),
    164                                         array_values($attrs) ) );
    165 
    166                         $this->append_content( "<$element $attrs_str>"  );
    167 
    168                         array_unshift( $this->stack, $el );
    169                 }
    170 
    171                 // Atom support many links per containging element.
    172                 // Magpie treats link elements of type rel='alternate'
    173                 // as being equivalent to RSS's simple link element.
    174                 //
    175                 elseif ($this->feed_type == ATOM and $el == 'link' )
    176                 {
    177                         if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' )
    178                         {
    179                                 $link_el = 'link';
    180                         }
    181                         else {
    182                                 $link_el = 'link_' . $attrs['rel'];
    183                         }
    184 
    185                         $this->append($link_el, $attrs['href']);
    186                 }
    187                 // set stack[0] to current element
    188                 else {
    189                         array_unshift($this->stack, $el);
     27       
     28        function load() {
     29                return get_option("rss_$this->name");
     30        }
     31       
     32        function mtime() {
     33                return get_option('rss_' . $this->name . '_ts');
     34        }
     35       
     36        function touch() {
     37                $cache_timestamp = 'rss_' . $this->name . '_ts';
     38                if ( false !== get_option($cache_timestamp) ) {
     39                        update_option($cache_timestamp, time());
     40                } else {
     41                        add_option($cache_timestamp, time(), '', 'no');
    19042                }
    19143        }
    192 
    193 
    194 
    195         function feed_cdata ($p, $text) {
    196 
    197                 if ($this->feed_type == ATOM and $this->incontent)
    198                 {
    199                         $this->append_content( $text );
    200                 }
    201                 else {
    202                         $current_el = join('_', array_reverse($this->stack));
    203                         $this->append($current_el, $text);
    204                 }
    205         }
    206 
    207         function feed_end_element ($p, $el) {
    208                 $el = strtolower($el);
    209 
    210                 if ( $el == 'item' or $el == 'entry' )
    211                 {
    212                         $this->items[] = $this->current_item;
    213                         $this->current_item = array();
    214                         $this->initem = false;
    215                 }
    216                 elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' )
    217                 {
    218                         $this->intextinput = false;
    219                 }
    220                 elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' )
    221                 {
    222                         $this->inimage = false;
    223                 }
    224                 elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
    225                 {
    226                         $this->incontent = false;
    227                 }
    228                 elseif ($el == 'channel' or $el == 'feed' )
    229                 {
    230                         $this->inchannel = false;
    231                 }
    232                 elseif ($this->feed_type == ATOM and $this->incontent  ) {
    233                         // balance tags properly
    234                         // note:  i don't think this is actually neccessary
    235                         if ( $this->stack[0] == $el )
    236                         {
    237                                 $this->append_content("</$el>");
    238                         }
    239                         else {
    240                                 $this->append_content("<$el />");
    241                         }
    242 
    243                         array_shift( $this->stack );
    244                 }
    245                 else {
    246                         array_shift( $this->stack );
    247                 }
    248 
    249                 $this->current_namespace = false;
    250         }
    251 
    252         function concat (&$str1, $str2="") {
    253                 if (!isset($str1) ) {
    254                         $str1="";
    255                 }
    256                 $str1 .= $str2;
    257         }
    258 
    259         function append_content($text) {
    260                 if ( $this->initem ) {
    261                         $this->concat( $this->current_item[ $this->incontent ], $text );
    262                 }
    263                 elseif ( $this->inchannel ) {
    264                         $this->concat( $this->channel[ $this->incontent ], $text );
    265                 }
    266         }
    267 
    268         // smart append - field and namespace aware
    269         function append($el, $text) {
    270                 if (!$el) {
    271                         return;
    272                 }
    273                 if ( $this->current_namespace )
    274                 {
    275                         if ( $this->initem ) {
    276                                 $this->concat(
    277                                         $this->current_item[ $this->current_namespace ][ $el ], $text);
    278                         }
    279                         elseif ($this->inchannel) {
    280                                 $this->concat(
    281                                         $this->channel[ $this->current_namespace][ $el ], $text );
    282                         }
    283                         elseif ($this->intextinput) {
    284                                 $this->concat(
    285                                         $this->textinput[ $this->current_namespace][ $el ], $text );
    286                         }
    287                         elseif ($this->inimage) {
    288                                 $this->concat(
    289                                         $this->image[ $this->current_namespace ][ $el ], $text );
    290                         }
    291                 }
    292                 else {
    293                         if ( $this->initem ) {
    294                                 $this->concat(
    295                                         $this->current_item[ $el ], $text);
    296                         }
    297                         elseif ($this->intextinput) {
    298                                 $this->concat(
    299                                         $this->textinput[ $el ], $text );
    300                         }
    301                         elseif ($this->inimage) {
    302                                 $this->concat(
    303                                         $this->image[ $el ], $text );
    304                         }
    305                         elseif ($this->inchannel) {
    306                                 $this->concat(
    307                                         $this->channel[ $el ], $text );
    308                         }
    309 
    310                 }
    311         }
    312 
    313         function normalize () {
    314                 // if atom populate rss fields
    315                 if ( $this->is_atom() ) {
    316                         $this->channel['descripton'] = $this->channel['tagline'];
    317                         for ( $i = 0; $i < count($this->items); $i++) {
    318                                 $item = $this->items[$i];
    319                                 if ( isset($item['summary']) )
    320                                         $item['description'] = $item['summary'];
    321                                 if ( isset($item['atom_content']))
    322                                         $item['content']['encoded'] = $item['atom_content'];
    323 
    324                                 $this->items[$i] = $item;
    325                         }
    326                 }
    327                 elseif ( $this->is_rss() ) {
    328                         $this->channel['tagline'] = $this->channel['description'];
    329                         for ( $i = 0; $i < count($this->items); $i++) {
    330                                 $item = $this->items[$i];
    331                                 if ( isset($item['description']))
    332                                         $item['summary'] = $item['description'];
    333                                 if ( isset($item['content']['encoded'] ) )
    334                                         $item['atom_content'] = $item['content']['encoded'];
    335 
    336                                 $this->items[$i] = $item;
    337                         }
    338                 }
    339         }
    340 
    341         function is_rss () {
    342                 if ( $this->feed_type == RSS ) {
    343                         return $this->feed_version;
    344                 }
    345                 else {
    346                         return false;
    347                 }
    348         }
    349 
    350         function is_atom() {
    351                 if ( $this->feed_type == ATOM ) {
    352                         return $this->feed_version;
    353                 }
    354                 else {
    355                         return false;
    356                 }
    357         }
    358 
    359         function map_attrs($k, $v) {
    360                 return "$k=\"$v\"";
    361         }
    362 
    363         function error( $errormsg, $lvl = E_USER_WARNING ) {
    364                 // append PHP's error message if track_errors enabled
    365                 if ( isset($php_errormsg) ) {
    366                         $errormsg .= " ($php_errormsg)";
    367                 }
    368                 if ( MAGPIE_DEBUG ) {
    369                         trigger_error( $errormsg, $lvl);
    370                 } else {
    371                         error_log( $errormsg, 0);
    372                 }
    373         }
    374 
    375 }
    376 require_once( dirname(__FILE__) . '/class-snoopy.php');
    377 
    378 function fetch_rss ($url) {
    379         // initialize constants
    380         init();
    381 
    382         if ( !isset($url) ) {
    383                 // error("fetch_rss called without a url");
    384                 return false;
    385         }
    386 
    387         // if cache is disabled
    388         if ( !MAGPIE_CACHE_ON ) {
    389                 // fetch file, and parse it
    390                 $resp = _fetch_remote_file( $url );
    391                 if ( is_success( $resp->status ) ) {
    392                         return _response_to_rss( $resp );
    393                 }
    394                 else {
    395                         // error("Failed to fetch $url and cache is off");
    396                         return false;
    397                 }
    398         }
    399         // else cache is ON
    400         else {
    401                 // Flow
    402                 // 1. check cache
    403                 // 2. if there is a hit, make sure its fresh
    404                 // 3. if cached obj fails freshness check, fetch remote
    405                 // 4. if remote fails, return stale object, or error
    406 
    407                 $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );
    408 
    409                 if (MAGPIE_DEBUG and $cache->ERROR) {
    410                         debug($cache->ERROR, E_USER_WARNING);
    411                 }
    412 
    413 
    414                 $cache_status    = 0;           // response of check_cache
    415                 $request_headers = array(); // HTTP headers to send with fetch
    416                 $rss                     = 0;           // parsed RSS object
    417                 $errormsg                = 0;           // errors, if any
    418 
    419                 if (!$cache->ERROR) {
    420                         // return cache HIT, MISS, or STALE
    421                         $cache_status = $cache->check_cache( $url );
    422                 }
    423 
    424                 // if object cached, and cache is fresh, return cached obj
    425                 if ( $cache_status == 'HIT' ) {
    426                         $rss = $cache->get( $url );
    427                         if ( isset($rss) and $rss ) {
    428                                 $rss->from_cache = 1;
    429                                 if ( MAGPIE_DEBUG > 1) {
    430                                 debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
    431                         }
    432                                 return $rss;
    433                         }
    434                 }
    435 
    436                 // else attempt a conditional get
    437 
    438                 // setup headers
    439                 if ( $cache_status == 'STALE' ) {
    440                         $rss = $cache->get( $url );
    441                         if ( $rss->etag and $rss->last_modified ) {
    442                                 $request_headers['If-None-Match'] = $rss->etag;
    443                                 $request_headers['If-Last-Modified'] = $rss->last_modified;
    444                         }
    445                 }
    446 
    447                 $resp = _fetch_remote_file( $url, $request_headers );
    448 
    449                 if (isset($resp) and $resp) {
    450                         if ($resp->status == '304' ) {
    451                                 // we have the most current copy
    452                                 if ( MAGPIE_DEBUG > 1) {
    453                                         debug("Got 304 for $url");
    454                                 }
    455                                 // reset cache on 304 (at minutillo insistent prodding)
    456                                 $cache->set($url, $rss);
    457                                 return $rss;
    458                         }
    459                         elseif ( is_success( $resp->status ) ) {
    460                                 $rss = _response_to_rss( $resp );
    461                                 if ( $rss ) {
    462                                         if (MAGPIE_DEBUG > 1) {
    463                                                 debug("Fetch successful");
    464                                         }
    465                                         // add object to cache
    466                                         $cache->set( $url, $rss );
    467                                         return $rss;
    468                                 }
    469                         }
    470                         else {
    471                                 $errormsg = "Failed to fetch $url. ";
    472                                 if ( $resp->error ) {
    473                                         # compensate for Snoopy's annoying habbit to tacking
    474                                         # on '\n'
    475                                         $http_error = substr($resp->error, 0, -2);
    476                                         $errormsg .= "(HTTP Error: $http_error)";
    477                                 }
    478                                 else {
    479                                         $errormsg .=  "(HTTP Response: " . $resp->response_code .')';
    480                                 }
    481                         }
    482                 }
    483                 else {
    484                         $errormsg = "Unable to retrieve RSS file for unknown reasons.";
    485                 }
    486 
    487                 // else fetch failed
    488 
    489                 // attempt to return cached object
    490                 if ($rss) {
    491                         if ( MAGPIE_DEBUG ) {
    492                                 debug("Returning STALE object for $url");
    493                         }
    494                         return $rss;
    495                 }
    496 
    497                 // else we totally failed
    498                 // error( $errormsg );
    499 
    500                 return false;
    501 
    502         } // end if ( !MAGPIE_CACHE_ON ) {
    503 } // end fetch_rss()
    504 
    505 function _fetch_remote_file ($url, $headers = "" ) {
    506         // Snoopy is an HTTP client in PHP
    507         $client = new Snoopy();
    508         $client->agent = MAGPIE_USER_AGENT;
    509         $client->read_timeout = MAGPIE_FETCH_TIME_OUT;
    510         $client->use_gzip = MAGPIE_USE_GZIP;
    511         if (is_array($headers) ) {
    512                 $client->rawheaders = $headers;
    513         }
    514 
    515         @$client->fetch($url);
    516         return $client;
    517 
    518 }
    519 
    520 function _response_to_rss ($resp) {
    521         $rss = new MagpieRSS( $resp->results );
    522 
    523         // if RSS parsed successfully
    524         if ( $rss and !$rss->ERROR) {
    525 
    526                 // find Etag, and Last-Modified
    527                 foreach($resp->headers as $h) {
    528                         // 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1"
    529                         if (strpos($h, ": ")) {
    530                                 list($field, $val) = explode(": ", $h, 2);
    531                         }
    532                         else {
    533                                 $field = $h;
    534                                 $val = "";
    535                         }
    536 
    537                         if ( $field == 'ETag' ) {
    538                                 $rss->etag = $val;
    539                         }
    540 
    541                         if ( $field == 'Last-Modified' ) {
    542                                 $rss->last_modified = $val;
    543                         }
    544                 }
    545 
    546                 return $rss;
    547         } // else construct error message
    548         else {
    549                 $errormsg = "Failed to parse RSS file.";
    550 
    551                 if ($rss) {
    552                         $errormsg .= " (" . $rss->ERROR . ")";
    553                 }
    554                 // error($errormsg);
    555 
    556                 return false;
    557         } // end if ($rss and !$rss->error)
    558 }
    559 
    560 /*=======================================================================*\
    561         Function:       init
    562         Purpose:        setup constants with default values
    563                                 check for user overrides
    564 \*=======================================================================*/
    565 function init () {
    566         if ( defined('MAGPIE_INITALIZED') ) {
    567                 return;
    568         }
    569         else {
    570                 define('MAGPIE_INITALIZED', 1);
    571         }
    572 
    573         if ( !defined('MAGPIE_CACHE_ON') ) {
    574                 define('MAGPIE_CACHE_ON', 1);
    575         }
    576 
    577         if ( !defined('MAGPIE_CACHE_DIR') ) {
    578                 define('MAGPIE_CACHE_DIR', './cache');
    579         }
    580 
    581         if ( !defined('MAGPIE_CACHE_AGE') ) {
    582                 define('MAGPIE_CACHE_AGE', 60*60); // one hour
    583         }
    584 
    585         if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) {
    586                 define('MAGPIE_CACHE_FRESH_ONLY', 0);
    587         }
    588 
    589                 if ( !defined('MAGPIE_DEBUG') ) {
    590                 define('MAGPIE_DEBUG', 0);
    591         }
    592 
    593         if ( !defined('MAGPIE_USER_AGENT') ) {
    594                 $ua = 'WordPress/' . $wp_version;
    595 
    596                 if ( MAGPIE_CACHE_ON ) {
    597                         $ua = $ua . ')';
    598                 }
    599                 else {
    600                         $ua = $ua . '; No cache)';
    601                 }
    602 
    603                 define('MAGPIE_USER_AGENT', $ua);
    604         }
    605 
    606         if ( !defined('MAGPIE_FETCH_TIME_OUT') ) {
    607                 define('MAGPIE_FETCH_TIME_OUT', 2);     // 2 second timeout
    608         }
    609 
    610         // use gzip encoding to fetch rss files if supported?
    611         if ( !defined('MAGPIE_USE_GZIP') ) {
    612                 define('MAGPIE_USE_GZIP', true);
     44       
     45        function unlink() {
     46                delete_option("rss_$this->name");
     47                delete_option('rss_' . $this->name . '_ts');
    61348        }
    61449}
    61550
    616 function is_info ($sc) {
    617         return $sc >= 100 && $sc < 200;
    618 }
    619 
    620 function is_success ($sc) {
    621         return $sc >= 200 && $sc < 300;
    622 }
    623 
    624 function is_redirect ($sc) {
    625         return $sc >= 300 && $sc < 400;
    626 }
    627 
    628 function is_error ($sc) {
    629         return $sc >= 400 && $sc < 600;
    630 }
    631 
    632 function is_client_error ($sc) {
    633         return $sc >= 400 && $sc < 500;
    634 }
    635 
    636 function is_server_error ($sc) {
    637         return $sc >= 500 && $sc < 600;
    638 }
    639 
    640 class RSSCache {
    641         var $BASE_CACHE = 'wp-content/cache';   // where the cache files are stored
    642         var $MAX_AGE    = 43200;                // when are files stale, default twelve hours
    643         var $ERROR              = '';                   // accumulate error messages
    644 
    645         function RSSCache ($base='', $age='') {
    646                 if ( $base ) {
    647                         $this->BASE_CACHE = $base;
    648                 }
    649                 if ( $age ) {
    650                         $this->MAX_AGE = $age;
    651                 }
    652 
    653         }
    654 
    655 /*=======================================================================*\
    656         Function:       set
    657         Purpose:        add an item to the cache, keyed on url
    658         Input:          url from wich the rss file was fetched
    659         Output:         true on sucess
    660 \*=======================================================================*/
    661         function set ($url, $rss) {
    662                 global $wpdb;
    663                 $cache_option = 'rss_' . $this->file_name( $url );
    664                 $cache_timestamp = 'rss_' . $this->file_name( $url ) . '_ts';
    665 
    666                 if ( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$cache_option'") )
    667                         add_option($cache_option, '', '', 'no');
    668                 if ( !$wpdb->get_var("SELECT option_name FROM $wpdb->options WHERE option_name = '$cache_timestamp'") )
    669                         add_option($cache_timestamp, '', '', 'no');
    670 
    671                 update_option($cache_option, $rss);
    672                 update_option($cache_timestamp, time() );
    673 
    674                 return $cache_option;
    675         }
    676 
    677 /*=======================================================================*\
    678         Function:       get
    679         Purpose:        fetch an item from the cache
    680         Input:          url from wich the rss file was fetched
    681         Output:         cached object on HIT, false on MISS
    682 \*=======================================================================*/
    683         function get ($url) {
    684                 $this->ERROR = "";
    685                 $cache_option = 'rss_' . $this->file_name( $url );
    686 
    687                 if ( ! get_option( $cache_option ) ) {
    688                         $this->debug(
    689                                 "Cache doesn't contain: $url (cache option: $cache_option)"
    690                         );
    691                         return 0;
    692                 }
    693 
    694                 $rss = get_option( $cache_option );
    695 
    696                 return $rss;
    697         }
    698 
    699 /*=======================================================================*\
    700         Function:       check_cache
    701         Purpose:        check a url for membership in the cache
    702                                 and whether the object is older then MAX_AGE (ie. STALE)
    703         Input:          url from wich the rss file was fetched
    704         Output:         cached object on HIT, false on MISS
    705 \*=======================================================================*/
    706         function check_cache ( $url ) {
    707                 $this->ERROR = "";
    708                 $cache_option = $this->file_name( $url );
    709                 $cache_timestamp = 'rss_' . $this->file_name( $url ) . '_ts';
    710 
    711                 if ( $mtime = get_option($cache_timestamp) ) {
    712                         // find how long ago the file was added to the cache
    713                         // and whether that is longer then MAX_AGE
    714                         $age = time() - $mtime;
    715                         if ( $this->MAX_AGE > $age ) {
    716                                 // object exists and is current
    717                                 return 'HIT';
    718                         }
    719                         else {
    720                                 // object exists but is old
    721                                 return 'STALE';
    722                         }
    723                 }
    724                 else {
    725                         // object does not exist
    726                         return 'MISS';
    727                 }
    728         }
    729 
    730 /*=======================================================================*\
    731         Function:       serialize
    732 \*=======================================================================*/
    733         function serialize ( $rss ) {
    734                 return serialize( $rss );
    735         }
    736 
    737 /*=======================================================================*\
    738         Function:       unserialize
    739 \*=======================================================================*/
    740         function unserialize ( $data ) {
    741                 return unserialize( $data );
    742         }
    743 
    744 /*=======================================================================*\
    745         Function:       file_name
    746         Purpose:        map url to location in cache
    747         Input:          url from wich the rss file was fetched
    748         Output:         a file name
    749 \*=======================================================================*/
    750         function file_name ($url) {
    751                 return md5( $url );
    752         }
    753 
    754 /*=======================================================================*\
    755         Function:       error
    756         Purpose:        register error
    757 \*=======================================================================*/
    758         function error ($errormsg, $lvl=E_USER_WARNING) {
    759                 // append PHP's error message if track_errors enabled
    760                 if ( isset($php_errormsg) ) {
    761                         $errormsg .= " ($php_errormsg)";
    762                 }
    763                 $this->ERROR = $errormsg;
    764                 if ( MAGPIE_DEBUG ) {
    765                         trigger_error( $errormsg, $lvl);
    766                 }
    767                 else {
    768                         error_log( $errormsg, 0);
    769                 }
    770         }
    771                         function debug ($debugmsg, $lvl=E_USER_NOTICE) {
    772                 if ( MAGPIE_DEBUG ) {
    773                         $this->error("MagpieRSS [debug] $debugmsg", $lvl);
    774                 }
    775         }
    776 }
    777 
    778 function parse_w3cdtf ( $date_str ) {
    779 
    780         # regex to match wc3dtf
    781         $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
    782 
    783         if ( preg_match( $pat, $date_str, $match ) ) {
    784                 list( $year, $month, $day, $hours, $minutes, $seconds) =
    785                         array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]);
    786 
    787                 # calc epoch for current date assuming GMT
    788                 $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);
    789 
    790                 $offset = 0;
    791                 if ( $match[10] == 'Z' ) {
    792                         # zulu time, aka GMT
    793                 }
    794                 else {
    795                         list( $tz_mod, $tz_hour, $tz_min ) =
    796                                 array( $match[8], $match[9], $match[10]);
    797 
    798                         # zero out the variables
    799                         if ( ! $tz_hour ) { $tz_hour = 0; }
    800                         if ( ! $tz_min ) { $tz_min = 0; }
    801 
    802                         $offset_secs = (($tz_hour*60)+$tz_min)*60;
    803 
    804                         # is timezone ahead of GMT?  then subtract offset
    805                         #
    806                         if ( $tz_mod == '+' ) {
    807                                 $offset_secs = $offset_secs * -1;
    808                         }
    809 
    810                         $offset = $offset_secs;
    811                 }
    812                 $epoch = $epoch + $offset;
    813                 return $epoch;
    814         }
    815         else {
    816                 return -1;
    817         }
    818         }
    819 function wp_rss ($url, $num) {
    820         //ini_set("display_errors", false); uncomment to suppress php errors thrown if the feed is not returned.
    821         $num_items = $num;
    822         $rss = fetch_rss($url);
    823                 if ( $rss ) {
    824                         echo "<ul>";
    825                         $rss->items = array_slice($rss->items, 0, $num_items);
    826                                 foreach ($rss->items as $item ) {
    827                                         echo "<li>\n";
    828                                         echo "<a href='$item[link]' title='$item[description]'>";
    829                                         echo htmlentities($item['title']);
    830                                         echo "</a><br />\n";
    831                                         echo "</li>\n";
    832                                 }
    833                         echo "</ul>";
    834         }
    835                 else {
    836                         echo "an error has occured the feed is probably down, try again later.";
    837         }
    838 }
    839 
    840 function get_rss ($uri, $num = 5) { // Like get posts, but for RSS
    841         $rss = fetch_rss($url);
    842         if ( $rss ) {
    843                 $rss->items = array_slice($rss->items, 0, $num_items);
    844                 foreach ($rss->items as $item ) {
    845                         echo "<li>\n";
    846                         echo "<a href='$item[link]' title='$item[description]'>";
    847                         echo htmlentities($item['title']);
    848                         echo "</a><br />\n";
    849                         echo "</li>\n";
    850                 }
    851                 return $posts;
     51function fetch_simplepie ($url) {
     52        $feed = new SimplePie;
     53        $feed->feed_url($url);
     54        $feed->set_cache_class('WordPress_SimplePie_Cache');
     55        $feed->strip_htmltags(false);
     56        $feed->strip_attributes(false);
     57        $feed->output_encoding(get_option('blog_charset'));
     58        $feed->cache_max_minutes(720);
     59        $feed->set_useragent('WordPress/' . $wp_version);
     60        if ($feed->init()) {
     61                return $feed;
    85262        } else {
    85363                return false;
    85464        }
    85565}
     66
    85667?>
Note: See TracChangeset for help on using the changeset viewer.