当前位置

更改Drupal生成Sitemap中的最后修改时间

James Qi 在 2013年1月8日 - 10:15 提交
内容摘要:用Drupal搭建网站中,我们通常是初期导入大量数据,后来再反复修改分类、Views、显示模板、菜单等项目来改善用户体验,特别是显示模板可能会在几个月、几年后多次修改,甚至是重要的全面修改,显示内容已......

  用Drupal搭建网站中,我们通常是初期导入大量数据,后来再反复修改分类、Views、显示模板、菜单等项目来改善用户体验,特别是显示模板可能会在几个月、几年后多次修改,甚至是重要的全面修改,显示内容已经面目全非了,但搜索引擎的快照中还是以前的内容,没有及时重新抓取、更新排名。

  搜索引擎应该是基本参照网站的xmlsitemap中的页面最后修改时间lastmod、更新频率changefreq来决定是否回来抓取、多长时间回来抓取的,而Drupal生成的sitemap中某个页面的最后更改时间很可能就是当初创建的时间,但显示内容因为模板修改而早就不同了,造成修改后的内容无法及时被搜索引擎发现。

  这几天实验了一下,用一段php程序批量将Drupal页面的node时间($node->changed、$node->revision_timestamp)修改为当前时间或者比较早的时间后,再重建sitemap(可用drupal菜单rebuild xmlsitemap或者drush xmlsitemap-rebuild),确实可以达到修改sitemap中页面最后修改时间的目的。

  不过用php程序来逐页修改保存起来比较慢,几万个页面可能要执行上十个小时,今天早上又试了干脆直接修改数据库中的表,那执行起来就飞快了,语句记录如下:

UPDATE  `mingluji_com`.`node` SET  `changed` =  '1357607144' WHERE  1;
UPDATE  `mingluji_com`.`node_revisions` SET  `timestamp` =  '1357607144' WHERE  1;
UPDATE  `mingluji_com`.`xmlsitemap` SET  `lastmod` =  '1357607144' WHERE  `xmlsitemap`.`type` =  'node';

  上面三句分别修改node、node_revision和xmlsitemap中node页面的时间戳,直接修改了第三个表xmlsitemap中的时间后,只需要更新sitemap(可用drupal 7菜单update xmlsitemap或者drush xmlsitemap-regenerate)就可以得到新生成的sitemap,比rebuild缩短几个数量级的时间。

  另外,大数据量网站的xmlsitemap更新操作可能需要很长时间,会导致cron运行困难,可以特别修改xmlsitemap模块设置更新时间为1年、10年,也就是基本上让cron期间不再进行xmlsitemap更新,而人工或者另外设置定期生成xmlsitemap。

自由标签:

评论

-- 发自IP地址: 111.174.197.239 (位置 | 谁是)

可以用Drush来批量修改系列网站中的Sitemap最后修改时间:

drush sql-query "UPDATE  node SET  changed =  '1370016000' WHERE  1;"
drush sql-query "UPDATE  node_revision SET  timestamp =  '1370016000' WHERE  1;"
drush sql-query "UPDATE xmlsitemap SET lastmod = '1370016000' WHERE  xmlsitemap.type =  'node';"

注意Drupal 6中的node_revisions表在Drupal 7中变成了node_revision。

附工具链接:Unix时间戳转换

James Qi / 祁劲松

-- 发自IP地址: 113.57.245.50 (位置 | 谁是)

$d sql-query "UPDATE 数据库名称.node SET changed = '1474819200' WHERE 1;"
$d sql-query "UPDATE 数据库名称.node_revision SET timestamp = '1474819200' WHERE 1;"
$d sql-query "UPDATE 数据库名称.xmlsitemap SET lastmod = '1474819200' WHERE xmlsitemap.type = 'node';"

$d xmlsitemap-regenerate