Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!
  • Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

PHP RSS Feed aggregation changing date to todays date everytime feed is aggregated

wyclef

Active Coder
Hey, was wondering if someone might be able to rummage through the following and provide some insight as to why this custom RSS feed aggregation code is returning the current date and not the actual pub date? The key variable here is $cleanDate I believe. This is using some older RSS aggregation script which I will add at the bottom, it is still on Sourceforge but seems as though it has probably been abandoned. Everything seems to function normally with the exception that each time this thing reaggregates the feed it is converting the dates to todays date. Hopefully someone out there can shed light on what is going on here.

PHP:
// RSS Aggregation
function rssAggregation($feedSection) {
    $rss = new rss_php;
    $feedURL = array();
    $cleanFeed = array();
    $dups = array();
    $limit = array();

    if(get_field($feedSection, 'option')) {
        while(has_sub_field($feedSection, 'option')) {
            $feedURL[] = get_sub_field('url');
            $limit[] = get_sub_field('limit');
        }
    }

    for ($i = 0; $i < count($feedURL); $i++) {
        $rss->load($feedURL[$i]);
        $items = $rss->getItems();
        for ($j = 0; $j < $limit[$i]; $j++) {
            if (!in_array($items[$j]['title'], $dups)) {
                $dups[] = $items[$j]['title'];
                $cleanFeed[] = $items[$j];
            }
        }
    }

    return $cleanFeed;
}

// read feed from xml
function xmlFeed($section) {
    $rss = new rss_php;
    $feedURL = site_url().'/'.$section.'.xml';
    $rss->load($feedURL);
    return $rss->getItems();
}

// RSS News Items
function rssNewsItems() {
    $items = xmlFeed('MYFEED');
    $items = orderByDate($items);

    /// change this for max post display ///
    $maxPosts = 19;

    $counter = 1;
    $output = '<ul class="buzz-list">';
    if (count($items) >= 2) {
        for ($i = 0; $i < $maxPosts; $i++) {
            $cleanDate = convertPubDate($items[$i][pubDate], 'F dS, Y');
            if ($items[$i][description] != '') {
                $output .= '<li>';
                $output .= '<h2><a href="'.$items[$i][link].'" target="_blank">'.htmlspecialchars_decode($items[$i][title]).'</a></h2>';
                $output .= '<p>'.htmlspecialchars_decode(substr($items[$i][description], 0, 175)).' ... <em class="date">'.$cleanDate.'</em></p>';
                $output .= '</li>';

                if (($counter % 2) == 0) { $output .= '</ul><ul class="buzz-list">'; }
                $counter++;
            }
        }
    } else {
        $output = '<ul class="buzz-list"><li><p>Please check back soon...</p></li></ul>';
    }
    $output .= '</ul>';
    return $output;
}

// RSS Upcoming Items
function rssUpcomingItems() {
    $items = xmlFeed('events');
    $counter = 1;
    $output = '';
    $output = '<ul class="upcoming-list">';
    if (count($items) >= 2) {
        for ($i = 0; $i < count($items); $i++) {
            $cleanDate = convertPubDate($items[$i][pubDate], 'm/d');
            $temp  = explode(':', $items[$i][title]);
            $itemTitle = $temp[1];
            if ($itemTitle != '') {
                $output .= '<li>';
                $output .= '<header class="heading">';
                $output .= '<em class="date">'.$cleanDate.'</em>';
                $output .= '<h2><a href="'.$items[$i][link].'" target="_blank">'.$itemTitle.'</a></h2>';
                $output .= '</header>';
                $output .= convertPubDate($items[$i][pubDate], 'l, M. dS, g:iA');
                $output .= '</li>';

                if (($counter % 3) == 0) { $output .= '</ul><ul class="upcoming-list">'; }
                $counter++;
            }
        }
    } else {
        $output .= '<li><p>No events are currently scheduled. Please check back soon ...</p></li>';
    }
    $output .= '</ul>';
    return $output;
}


