一个SEO策略应该主要包括三个部分:

² 内容研究与创新

² 网站内部的内容架构

² 建立导入链接

这几个部分不强调要有一个正确执行顺序,有的人直到网站被关闭了也没有建立导入链接,相反的,有的人从建立链接开始着手,并且取得了很好的效果。

我可能比较偏向于创建内容和建立链接同时进行,因为网站的架构需要大量的内容去不断的充实,对于一个成功的网站而言,终其一生,内容的更新和链接的建立都是不断进行的过程。

内容的研究与更新

首要的工作是确认关键词,通过这些关键词,客户才能使用搜索引擎找到你的产品和服务,以下是确认关键词的工具的链接:

http://www.keyworddiscovery.com

http://www.wordtracker.com

还有其他的一些工具,你可以自己寻找,然后使用其中一个或几个为你服务。

一般而言,不可能只搜索到几个有限的词语,而是你搜索的越多,你能够找的资源也就越多,如果时间允许的话,可能还需要进一步的发掘。

需要牢记的一件非常重要的事情是:GOOGLE上超过一半的搜索都是独一无二的。

你需要为每一个关键词创建一个网页,这可能意味着要创建很多页面。当根据你的关键词创立了含有内容的网页之后,就有很多事情需要做了,这些事情是搜索引擎将要浏览并借以决定你的网页是关于什么内容的依据,它们包括:

l 导入链接文本

l 标题标签

l 主题标签

l META标签

l 网站剩余的内容

l URL

……

上面的每一项内容都是一个机会去告诉搜索引擎你的网页是关于什么方面的——但是你要是做得太过了,你就惨了,会遭到惩罚。简单的规则是,如果它看上去和读起来对一般人都OK 的话,那就没问题了。

网站内部的内容架构

这一部分的目的就是分配你站点的PR,使你的主页尽可能高效的运转。

PR(页面分级)与你的导入链接的数目和质量有关,一个好的PR可以提升你的页面在搜索结果中的位置。

如果想看一下你的和其他网站的PR,可以下载Google Toolbar.

在理想的世界里,每一个页面都有他自己的导入链接和PR,但事实上这是不可能也不必要的。

Google建议在每一个页面里有不超过50100的链接。简单说,每个页面的PR将随着来自于首页的点击而减少,所以你要寻求一种架构,这种架构能给你的每一个网页最少的点击。

竞争性条款可能要更多的PR才能攀升到顶部,因此,你可能想要将一些非常规的等级分类引进你的构架之中,从而使你的特殊网页比其他普通网页得到更多的PR值。

最简单的分配PR又不扰乱你的网站的方法是,使用与你主页相断开的站点地图(Sitemap)。很明显的,这将在连接到你每一个网页的过程中增加一个点击,同时与你的架构相对应的,又与你的主页相结合了。

建立导入链接

这是一个最有挑战性的策略,这个部分需要你做大量的工作,同时进行创造性的思考。

这里有几个方法得到导入链接:

l 和其他的网站交换互惠性的链接

l 购买单向链接

l 建立一些关于你的网站的新奇的东西,这样网民可以在任何地方连接到它

我觉得来自于权威性的网站的导入链接对于竞争性条款是很重要的,甚至对于那些非竞争性的条款,你可能也需要一些好的链接以使你的网站得到进一步的发展。

GOOGLE的角度看,他们正在寻找那些值得他们公布或者展示的网站去链接,比如:不是为了金钱的目的,或者只是链接交换的结果。

对于你的网站,可能有很多其他的方法从高质量的相关的网站得到导入链接,有什么更好的建议和方法,欢迎一起探讨和分享!

转自[网站优化指南]

Tags: ,
Posted in keyboard's joy at April 15th, 2008. No Comments.

Wordpress的效率问题似乎一直是议论的热点,今天来看看其中一条SQL语句的效率。

首先将所有插件禁用,并切换为默认模板。 然后按照《WordPress执行效率问题》这篇文章的方法, 在 wp-config.php 中加入

<?php define('SAVEQUERIES', true); ?>

在模板的 footer.php 中加入

<!-- <?php var_dump($wpdb->queries); ?> -->

访问首页,即可从源代码中看到SQL语句。

