让 Google Sitemaps Generator 可以忽略指定的日志分类

在之前使用 HemingwayEx 主题的时候我把一些只有半句或几句话的日志移动到了 asides 分类,而现在我不想让 Google Sitemaps Generator 插件生成 sitemap 的时候包括这些日志,也许只有我才会有这样奇怪的需求 😯 。

可 Google XML Sitemaps 只能忽略指定的日志或页面,而不能忽略整个分类,所以只能自己动手了。

1. 打开插件目录下的 sitemap-core.php 文件,找到:

$where.=" AND post_password='' ORDER BY post_modified DESC";

$sql .= $where;

修改成:

$where.=" AND post_password='' ORDER BY post_modified DESC";
$where = apply_filters('sitemap_exclude_categories', $where);
$sql .= $where;


2. 打开主题目录下的 functions.php 文件,添加一下代码:

function sitemap_exclude_categories($where) {
  global $wpdb;
  $cates = array(11); // 在这里指定要忽略的类别id,多个类别id用半角逗号分隔
  if (count($cates) > 0) {
    $table_posts = $wpdb->posts;
    $exclude = "(NOT EXISTS (
      SELECT r.object_id FROM {$wpdb->term_relationships} r 
      INNER JOIN {$wpdb->term_taxonomy} t ON r.term_taxonomy_id = t.term_taxonomy_id 
      WHERE t.taxonomy = 'category' AND t.term_id IN (".join(',', $cates).") AND r.object_id = `".$table_posts."`.ID
    ))";
    $where = $exclude.'  AND '.$where;
  }

  return $where;
}
add_filter('sitemap_exclude_categories', 'sitemap_exclude_categories');

通过 WordPress 自身提供的 Hook API 来实现功能主要是为了尽可能避免过多地修改原插件的代码,以免插件升级时带来麻烦。现在这样升级插件时只要重做第一步就可以了。

UPDATE @ 2009-3-22
最新版本的 Google XML Sitemaps 插件增加了日志分类过滤功能,不过由于它会将被过滤分类下的所有日志 ID 都取出来然后用 NOT IN 来实现过滤,这样在日志数多的情况下效率不高。

3 thoughts on “让 Google Sitemaps Generator 可以忽略指定的日志分类

  1. David Post author

    @Qsar:
    看样子你的URL被 askismet 误列为黑名单了

    ASIDE功能的实现有多种方式,通过插件或者手动指定一个分类的内容作为asides,在侧栏显示这个分类的内容即可,当然显示代码要自己写了 :mrgreen:

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *