node_feed
- Versions
- 4.6 – 5
node_feed($nodes= 0, $channel = array())- 6 – 7
node_feed($nids = FALSE, $channel = array())
A generic function for generating RSS feeds from a set of nodes.
Parameters
$nids An array of node IDs (nid). Defaults to FALSE so empty feeds can be generated with passing an empty array, if no items are to be added to the feed.
$channel An associative array containing title, link, description and other keys, to be parsed by format_rss_channel() and format_xml_elements(). A list of channel elements can be found at the RSS 2.0 Specification. The link should be an absolute URL.
Code
modules/node/node.module, line 2022
<?php
function node_feed($nids = FALSE, $channel = array()) {
global $base_url, $language;
if ($nids === FALSE) {
$nids = db_select('node', 'n')
->fields('n', array('nid', 'created'))
->condition('n.promote', 1)
->condition('status', 1)
->orderBy('n.created', 'DESC')
->range(0, variable_get('feed_default_items', 10))
->addTag('node_access')
->execute()
->fetchCol();
}
$item_length = variable_get('feed_item_length', 'fulltext');
$namespaces = array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/');
$teaser = ($item_length == 'teaser');
// Load all nodes to be rendered.
$nodes = node_load_multiple($nids);
$items = '';
foreach ($nodes as $node) {
$item_text = '';
$node->link = url("node/$node->nid", array('absolute' => TRUE));
$node->rss_namespaces = array();
$node->rss_elements = array(
array('key' => 'pubDate', 'value' => gmdate('r', $node->created)),
array('key' => 'dc:creator', 'value' => $node->name),
array('key' => 'guid', 'value' => $node->nid . ' at ' . $base_url, 'attributes' => array('isPermaLink' => 'false'))
);
// The node gets built and modules add to or modify $node->rss_elements
// and $node->rss_namespaces.
$build = node_build($node, 'rss');
unset($build['#theme']);
if (!empty($node->rss_namespaces)) {
$namespaces = array_merge($namespaces, $node->rss_namespaces);
}
if ($item_length != 'title') {
// We render node contents and force links to be last.
$build['links']['#weight'] = 1000;
$item_text .= drupal_render($build);
}
$items .= format_rss_item($node->title[FIELD_LANGUAGE_NONE][0]['value'], $node->link, $item_text, $node->rss_elements);
}
$channel_defaults = array(
'version' => '2.0',
'title' => variable_get('site_name', 'Drupal'),
'link' => $base_url,
'description' => variable_get('feed_description', ''),
'language' => $language->language
);
$channel_extras = array_diff_key($channel, $channel_defaults);
$channel = array_merge($channel_defaults, $channel);
$output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$output .= "<rss version=\"" . $channel["version"] . "\" xml:base=\"" . $base_url . "\" " . drupal_attributes($namespaces) . ">\n";
$output .= format_rss_channel($channel['title'], $channel['link'], $channel['description'], $items, $channel['language'], $channel_extras);
$output .= "</rss>\n";
drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
print $output;
}
?>Login or register to post comments 