执行时间最长的是这一条,花了0.02秒:

SELECT DISTINCT * FROM wp_posts
WHERE 1=1
AND post_date_gmt <= '2007-01-02 07:12:59'
AND (
post_status = 'publish'
OR
post_author = 1
AND post_status != 'draft'
AND post_status != 'static'
)
AND post_status != 'attachment'
GROUP BY  wp_posts.ID
ORDER BY post_date DESC
LIMIT 0, 10"

这条语句位于 class.php 的 WP_Query->&get_posts() 函数。

说说这个SQL语句的问题。不妨先来看看 wp_posts 表的结构(省略无关列)。

列名 类型 索引
ID bigint(20) PRIMARY
post_author bigint(20)
post_date_gmt datetime
post_status enum INDEX
post_name varchar(200) INDEX

首先是关键字 DISTINCT,DISTINCT的作用是去掉重复的数据, 相当于对选择的列进行 GROUP BY。而这条语句中选择了 * 列,包含了主键列 ID, 每行数据必然不相同,因此 DISTINCT 关键字起不到任何作用, 白白浪费一次排序。

其次是 post_date_gmt 和 post_author 上的比较操作。wp_posts表仅有 ID、post_status 和 post_name 列上有索引,对其他列的比较操作使得mysql不得不访问wp_posts表的所有数据, 影响效率。

然后是 post_status 上的不等于的比较。对索引列使用不等于比较, 会导致数据库不能使用索引(索引只能判断等于关系)。 另外显然已经有了 post_status = ‘publish’ 的条件, 不必再判断 post_status != ‘attachment’。

最后是 GROUP BY wp_posts.ID,仍然是对一个不会重复的列进行 GROUP BY, 毫无意义。

如果不考虑功能损失,将这个 SQL 语句优化为下面这样,则仅需花费0.003秒。

SELECT * FROM wp_posts
WHERE 1=1
AND post_status = 'publish'
ORDER BY post_date DESC
LIMIT 0, 10"

使用Apache Bench做测试,优化前平均每个请求的处理时间为 503.125ms,优化后为 478.125ms。

Tags: , , ,
Posted in keyboard's joy at April 14th, 2008. No Comments.

0、中文WordPress工具箱: 使用这 个插件,你可以显示随机文章,最新留言(最新引用),留言最多文章,发表评论最多的网友,还有真正的文章摘要,等等,真正截断,没有乱码。

留言相关:

1、Akismet:最流行的反垃圾留言插件。可能吧使用WP至今,它已经协助屏蔽了1700多条垃圾评论。

2、Spam Karma 2:又一个垃圾留言屏蔽插件,和Akismet相比,这个要更为复杂一些。

3、Threaded Comments:实现有针对性的留言。也就是可以针对某个留言进行留言,这个留言不出现在最底部,而是在所针对的留言的下方。

4、Subscribe to Comments:让评论者订阅文章后续评论的插件。

5、Webcam Comments:觉得文字留言太乏味?试试语音或视频留言如何?

6、Gravatars:只要留言者在Gravatars网站上传了头像,在留言时就能显示留言者的头像。

7、De-link Comment Author:有时候你想删除一个评论者的链接但不想删除整个留言,这个插件可以帮助你。

8、Ajax Comments-Reply:将留言系统设置成Ajax形式,不用刷新即可添加评论。

9、DMS Guestbook:为你的博客制作一个留言本。

10、Sexy Comments:替换原来的评论模板,让评论区域看起来有点像论坛的风格,确实相当Sexy。

11、Math Problem Spam Protection:和留言验证码差不多,这个是要回答一道简单的数学问题。

12、Link Love Plugin:去除留言者链接里的”nofollow”标签。

13、Do-Follow:和Link Love Plugin一样,去除留言里的nofollow标签。

SEO相关:

14、All-in-One SEO Pack:必备的SEO插件,不详细介绍,具体参看Wordpress的SEO插件

15、Permalink Redirect:在介绍Wordpress的SEO插件时介绍了这个插件,一个实现301转向的插件。

16、Google Sitemaps:在博客根目录生成一个sitemap.xml文件,并自动提交到Google,方便搜索引擎进行索引。

