Drupal网站搭建好、数据导入或者编辑完成后,如果需要大批量修改内容,可以有多种办法:
1、最原始:MySQL语句
找到MySQL数据库中需要修改的内容放置的字段,用MySQL UPDATE语句来直接替换,其运行效率最高,但实现不方便、出错后无法挽回、页面时间没有变化;
2、最傻瓜:Scanner模块
今天找到一个用于search和replace的模块Scanner,安装试了一下,很容易使用,替换后是生成一个新的版本,如果有问题可以批量还原,选项也很丰富:大小写敏感查找、全词查询、加前后缀设置、正则表达式查找、分类查找、分内容类型查询、自定义字段查找、只查找不替换等;
3、最灵活:PHP程序
以前也曾经编写过PHP程序来实现一些查找、替换,这就可以相当灵活,将各种条件进行组合,各种方式查找匹配,各种字段用于替换等,是否生成新版本可以控制,只是编写起来麻烦一些。
评论1
补充一段批量替换的PHP代码
Google Webmaster Tools中发现khm.bizdirlib.com有很多找不到的链接报错,检查是因为原始数据中Product List字段里面包含有:
这样的内容,里面的链接导致有问题,下面的程序可以进行批量修改,替换掉<和>之间的内容,变成
这样,程序如下:
<?php //程序开头注释部分开始 /* 批量替换字段 统计数据: count //本次修改的总计数 */ //程序开头注释部分结束 //定义区开始,请在下面填写国家代码 $country_code='khm';//国家代码 $_SERVER['HTTP_HOST'] = "$country_code.bizdirlib.com"; $_SERVER['SCRIPT_NAME'] = "/replace.php"; $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; $drupal_path = '/var/www/html/drupal7.bizdirlib.com/'; chdir($drupal_path); define('DRUPAL_ROOT', $drupal_path); #require_once './includes/bootstrap.inc'; require_once DRUPAL_ROOT.'includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $node_type = "country"; $limit = 10000; $offset = 0; $sql = "SELECT node.nid FROM {node} WHERE node.type = '$node_type' LIMIT $limit OFFSET $offset"; $result = db_query($sql); $count=0; while ($anode = $result->fetch()) { $nid=$anode->nid; $node=node_load($nid); //print_r($node); //将CCK数据库字段读出赋值给变量 $product_list=$node->field_product_list['und'][0]['value']; //print "product_list=$product_list\n"; $pos1=strpos($product_list,'<'); $pos2=strpos($product_list,'>'); if ($pos1!==FALSE) { $count++; $new=$node; $product_list_new=substr($product_list,0,$pos1).substr($product_list,$pos2+1); print "count=$count nid=$nid: $product_list -> $product_list_new\n"; $new->field_product_list['und'][0]['value']=$product_list_new; node_save($new); } } echo "<br>count=$count Done!<br>\n" ?>