分享SEO WordPress的Description 与 Keywords


大家不知有没有看过 我爱水煮鱼 我是如何 SEO WordPress 的 2:Description 和 Keywords。挺不错的,建议大家放弃All in one SEO之类的插件,改用这段代码就行了。

通过下面的代码设置博客的Description 和 Keywords,用日志的摘要作为Description,或是文章的前220个字,用标签(tags)作为关键词Keywords。

只需要把这段代码放在header.php就行了。

我爱水煮鱼 里的原代码:

<?if (is_home()){    
 $description = "首页的描述";    
 $keywords = "首页的关键词";
} elseif (is_single()){    
 if ($post->post_excerpt) {        
  $description  = $post->post_excerpt;    
 } else {       
  $description = substr(strip_tags($post->post_content),0,220);    
 }      
 $keywords = "";           
 $tags = wp_get_post_tags($post->ID);    
 foreach ($tags as $tag ) {        
  $keywords = $keywords . $tag->name . ", ";    
  }
}
?>
<meta name="keywords" content="<?=$keywords?>" />
<meta name="description" content="<?=$description?>" />

修改版1:

上面的代码已经可以直接拿来用。不过也有一些细节问题,你可以用下面的修改版。主要是去掉了关键词之间的空格和最后的逗号,顺便也去掉了描述(description)的换行符(\n)。

<?php
 if (is_home()){   
 $description = "首页的描述";    
 $keywords = "首页的关键词";
} elseif (is_single()){   
 if ($post->post_excerpt) {       
  $description  = $post->post_excerpt;    
 } else {       
  $description = substr(strip_tags($post->post_content),0,220);   
 }      
 $keywords = "";           
 $tags = wp_get_post_tags($post->ID);    
 foreach ($tags as $tag ) {       
  $keywords = $keywords . $tag->name . ",";    
  }
}
?>
<meta name="description" content="<?php echo trim($description); ?>" />
<meta name="keywords" content="<?php echo rtrim($keywords,','); ?>" />

修改版2:

下面还有一段代码,主要是应Blinux的要求,呵。他需要把日志的第一段作为Description,就是不要再从第二行取字符了。Blinux是一个完美主义者,所以在他的要求下,也经过测试,下面的代码近乎完美地解决了这个问题。


<?php
 if (is_home()){
    $description = "首页的描述";
    $keywords = "首页的关键词";
} elseif (is_single()){
    if ($post->post_excerpt) {
        $description  = $post->post_excerpt;
    } else {
   if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$result)){
    $post_content = $result['1'];
   } else {
    $post_content_r = explode("\n",trim(strip_tags($post->post_content)));
    $post_content = $post_content_r['0'];
   }
         $description = substr($post_content,0,220);   
  }
 
    $keywords = "";      
    $tags = wp_get_post_tags($post->ID);
    foreach ($tags as $tag ) {
        $keywords = $keywords . $tag->name . ",";
    }

}

?>
<meta name="description" content="<?php echo trim($description); ?>" />
<meta name="keywords" content="<?php echo rtrim($keywords,','); ?>" />

主要解释一下中间这段:


###第一种情况,以<p>开始,</p>结束来取第一段
if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$result)){ 
    $post_content = $result['1'];
} else {
###第二种情况,以换行符(\n)来取第一段   
   $post_content_r = explode("\n",trim(strip_tags($post->post_content))); 
    $post_content = $post_content_r['0'];
} 

分两种情况的原因是:第一种情况对Windows Live Writer发布的文章有效。第二种情况适合直接用WP的后台发布的文章。

代码放在header.php

你可以考虑放在title标签的之前或之后,不过我习惯的作法是把上面的代码单独另存为一个文件,如命名为desc.php,上传到你目前所用主题的目录下,然后调用就行了。


<title><?php wp_title('&laquo;', true, 'right'); ?> <?php bloginfo('name'); ?></title>
<?php include_once("desc.php"); ?>   

补充:对于页面(Page)的Description 与 Keywords

关于Page页面与分类页的的描述和关键词, 请关注最新文章~~(2009-11-07更新)

最终:解决乱码问题

这是因为substr在截取中文字符时所造成的。所以要自定义一个函数

<?php
if (!function_exists('utf8Substr')) {
 function utf8Substr($str, $from, $len)
 {
     return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
          '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
          '$1',$str);
 }
}
 if (is_home()){
    $description = "首页的描述";
    $keywords = "首页的关键词";
} elseif (is_single()){
    if ($post->post_excerpt) {
        $description  = $post->post_excerpt;
    } else {
   if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$result)){
    $post_content = $result['1'];
   } else {
    $post_content_r = explode("\n",trim(strip_tags($post->post_content)));
    $post_content = $post_content_r['0'];
   }
         $description = utf8Substr($post_content,0,220);   
  }
 
    $keywords = "";      
    $tags = wp_get_post_tags($post->ID);
    foreach ($tags as $tag ) {
        $keywords = $keywords . $tag->name . ",";
    }

}

?>
<meta name="description" content="<?php echo trim($description); ?>" />
<meta name="keywords" content="<?php echo rtrim($keywords,','); ?>" />