17、Google Pagerank Plugin:展示Page Rank的插件。

18、Alexa Ranking:展示Alexa排名的插件。

19、Dagon Design Sitemap Generator:生成一个网站地图。具体可以看可能吧的网站地图

20、No WWW:将所有含有www的URL都转向到无www的URL。

21、Simple Tagging:给文章添加标签。

22、Ultimate Tag Warrior:在Wordpress的SEO插件时也介绍了这个插件,主要是用来添加文章标签。对SEO也有一定的帮助。

23、Robots.TXT:协助你方便地编辑robots.txt,我觉得手动编写好robots.txt再上传会更好。 Read More…

Posted in keyboard's joy at April 14th, 2008. No Comments.

The robots.txt file is used to instruct search engine robots about what pages on your website should be crawled and consequently indexed. Most websites have files and folders that are not relevant for search engines (like images or admin files) therefore creating a robots.txt file can actually improve your website indexation.

Implementing an effective SEO robots.txt file for WordPress will help your blog to rank higher in Search Engines, receive higher paying relevant Ads, and increase your blog traffic.

Here is my robots.txt files, which can further protect WordPress from this duplicate content issue.


User-agent: *
Disallow: /wp-
Disallow: /feed/
Disallow: /trackback/
Disallow: /comments/feed/
Disallow: /page/
Disallow: /comments/

After you created the robots.txt file just upload it to your root directory and you are done!

Posted in keyboard's joy at April 11th, 2008. 1 Comment.

前些日子装好了PHP的环境,然后安装上了MYSQL,网上说phpmyadmin可以简单的以图形界面管理mysql,于是就安装了一个phpmyadmin,结果一打开,显示“访问被拒绝”,首次接触php,不知道从哪里下手解决问题,从网上搜啊搜怎么说的都有,但就是没有一个能解决问题的,愁。
不甘心,今天晚上又搜,找到一篇文章,如题,结果真就把问题解决了,原来简单的问题复杂化了。
下面是内容,原文:

Quote
#Tar jxvf phpMyAdmin-2.10.1-all-languages.tar.bz2 //解压

#mv phpMyAdmin-2.10.1-all-languages /var/www/html/database //讲整个目录移到默认的WEB根目录下并改文件名为database

#cp config.inc.sample.php config.inc.php //将config.inc.sample.php改为config.inc.php

#vi config.inc.php

$cfg[’Servers’][$i][’auth_type’] = ‘cookie’;// phpMyAdmin有3种授权模式:
cookie: 显示一个web登录页面,输入mysql的用户名和密码,然后进入管理界面
http: 显示1个windows登录框,输入mysql的用户名和密码,然和进入管理
config: 把mysql用户名和密码直接填入config.inc.php,不显示登录界面,直接进入管理界面
phpMyAdmin的配置文件名为config.inc.php,各版本的config.inc.php修改方法如下:

$cfg[’blowfish_secret’] = ‘php’;(其中的”php”自定义)
修改以后,以后登入phpmyadmin就方便多了,但一定不要使用空密码,切记!

我什么也没修改,就是把$cfg[’blowfish_secret’] 的值设定了一个,结果访问通过了,一切正常。
唉,希望和我一样初次接触PHP的朋友能够不在为这么简单的问题而困惑!

Posted in keyboard's joy at July 13th, 2007. 1 Comment.
/wp-content/uploads/200707/12_152648_9351c585e4f0e3108479dae84ebf9086.jpg
Tags:
Posted in Jimmy at July 12th, 2007. 1 Comment.
/wp-content/uploads/200707/12_151731_76edb6e6af52bd337ea655a42b4768cc.jpg

关于我想变成一棵树的想法,我
一直无法启齿。并非人际关系失
败,男女关系低能,或是毫无成
就感。更别把弗洛伊德、女性主
义,或者悲惨童年给牵扯进来。
我想做一棵树,只想随风飘摇。
枝叶繁茂。

我想做一棵树、只想青青翠翠。
平凡稳定。请别将简单的问题变
得复杂……有个朋友还只想做一
颗甜甜的薄荷糖呢。

Tags:
Posted in Jimmy at July 12th, 2007. 1 Comment.

