解决这个问题让大家都实现ecshop关键词自动内链

2016-07-07 15:00 来源:www.chinab4c.com 作者:ecshop专家

在网上找了一个Ecshop加内链的办法,但测试时有问题,现发布任务请人解决这两个问题。先发原作者的方法:

网站的内链建设是SEO工作的重要内容之一,资讯新闻网站如此,商城系统也是如此,但大部分店主并没有意识到这一点。不知道你看新闻的时候注意到没有,文章中出现了名人的名字,总是自动加上到他Blog或者微博的链接,门户网站给我们做了很好的表率,你的商城是否需要这样呢

实现的大致原理
将关键字和链接按照规则放到文本中,程序读取关键词和链接,判断商品描述和文章中是否有关键词需要替换,如有需要替换掉。替换步骤在读取数据库之后进行,并不写入到数据库中。
虽然程序很简单,但要避免出现下面情况哦:
1. <a href=”url”>这也是一个关键词</a> 被处理为 <a href=”url”>这也是一个<a href=”url”>关键词</a></a>
2. <a href=”url” alt=”关键词出现在这了”>打酱油的</a> 被处理为 <a href=”url” alt=”<a href=”url”>关键词</a>出现在这了”>打酱油的</a>
3. <img title=”关键词出现在这了”/> 被处理为 <img title=”<a href=”url”>关键词</a>出现在这了”/>
…(其他类似情况)

主要代码
article.php中:

  1. content = file_get_contents("data/urls.txt");
  2. $array = explode("\r\n",$content);
  3. foreach ($array AS $value){
  4. $tmp = explode("---",$value);
  5. if ($tmp !== false){
  6. $str = "<a target='_blank' href='".$tmp[1]."'>".$tmp[0]."</a>";
  7. $str_1 = $tmp[0];
  8. $str_2 = $str;
  9. $tmp1 = explode("<",$row['content']);
  10. foreach ($tmp1 as $key=>$item){
  11. $tmp2 = explode(">",$item);
  12. if (sizeof($tmp2)>1) {
  13. if (substr($tmp2[0],0,1)!="a" && substr($tmp2[0],0,1)!="A"){
  14. $tmp2[1] = str_ireplace($str_1,$str_2,$tmp2[1]);
  15. $tmp1[$key] = implode(">",$tmp2);
  16. }
  17. }
  18. }
  19. $row['content'] = implode("<",$tmp1);
  20. }
  21. }
复制代码

goods.php中:
  1. $content=file_get_contents("data/urls.txt");
  2. $array = explode("\r\n",$content);

  3. foreach ($array AS $value){
  4. $tmp = explode("---",$value);
  5. if ($tmp !== false){
  6. $str = "<a target='_blank' href='".$tmp[1]."'>".$tmp[0]."</a>";
  7. $str_1 = $tmp[0];
  8. $str_2 = $str;

  9. $tmp1 = explode("<",$goods['goods_desc']);
  10. foreach ($tmp1 as $key=>$item){
  11. $tmp2 = explode(">",$item);
  12. if (sizeof($tmp2)>1) {
  13. if (substr($tmp2[0],0,1)!="a" && substr($tmp2[0],0,1)!="A"){
  14. $tmp2[1] = str_ireplace($str_1,$str_2,$tmp2[1]);
  15. $tmp1[$key] = implode(">",$tmp2);
  16. }
  17. }
  18. }
  19. $goods['goods_desc'] = implode("<",$tmp1);
  20. }
  21. }
复制代码


说明信息:
1.关键词和链接放在哪里?
直接用记事本编辑文本urls.txt,编辑后放到data目录下,格式:关键词---url

每行一个,放在前面的优先级最高。

2.为什么不放上修改后的文件呢?
我不清楚你的ecshop是什么版本,有没有被修改过,所以直接用了我修改过的文件可能会导致你的系统出错,有点基础的朋友看了这篇文章肯定可以操作成功,操作之前请先备份。

3.为什么使用文本文档保存数据呢?
出发点是为了方便客户操作,不使用数据库存储避免升级时候引起不必要的麻烦,如果你感兴趣,你可以用数据库、xml或存储为数组变量。

4.注意编码问题,文中代码适用于utf-8。

GB2312编码的系统把 $content = iconv(&quot;GB2312&quot;,&quot;UTF-8&quot;,file_get_contents(&quot;data/urls.txt&quot;));

改为

$content = file_get_contents(&quot;data/urls.txt&quot;);

5.操作之前,务必备份!祝你发财,呵呵

要解决的是以下两个问题,本人对php一窍不通,但连猜带蒙觉得这两个问题应该不大。最好是在原作者代码基础上改,可适用于ecshop2.7.1和2.7.2版本。

1、照原作者方法修改两个文件后,文章页article.php中
$tmp1 = explode("<",$row['content']);
这一行出现错误:Notice: Undefined variable: row in ........

商品页article.php中
$tmp1 = explode("<",$goods['goods_desc']);
这一行出现错误:Notice: Undefined variable: goods in........

猜测是$row['content']和$goods['goods_desc']两个值没有取得,在程序原文件中,这两个文件也没有再对这两个值进行定义,而是通goods.dwt和atricle.dwt获得。求解决这一问题,使文章和商品中的关键词能正常替换。

2、在解决以上问题的基础上,限制一下替换次数,即一个页面中关键词只替换一次,而不是全面替换

回答:
顶啊,解决了大家都有好处

高手赶紧出现把

有人试过吗?

phpsir QQ 733905 可以解决

这个再顶一下。希望有人能解决

楼主代码错误了。就是开头有个调整编码的你丢了
以下为正确代码

article.php中:

$content = iconv("GB2312","UTF-8",file_get_contents("data/urls.txt"));
$array= explode("\r\n",$content);

foreach ($array AS $value){
$tmp =explode("---",$value);
if ($tmp !== false){
$str = "<a target='_blank' href='".$tmp[1]."'>".$tmp[0]."</a>";
$str_1 = $tmp[0];
$str_2 = $str;

$tmp1 = explode("<",$row['content']);
foreach ($tmp1 as $key=>$item){
$tmp2 = explode(">",$item);
if (sizeof($tmp2)>1) {
if (substr($tmp2[0],0,1)!="a" && substr($tmp2[0],0,1)!="A"){
$tmp2[1] = str_ireplace($str_1,$str_2,$tmp2[1]);
$tmp1[$key] = implode(">",$tmp2);
}
}
}
$row['content'] = implode("<",$tmp1);
}
}

goods.php中:

$content = iconv("GB2312","UTF-8",file_get_contents("data/urls.txt"));
$array= explode("\r\n",$content);

foreach ($array AS $value){
$tmp =explode("---",$value);
if ($tmp !== false){
$str = "<a target='_blank' href='".$tmp[1]."'>".$tmp[0]."</a>";
$str_1 = $tmp[0];
$str_2 = $str;

$tmp1 = explode("<",$row['content']);
foreach ($tmp1 as $key=>$item){
$tmp2 = explode(">",$item);
if (sizeof($tmp2)>1) {
if (substr($tmp2[0],0,1)!="a" && substr($tmp2[0],0,1)!="A"){
$tmp2[1] = str_ireplace($str_1,$str_2,$tmp2[1]);
$tmp1[$key] = implode(">",$tmp2);
}
}
}
$row['content'] = implode("<",$tmp1);
}
}

我也需要啊,最好是一个插件!

mark一下