// RSS News Items with thumbnails
function rssNewsItemsThumbnails() {
    $items = xmlFeed('MYFEED');
    $items = orderByDate($items);

    /// change this for max post display ///
    $maxPosts = 12;

    $output = '';
    $output = '<ul id="spotlight">';

    if (count($items) >= 2) {
        for ($i = 0; $i < $maxPosts; $i++) {
            if ($items[$i][description] != '') {
                $cleanDate = convertPubDate($items[$i][pubDate], 'F dS, Y');
                $output .= '<li>';
                if ($items[$i][thumb] != '') {
                    $output .= '<img src="'.$items[$i][thumb].'" width="85px" height="85px" alt="'.$items[$i][title].'">';
                } else {
                    $output .= '<img src="https://domain.com/wp-content/themes/mytheme/assets/images/placeholder-news.png" width="85px" height="85px" alt="'.$items[$i][title].'">';
                }
                $output .= '<h3><a href="'.$items[$i][link].'" target="_blank">'.$items[$i][title].'</a></h3>';
                $output .= '<p>'.htmlspecialchars_decode($items[$i][description]).' <em class="date">'.$cleanDate.'</em></p>';
                $output .= '</li>';
            }
        }
    } else {
        $output .= '<li><p>Please check back soon ...</p></li>';
    }
    $output .= '</ul>';
    return $output;
}

// convert pub dates
function convertPubDate($date, $format) {
    $tempDate = new DateTime($date);
    return $tempDate->format($format);
}

// order by date
function orderByDate($items) {
    //$tempDate = strtotime($item);
    $referenceArray = array();
    for ($i = 0; $i < count($items); $i++) {
        $referenceArray[] = strtotime($items[$i][pubDate]);
    }
    array_multisort($referenceArray, SORT_DESC, $items);
    return $items;
}

function savePostUpdateXML($post_id) {
    wp_unschedule_event(time(), 'task_rss_update');
    wp_clear_scheduled_hook('task_rss_update');

    // cron job
    if (!wp_next_scheduled('task_rss_update')) {
        wp_schedule_event( time(), 'daily', 'task_rss_update' );
    }
    add_action('task_rss_update', 'updateRSS');


    if ( wp_is_post_revision( $post_id ) ){

          // unhook this function so it doesn't loop infinitely
          remove_action('save_post', 'savePostUpdateXML');
        // If this is a revision, get real post ID
        if ( $parent_id = wp_is_post_revision( $post_id ) ) { $post_id = $parent_id; }
        $my_post = array(
          'ID'           => $post_id
      );
          // update the post, which calls save_post again
          wp_update_post( $my_post );

          // re-hook this function
          add_action('save_post', 'savePostUpdateXML');
      }
}
add_action( 'save_post', 'savePostUpdateXML' );

/** reset cron job **/
/*
wp_unschedule_event(time(), 'task_rss_update');
wp_clear_scheduled_hook('task_rss_update');
*/
/** reset cron job **/

// cron job
if (!wp_next_scheduled('task_rss_update')) {
    wp_schedule_event( time(), 'daily', 'task_rss_update' );
}
add_action('task_rss_update', 'updateRSS');

function updateRSS() {
    // buzz buzz
    $items = rssAggregation('research-feed');
    $items = orderByDate($items);
    createXML($items, 'research');

    // upcoming
    $items = rssAggregation('events-feed');
    createXML($items, 'events');

}