1、在ACCESS中经常使用的自动编号字段,导入到MSSQL后,他并不是自增型的INT,需要手工设置,把导入后的自动编号字段的标识的“否”改为“是”,“种子”和“递增量”都为“1”,才能成为自动编号;

2、在MSSQL SERVER中,有许多保留字,在ACCESS中是没有的,当你把数据导入到MSSQL的时候,问题就出来了。MSSQL在导入的时候,会自动给这些字段(包括数据库中的表名)加上“[字段名]”,因此,你必须修改你的脚本,把相应的字段名字(或者表名字)加上中括号,或改变字段名字为不是MSSQL的保留字。
例如user应该写为[user]
(具体是那些,请参考有关资料)

3、在用ACCESS关于时间的使用,大家喜欢使用“SELECT * FROM AAAA WHILE TIME="&NOW()”这样的SQL语句,然而,在MSSQL中没有“NOW()”这个函数,而是使用“GETDATE()”,所以,所有的SQL语句中的“NOW()”必须换成“GETDATE()”,请吧sql语句和默认值改为getdate()。

4、在ACCESS中SQL如果用到mid(str,bengin,strlen),在MSSQL中没有这个函数,可以用这个代替left(right(str,len(str)-1),strlen),例如
Mid(”202.097.181.059”,5,3)
改为:left(right(”202.97.181.059”,len(”202.097.181.059”)-),3)

5、在ACCESS的SQL语句中的时间使用变量查询的时候,大家一般使用“SELECT * FROM AAAA WHILE TIME=#"&变量名&"#"”,在MSSQL中是不行的,他的语法是“SELECT * FROM AAAA WHILE TIME=”"&变量名&"”"”。(意思是让你把日期时间变量当成字符串来使用,呵呵~~~)

