Add lastmod, changefreq and changecount to sitemap.xml for taxonomy terms by the xmlsitemap module

Estimated reading time of this article: 2 minutes

By default lastmod, changefreq and changecount are not written to the sitemap.xml for taxonomy terms by the xmlsitemap module. Fortunately, there is a hook for changing this. The result can be seen on sitemap.xml.

/**
 * Fetch all timestamps when a taxonomy term or his direct child was changed.
 *
 * @param $node
 *   A node object.
 * @return
 *   An array of UNIX timestamp integers.
 */
function _YOUR_MODULE_term_get_timestamps(stdClass $term) {
  static $term_timestamps = array();

  if (!isset($term_timestamps[$term->tid])) {
    $term_timestamps[$term->tid] = db_query("SELECT ti.created FROM {taxonomy_index} ti WHERE ti.tid = :tid
      UNION ALL
      SELECT ti.created FROM {taxonomy_term_hierarchy} th, {taxonomy_index} ti WHERE th.parent = :tid AND th.tid = ti.tid", array(':tid' => $term->tid))->fetchCol();
  }

  return $term_timestamps[$term->tid];
}

/**
 * Add changefreq, changecount and lastmod for taxonomy terms.
 *
 * Implements hook_xmlsitemap_link_alter.
 *
 * @param $link
 *   An array with the data of the sitemap link.
 */
function YOUR_MODULE_xmlsitemap_link_alter(&$link) {
  if ($link['type'] == 'taxonomy_term') {
    // dpm($link, 'link');
    $tid = $link['id'];
    $term = taxonomy_term_load($tid);
    // dpm($term);

    // Always recalculate changefreq and changecount.
    $timestamps = _YOUR_MODULE_term_get_timestamps($term);
    $link['changefreq'] = $term->tid ? xmlsitemap_calculate_changefreq($timestamps) : 0;
    $link['changecount'] = $term->tid && (count($timestamps) > 0) ? count($timestamps) - 1 : 0;
    $link['lastmod'] = count($timestamps) > 0 ? max($timestamps) : 0;
  }
}