用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。
评论2
用Drush来批量修改Sitemap最后修改时间
可以用Drush来批量修改系列网站中的Sitemap最后修改时间:
注意Drupal 6中的node_revisions表在Drupal 7中变成了node_revision。
附工具链接:Unix时间戳转换
$d sql-query "UPDATE 数据库名称
$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