6、在需要用到时间计算的时候,通常大家使用“SELECT * FROM AAAA WHERE DATEDIFF(”dd”,#"&NOW()&"#,被比较的字段名)>0”这样的语法,在使用到MSSQL的时候是绝对通不过的,即使把#"&NOW()&"# 换成了”"&GETDATE()&"”也没有用,因为MSSQL中的DATEDIFF()函数不认识“”计算类型””里的单引号,你必须使用双引号,并且使用两个(ASP的语法规则)。因此这样的语句应该换成“SELECT * FROM AAAA WHERE DATEDIFF(""dd"",”"&GETDATE()&"”,被比较的字段名)>0”。

7、在ACCESS数据表中的“是/否”类型字段,导入到MSSQL后,是BIT字段,他的值不再是“TRUE”或“FALSE”,而是“1”和“0”,并且“1”和“0”在ASP中并不绝对等同于“TRUE”或“FALSE”,因此在引用这些数据的时候,要加以注意。

8、ACCESS中备注型在MSSQL中改为TEXT或者NTEXT性,长度默认为16就可以,不影响贴子长度!
9、ACCESS中SQL语句 delete * from 表名…. 再MS SQL中改为delete from….

10、ACCESS 中的好多默认值在MSSQL中需要手工添加,特别是int型,请对照改动!

Tags:
Posted in mssql at June 28th, 2007. No Comments.

2007/06/29 更新:
增加随机码,确保每次都有效读取。

============================

这段时间一直对javascript挺感兴趣的。
前些日子开始用prototype的一些脚本,说起来惭愧,早就存在而且出名的东东,自己竟然不知道,唉。
用prototype.js的Ajax.Request实现异步传递真不错,可以把整个表单转换成string来传递,也可以单独获取某一个文本域的值,可是有一个缺点就是不支持中文参数传递(可能是我没发现),毕竟是老外的写的东东。经过一番琢磨,我发现是在内部脚本中对参数编码的问题,老外不管什么参数都用encodeURIComponent()函数进行编码,而中文则适用于escape()函数。经过测试,问题解决了,可以实现传递中文参数了。在实际应用中,可以指定encoding,若:encoding:”gb2312″,则自动转换为escape()函数进行编码;若不指定encoding则使用默认函数encodeURIComponent()。

我把修改过了prototype.js放上来,需要的朋友下载就是了,版本是1.5.0

Click Here To Download

Tags: ,
Posted in keyboard's joy at June 28th, 2007. No Comments.

近一段时间网上对BLOG恶意评论与引用越来越猖狂,真是太可恶了,提交需要验证码也不能阻止,真是气死我了. 想想原因,还是在验证码上,网上传说那些机器人可以分析验证码图片,真是太牛X了,但是你分析出来了也还是要提交的,对,就从输入框这下手,阻止他们!! 这招还真管用,我的BLOG自从换了验证码输入形式以后,几乎没有了机器人提交的东西,呵呵.下面给大家分享一下,希望为清理网络环境出一点力!

// JavaScript Document===验证码表现类
/*
///////////////////////////////////////////////////////////////////////////////
Jena’s Blog
作 者: 迦楠(Jena.want)
版权所有: IsHere.cn
技术支持: jena.want@gmail.com
单元名称: JENAValidCode
开始时间: 2007-5-30
最后修改:
参 数: instanceName-输入框名称;imgUrl-验证码程序地址;inputAmount-验证码位数.
备 注: 这是一个验证码表现类,支持内嵌各种类型的验证程序(gif,bmp…)
///////////////////////////////////////////////////////////////////////////////
*/
var inputsAmount;
function JENAValidCode(instanceName,imgUrl,inputAmount,inputStyle){
this.InstanceName = instanceName || ‘CheckCode’;
this.ImgUrl = imgUrl || ‘CheckCode.asp’;
this.InputAmount = inputAmount || 4;
this.InputStyle = inputStyle || ‘text’;

inputsAmount=this.InputAmount;
}
JENAValidCode.prototype.Create=function(){
var strs=”";
strs+= “<input name=\”"+ this.InstanceName +”\” type=\”hidden\” id=\”"+ this.InstanceName +”\” />”;
for(var i=1;i<=this.InputAmount;i++){
if(i==1){
strs+= “<input name=\”scode1\” id=\”scode1\” maxlength=\”1\” type=\”text\” class=\”"+ this.InputStyle +”\” onKeyUp=\”javascript:if(this.value!=”&&scode”+ (i+1) +”.value==”){scode”+ (i+1) +”.style.display=”;scode”+ (i+1) +”.focus();this.style.borderRight=’0px’;}”+ this.InstanceName +”.value=MusterValue()\” style=\”text-align:center; width:14px;\” />”;
}else if(i==this.InputAmount){
strs+= “<input name=\”scode”+ i +”\” id=\”scode”+ i +”\” maxlength=\”1\” type=\”text\” class=\”"+ this.InputStyle +”\” style=\”display:none;text-align:center; width:14px; border-width:1px 1px 1px 0px\” onKeyUp=\”javascript:”+ this.InstanceName +”.value=MusterValue()\” />”;
}else{
strs+= “<input name=\”scode”+ i +”\” id=\”scode”+ i +”\” maxlength=\”1\” type=\”text\” class=\”"+ this.InputStyle +”\” style=\”display:none;text-align:center; width:14px; border-width:1px 1px 1px 0px\” onKeyUp=\”javascript:if(this.value!=”&&scode”+ (i+1) +”.value==”){scode”+ (i+1) +”.style.display=”;scode”+ (i+1) +”.focus();this.style.borderRight=’0px’;}”+ this.InstanceName +”.value=MusterValue()\” />”;
}
}
strs+= ” <img src=\”"+ this.ImgUrl +”? + Math.random()\” id=\”secCode\” align=\”absmiddle\” />”;
strs+= “<span style=\”font-family:Verdana;font-size:9px;cursor:pointer;\” onclick=\”javascript:document.getElementById(’secCode’).src=’”+ this.ImgUrl +”?’ + Math.random();scode1.value=”;scode1.focus();”
for(var i=2;i<=this.InputAmount;i++){
strs+=”scode”+ i +”.value=”;”
}
strs+=”\”> Another</span>”;
document.writeln(strs);
//return strs;
}
function MusterValue(){
var mustervalue=”";
for(var i=1;i<=inputsAmount;i++){
mustervalue+=document.getElementById(“scode”+i).value
}
return mustervalue;
}

Posted in keyboard's joy at May 30th, 2007. 1 Comment.
Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...17 18 19 Next