function createXML($items, $fileName) {
    global $post;
    $feed = '';
    $feed = '<?xml version="1.0" encoding="UTF-8"?>';
    $feed .= '<rss version="2.0">';
    $feed .= '<channel>';
    $feed .= '<title>'.$fileName.'</title>';
    $feed .= '<description></description>';
    $feed .= '<link></link>';

    if ($fileName == 'research') {
        for($i = 0; $i < count($items); $i++) {
            if ($items[$i][description] != '') {
                $feed .= '<item>';
                $feed .= '<title><![CDATA['.$items[$i][title].']]></title>';
                $feed .= '<description><![CDATA['.$items[$i][description].']]></description>';
                $feed .= '<pubDate>'.convertPubDate($items[$i][pubDate], 'F dS, Y').'</pubDate>';
                $feed .= '<link><![CDATA['.$items[$i][link].']]></link>';
                if ($items[$i][thumb_url] != '') {
                    $feed .= '<thumb>'.$items[$i][thumb_url].'</thumb>';
                } else {
                    $feed .= '<thumb>https://domain.com/wp-content/themes/mytheme/assets/images/placeholder-news.png</thumb>';
                }
                $feed .= '</item>';
            }
        }

        $args = array('category_name' => 'uncategorized');
        query_posts($args);
        if ( have_posts() ) : while ( have_posts() ) : the_post();
            $feed .= '<item>';
            $feed .= '<title><![CDATA['.htmlspecialchars(get_the_title($post->ID), ENT_QUOTES, 'UTF-8').']]></title>';
            $feed .= '<description><![CDATA['.htmlspecialchars(get_field('content', $post->ID), ENT_QUOTES, 'UTF-8').']]></description>';
            $feed .= '<pubDate>'.convertPubDate(get_the_date(), 'F dS, Y').'</pubDate>';
            $feed .= '<link><![CDATA['.get_field('external-link', $post->ID).']]></link>';
            if (get_field('image', $post->ID) != '') {
                $feed .= '<thumb>'.get_field('image', $post->ID).'</thumb>';
            } else {
                $feed .= '<thumb>https://domain.com/wp-content/themes/mytheme/assets/images/placeholder-news.png</thumb>';
            }
            $feed .= '</item>';
        endwhile;
        endif;
    } else if ($fileName == 'events') {
        for($i = 0; $i < count($items); $i++) {
            if ($items[$i][description] != '') {
                $feed .= '<item>';
                $feed .= '<title><![CDATA['.$items[$i][title].']]></title>';
                $feed .= '<description><![CDATA['.$items[$i][description].']]></description>';
                $feed .= '<pubDate>'.convertPubDate($items[$i][pubDate], 'l, M. dS, g:iA').'</pubDate>';
                $feed .= '<pubDate1>'.convertPubDate($items[$i][pubDate], 'm/d').'</pubDate1>';
                $feed .= '<link><![CDATA['.$items[$i][link].']]></link>';
                $feed .= '</item>';
            }
        }
    }

    $feed .= '</channel> ';
    $feed .= '</rss>';

    $xmlFile = $fileName.'.xml';
    $fh = fopen($xmlFile, 'w') or die("can't open file");
    fwrite($fh, $feed);
    fclose($fh);
}

Code:
<?php 
/*
    RSS_PHP - the PHP DOM based RSS Parser
    Author: <rssphp.net>
    Published: 200801 :: blacknet :: via rssphp.net
    
    RSS_PHP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY.

    Usage:
        See the documentation at https://rssphp.net/documentation
    Examples:
        Can be found online at https://rssphp.net/examples
*/

class rss_php {
    
    public $document;
    public $channel;
    public $items;

/****************************
    public load methods
***/
    # load RSS by URL
        public function load($url=false, $unblock=true) {
            if($url) {
                if($unblock) {
                    $this->loadParser(file_get_contents($url, false, $this->randomContext()));
                } else {
                    $this->loadParser(file_get_contents($url));
                }
            }
        }
    # load raw RSS data
        public function loadRSS($rawxml=false) {
            if($rawxml) {
                $this->loadParser($rawxml);
            }
        }
        
/****************************
    public load methods
        @param $includeAttributes BOOLEAN
        return array;
***/
    # return full rss array
        public function getRSS($includeAttributes=false) {
            if($includeAttributes) {
                return $this->document;
            }
            return $this->valueReturner();
        }
    # return channel data
        public function getChannel($includeAttributes=false) {
            if($includeAttributes) {
                return $this->channel;
            }
            return $this->valueReturner($this->channel);
        }
    # return rss items
        public function getItems($includeAttributes=false) {
            if($includeAttributes) {
                return $this->items;
            }
            return $this->valueReturner($this->items);
        }

/****************************
    internal methods
***/
    private function loadParser($rss=false) {
        if($rss) {
            $this->document = array();
            $this->channel = array();
            $this->items = array();
            $DOMDocument = new DOMDocument;
            $DOMDocument->strictErrorChecking = false;
            $DOMDocument->loadXML($rss);
            $this->document = $this->extractDOM($DOMDocument->childNodes);
        }
    }
    