69条回应:“分享SEO WordPress的Description 与 Keywords”

  1. 你好,请问出现乱码的情况怎么修改到UTF-8。。。谢谢啊

  2. 你好,我用了最后那个最终解决方案都还是不行,只要这里面:
    if (is_home()){
    $description = “首页的描述”;
    $keywords = “首页的关键词”;
    } elseif (is_single()){
    有中文,在查看源文件里面的中文全部是乱码,但只要“description” 和 “keywords”是英文查看源文件里面的中文就不会出现乱码了。
    能不能帮我看一下,谢了。

      • 我把主题里面的文件用Dreamweaver页面设置里转为UTF-8都还是一样,这个问题困扰我很久了,都还没搞掂~~

      • 就这个自定义的会乱码,内容不得页面又不会。
        if (is_home()){
        $description = “首页的描述”;
        $keywords = “首页的关键词”;
        } elseif (is_single()){

        • 你是不是把这段代码存在另一个文件,另一个文件也是要存为utf8的啊。统统都utf8就没错的了。

          • 呵呵,刚刚弄好了,确实是utf-8编码的问题。
            问题主要出在我一直用WinSCP软件的编辑器来改写原代码的。可能这个软件对UTF-8编码不好,用Dreamweaver修改就没问题了,感谢Lc.博主!

  3. 你好,我用了您的这个代码,但分类目录下面没有关键字和描述了呢?请问应该如何设置成我想要的关键字和描述呢,谢谢

  4. 你好,我用 (最终:解决乱码问题)这一个的,网站打不开了,显示以下错误:

    Parse error: syntax error, unexpected ‘<' in /data/home/zs8985/htdocs/wp-content/themes/hw/header.php on line 39

    我用第一个修改版1 网站就可以打开,但有的文章出现乱码。

    • 要看line 39是什么的啊. 应该是你复制过去之后有点小地方错误了. 你看着改改就是了~
      其它人复制直接用都是没问题的.

  5. elseif (is_page()) {
    if($page_id == ‘2’){ ##根据需要修改这里的数字
    $description = “关于网站”;
    $keywords = “关于网站”;
    }
    这段代码添加失败 添加后提示 错误

    • 这段嘛.. 的确是.. 最好不用用这段~~
      如果是开了固定链接的话就没办法用这段了~
      我当时没考虑到这个~~
      是给只是用原始链接的博客用的. 失策了~~ :)

    • 其实我这里没啥人气的~~ 你啥时来都可以抢到沙发的了~`
      不过现在有点事~~ 迟些再发~~ /呲牙

  6. 感谢博主,这个问题困扰我了几天,今天才想到源码乱码可能是自动截取description导致的,一搜果然找到了解决方法 [强]

      • 谢谢您的回复,我换了个主题,就好了~
        汗,谢谢~
        自从用了那个主题之后谷歌都不收录我的网站了,我给换回来了,嘿嘿
        :) [呲牙]

      • 经过反复测试,发现这种方法有一个弊病,那就是“用日志的摘要作为Description,或是文章的前220个字,”这个里边不能有超链接或者其他类似的字符,否则就会出错,希望能解决下。谢谢了

  7. 柳兄 [偷笑] [偷笑] .我从你这里偷学很多东西哦.谢谢分享.!~
    请教一下,原来ALL IN ONE的NOINDEX,百度是不是对这个很敏感啊.它老是转首页,内页就不进去了.是否去掉这个插件,然后添加上面的代码文件,会好些呢.!~

  8. 我使用了第二种,不过貌似没有能完美解决乱码的问题和出错的问题。
    譬如,xianren.org/fnetjishu/xpwojieweb.html就出现了出错的问题,
    xianren.org/fzantan/frontoftheclass.html就出现了乱码的问题,大多数正常,我测试了下,有20%左右会出现问题。麻烦解决下?

    • 经过反复测试,发现这种方法有一个弊病,那就是“用日志的摘要作为Description,或是文章的前220个字,”这个里边不能有超链接或者其他类似的字符,否则就会出错,希望能解决下。

  9. 这个不行啊,当文章摘要有图片的时候,直接图片就显示出来了,整个页面都奔溃了,还有就是文章没摘要的时候,也是很无语

  10. 柳老大,请教一下,这个我用了,没问题,就是有个疑问,能不能写段代码,让他截取文章中间部分的内容,或者只截取中文,如果在页面顶部放了广告代码,他会截取广告代码加一些文章内容,这样很不好啊,不知道这个能不能实现。一般广告都是首尾有,中间比较少,所以这个应该考虑一下啊

  11. 我网站description标签的乱码问题很长时间,我把下面的代码加入了header.php

    post_excerpt) {
    $description = $post->post_excerpt;
    } else {
    if(preg_match(‘/(.*)/iU’,trim(strip_tags($post->post_content,””)),$result)){
    $post_content = $result[‘1’];
    } else {
    $post_content_r = explode(“\n”,trim(strip_tags($post->post_content)));
    $post_content = $post_content_r[‘0′];
    }
    $description = utf8Substr($post_content,0,220);
    }

    $keywords = “”;
    $tags = wp_get_post_tags($post->ID);
    foreach ($tags as $tag ) {
    $keywords = $keywords . $tag->name . “,”;
    }

    }

    ?>
    <meta name="description" content="” />
    <meta name="keywords" content="” />

    加完后,查看页面源代码,发现出现了两个description和keywords,于是我删除了header.php中原有的下列代码,

    <?php if((is_home() && ($paged < 2 )) || is_single() || is_page()) { echo '’; } else { echo ”; } ?>

    <meta name="description" content="” />

    <meta name="description" content="” />

    <meta name="keywords" content="” />

    目前看,博客工作正常。是否稳定或有其他问题等待进一步观察。

  12. 你好博主,如果我不想使用摘要作为description标签,而只取用截断文章前220字的方式;那么我要去掉那些代码?

  13. 你好,这个调用后,网站首页最上方会出现一行空白,什么原因??新人求解,谢谢大侠! [可爱]

  14. […] WordPress的Description、Keywords和Title(完整版)∷柳城 分享SEO WordPress的Description 与 Keywords∷柳城 分享SEO WordPress的标题Title∷柳城 WordPress […]