    private function valueReturner($valueBlock=false) {
        if(!$valueBlock) {
            $valueBlock = $this->document;
        }
        foreach($valueBlock as $valueName => $values) {
                if(isset($values['value'])) {
                    $values = $values['value'];
                }
                if(is_array($values)) {
                    $valueBlock[$valueName] = $this->valueReturner($values);
                } else {
                    $valueBlock[$valueName] = $values;
                }
        }
        return $valueBlock;
    }
    
    private function extractDOM($nodeList,$parentNodeName=false) {
        $itemCounter = 0;
        foreach($nodeList as $values) {
            if(substr($values->nodeName,0,1) != '#') {
                if($values->nodeName == 'item') {
                    $nodeName = $values->nodeName.':'.$itemCounter;
                    $itemCounter++;
                } else {
                    $nodeName = $values->nodeName;
                }
                $tempNode[$nodeName] = array();                
                if($values->attributes) {
                    for($i=0;$values->attributes->item($i);$i++) {
                        $tempNode[$nodeName]['properties'][$values->attributes->item($i)->nodeName] = $values->attributes->item($i)->nodeValue;
                    }
                }
                if(!$values->firstChild) {
                    $tempNode[$nodeName]['value'] = $values->textContent;
                } else {
                    $tempNode[$nodeName]['value']  = $this->extractDOM($values->childNodes, $values->nodeName);
                }
                if(in_array($parentNodeName, array('channel','rdf:RDF'))) {
                    if($values->nodeName == 'item') {
                        $this->items[] = $tempNode[$nodeName]['value'];
                    } elseif(!in_array($values->nodeName, array('rss','channel'))) {
                        $this->channel[$values->nodeName] = $tempNode[$nodeName];
                    }
                }
            } elseif(substr($values->nodeName,1) == 'text') {
                $tempValue = trim(preg_replace('/\s\s+/',' ',str_replace("\n",' ', $values->textContent)));
                if($tempValue) {
                    $tempNode = $tempValue;
                }
            } elseif(substr($values->nodeName,1) == 'cdata-section'){
                $tempNode = $values->textContent;
            }
        }
        return $tempNode;
    }
    
    private function randomContext() {
        $headerstrings = array();
        $headerstrings['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.'.rand(0,2).'; en-US; rv:1.'.rand(2,9).'.'.rand(0,4).'.'.rand(1,9).') Gecko/2007'.rand(10,12).rand(10,30).' Firefox/2.0.'.rand(0,1).'.'.rand(1,9);
        $headerstrings['Accept-Charset'] = rand(0,1) ? 'en-gb,en;q=0.'.rand(3,8) : 'en-us,en;q=0.'.rand(3,8);
        $headerstrings['Accept-Language'] = 'en-us,en;q=0.'.rand(4,6);
        $setHeaders =     'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'."\r\n".
                        'Accept-Charset: '.$headerstrings['Accept-Charset']."\r\n".
                        'Accept-Language: '.$headerstrings['Accept-Language']."\r\n".
                        'User-Agent: '.$headerstrings['User-Agent']."\r\n";
        $contextOptions = array(
            'http'=>array(
                'method'=>"GET",
                'header'=>$setHeaders
            )
        );
        return stream_context_create($contextOptions);
    }
    
}

?>
 
Back
Top Bottom