这个话题似乎是老调重弹了,也有很多人给出了相应的方法。我的方法如下:
RewriteCond %{REQUEST_URI} !^/wp-includes/images/noimage.png$ [NC]
RewriteCond %{HTTP_REFERER} !^http://[0-9a-z]+\.inspiremedia\.org/.*$ [NC]
RewriteRule \.(jpg|gif|png|zip|gz|rar)$ http://tech.inspiremedia.org/wp-includes/images/noimage.png [R,L]
主要功能位于第二行,当请求的HTTP_REFERER头不输入本站所在的域时,则执行第三行的重写规则,重定向至 noimage.png。 第二行最后的[NC]表示匹配时忽略大小写。第一行用于防止死循环。
2006-12-26
接受建议,将重写规则仅适用于 wp-content/uploads 下的文件。
RewriteCond %{HTTP_REFERER} !^http://[0-9a-z]+\.inspiremedia\.org/.*$ [NC]
RewriteRule wp-content/uploads/.*\.(jpg|gif|png|zip|gz|rar)$ http://tech.inspiremedia.org/wp-includes/images/noimage.png [R,L]
这是一个根据IP地址判断所在国家的插件。用处很多,显示评论者国家、阻挡垃圾评论等等。 其实这种插件有很多,比如IP to Country, 不过这个程序感觉一来效率不高,二来用起来也不是很方便。于是我写了这个插件,仅仅一个函数。
原理很简单,将IP地址范围保存到MySQL数据库中,然后通过SQL取出给定IP地址的数据,显示国家即可。
$ip = ip2long($ipaddr);
$sql = sprintf("SELECT country FROM ip2country WHERE ip_from<=%u AND ip_to>=%u", $ip, $ip);
$row = $wpdb->get_row("$sql");
return $row->country;
阅读全文 »在blog上添加mp3播放器的方法有很多,这里介绍通过 Flash MP3 Player 来播放音乐的方法。
首先到 Flash MP3 Player 的主页上下载该程序。 解压缩之后,将 mp3player.swf 和 ufo.js 两个文件放到服务器上,这里假设放在 /musicplayer 下。 (注意,Flash MP3 Player有个bug,路径名中不能包含 mp3 字样,否则不能正常读取播放列表。)
在wordpress当前主题目录中建立 mp3player.php,内容如下。
<p id="mp3player"><a href="http://www.macromedia.com/go/getflashplayer" target="_blank">下载 Flash Player</a>来播放音乐。</p>
<script type="text/javascript">
var FU = {
movie:"/musicplayer/mp3player.swf",
width:"190",
height:"20",
majorversion:"7",
build:"0",
bgcolor:"#FFFFFF",
flashvars:"file=/musicplayer/playlist.xml&showdigits=true&repeat=true&shuffle=false&lightcolor=0x0080FF&backcolor=0x0066AA&frontcolor=0xEEEEEE" };
};
UFO.create( FU, "mp3player");
</script>
然后在 sidebar.php 的适当位置加入:
<?php include(TEMPLATEPATH . '/mp3player.php'); ?>
在 header.php 中加入:
<script type="text/javascript" src="/musicplayer/ufo.js"></script>
最后将mp3文件上传到 /musicplayer 目录下,最好文件名为英文名,然后在 /musicplayer 下建立 playlist.xml 文件。
<?xml version="1.0"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
<trackList>
<track>
<title>Music Title</title>
<creator>Singer</creator>
<location>/musicplayer/song.mp3</location>
</track>
</trackList>
</playlist>
效果如下图。
花了一个星期的时间从零开始打造了这个 Web 2.0 风格的主题。主色调为橙色。 其实还主要是受到了这篇文章的影响, 大号字体,圆角,倒影,阴影等效果全都用上了。Firefox 2.0、Opera 9、IE6 下测试通过, 估计Firefox 1.5和Opera 8应该也没有问题。
制作过程中着实被IE6郁闷了好几次。不支持透明png,box模型计算bug,overflow的特殊处理, 一系列令人头疼的问题,一直在想,要是世界上没有IE这个东西该多好……然而残酷的现实是 IE市场占有率最高,唉……
不过虽然制作很辛苦,结果还是挺满意的。最爽的就是在页脚上写上 create by charlee 的时候, 那个爽啊,就像当年中国爆炸原子弹时一样。
上述那些问题的解决方案以后另撰文阐述。也许过一年IE7流行开来之后, 这些问题就不复存在了。
另外感谢 fcicq 指出主题的错误。 我的blog上装了很多插件,而这个主题也用到了很多插件的内容。 等过阵子有时间我会将主题对插件的依赖性改掉的。
依赖的主题
- Ultimate Tag Warrior
- WP-PageNavi
2006/12/06
已经修改了主题,去掉了对插件的依赖性。
下载地址:
simpleweb2-orange-100.zip
wp-cache 这个插件能够将 WordPress 的页面输出内容进行缓存, 这样第二次访问该页面时就不必访问数据库,从而加快页面生成速度,并降低服务器负载。 但很可惜这个插件是为 Unix/Linux 系统设计的,如果服务器是 Windows,该插件将会出现错误。 在Windows下使用该插件需要做些修改。
- 修改 wp-cache/wp-cache.php,找到 wp_cache_check_link() 函数,紧接着该函数的 global 变量声明
加入下列语句:
return true;
该函数的功能是检查符号链接,而Windows系统不支持符号链接,所以加入 return true 让该函数短路。 - 将 wp-cache/wp-cache-phase1.php 复制到 wp-content 下并改名为 advanced-cache.php。 官方安装手册上要求使用 ln -s 命令建立符号链接,而Windows并不支持符号链接,只能直接复制了。
- 修改 wp-cache/wp-cache-phase2.php,查找 ob_end_clean (大约在 220 行前后)将其修改为 ob_end_flush, 再将约10行之后的 flush 语句注释掉。
这样在插件面板中激活wp-cache,并在选项面板中 Enable Cache 即可。
另一个常见的问题就是 cache 不起作用,浏览任何页面 wp-content/cache 下也不会生成 cache 文件。 很可能因为当前的主题末尾忘记使用 </html> 标记。修改主题的 footer.php 文件并在最后添上 </html> 即可。
Weighted Categories 这个插件经过修改之后可以用来显示 TagCloud。 但是这个插件显示出的 TagCloud 总觉得有点别扭。一般人都是擅长某几个方面,很少样样精通的, 因此一般的博客总是会出现几个文章数非常多的标签,以及大量仅有一两篇文章的标签。 而 Weighted Categories 插件使用四则运算来计算标签的大小(附图公式(1)),结果就造成几个巨大标签混杂在大量的小标签中的 “众星捧月”的现象。
例如,假设有四个标签,文章数分别为 tagA=100、tagB=10、tagC=5、tagD=1,标签级别为 1~10,则各个标签的级别如下:
| 标签 | 文章数 | 计算式 | 级别 |
| tagA | 100 | 100 / 99 * 9 + 1 | 10 |
| tagB | 10 | 10 / 99 * 9 + 1 | 1 |
| tagC | 5 | 5 / 99 * 9 + 1 | 1 |
| tagD | 1 | 1 / 99 * 9 + 1 | 1 |
显然,由于tagA的存在,其他标签都被挤到了最底层。
解决这个问题的方法就是利用对数函数。(对数函数的效果可见本文。) 计算公式见附图公式(2)。
公式(2)的结果与对数的底是无关的,见公式(3)。
用公式(2)计算上例得到下面的结果:
| 标签 | 文章数 | 计算式 | 级别 |
| tagA | 100 | log(100) / (log(100)-log(1)) * 9 + 1 | 10 |
| tagB | 10 | log(10) / (log(100)-log(1)) * 9 + 1 | 5 |
| tagC | 5 | log(5) / (log(100)-log(1)) * 9 + 1 | 4 |
| tagD | 1 | log(1) / (log(100)-log(1)) * 9 + 1 | 1 |
显然这个结果要比原来的结果漂亮多了。

mysql 从版本 4.1 起增加了多国语言字符集功能。 数据在插入到数据库或者从数据库中取出时,mysql会自动进行字符集变换。 在创建数据库时必须要指定数据库字符编码,而客户端在连接mysql时也必须要指定客户端字符编码。 假设数据库字符编码为utf8,而客户端字符编码为gb2312, 那么执行select时mysql会将字符串从 utf8 转换成 gb2312, 而在执行 insert、update等时会将客户端输入的数据从 gb2312 转换成 utf8。
WordPress的数据使用 UTF-8 编码,因此在 mysql-5.0中创建数据库时应当将字符集指定为 utf8。 遗憾的是 php 等脚本语言不会自动设置客户端字符编码,因此mysql会选择默认的 latin1 , 这样在执行 select 时mysql会将数据从utf-8转换到latin1,造成乱码现象。
解决方法就是在执行 mysql_connect 之后执行以下语句
mysql_query("SET NAMES utf8");
使用phpMyAdmin-2.8.0.2完整的升级方法如下:
- 从原有的数据库中导出表结构和数据。
- 在mysql-5.0中创建数据库,设置字符校对为 utf8_general_ci。
- 向数据库中导入数据,导入时设置数据编码为utf8。
- 修改 wp-includes/wp-db.php,在wpdb类的wpdb函数中(57行前后)添加以下内容。
function wpdb($dbuser, $dbpassword, $dbname, $dbhost) { $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword); ...... $this->query("SET NAMES utf8"); // 添加这一行 $this->select($dbname); }

用过 del.icio.us 的人一定知道,该网站的标题栏后面有一个标签输入框, 在输入框中输入标签名即可直接跳转到想要看的标签,而不必从纷繁芜杂的标签云中去寻找。 如果你在 WordPress 中添加了标签云, 一定也想在标题栏后添加一个类似于 del.icio.us 那样的输入框吧。
这里是仿照 del.icio.us 制作的标签输入框代码。
crumb.zip
使用方法如下。
- 首先按照这个方法打开永久链接。
- 下载 prototype,然后将 prototype 和本文附带的 crumb.js
放到你的主题目录下的 js/ 目录下,然后在主题的 header.php 的 <head> 标记内加入以下代码。
<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/prototype.js"></script> <script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/crumb.js"></script> - 在你想加入标签输入框的地方加入以下代码(通常是在blog的标题后)。
<h1 id="pagetitle"> <a id="top"></a><a href="<?php echo get_settings('home'); ?>/"><?php bloginfo('name'); ?></a> <!-- 上面是blog标题,下面是标签输入框的代码 --> / <span id="crumb"><?php echo single_cat_title(); ?></span> <script> if(Crumb) Crumb.go('crumb', '<?php echo get_settings('home').get_settings('category_base').'/'; ?>'); </script> <!-- 标签输入框代码结束 --> </h1> - 最后在主题的 style.css 中增加以下代码,以定义标签输入框的样式。
span#crumb input { font-size: 0.7em; font-family:verdana,sans-serif; background-color: #FFFFFF; border: solid 1px #DDDDDD; color: #808080; } span#crumb input.crumb-focus { border: solid 1px #000000; color: #000000; }
WordPress有个很好用的插件:Weighted Categories, 它能够将分类名显示成tag cloud,即文章数多的分类使用大号字体,文章数少的分类使用小号字体。 但是这个插件有两个问题,一是最后一个分类的链接不正确,这一点官方主页上也有人提出过; 二是各个级别的分类的样式是通过计算得出的,无法自定义样式。
针对以上两个问题,我修改了这个插件,并将其汉化。新的插件可以在这里下载。
weighted-categories.zip
使用时将 weighted-categories.php 放到 wp-content/plugins 下,然后在管理面板中激活该插件。 然后在模板中加入以下的代码以显示tagcloud。
<div id="tagcloud"> <?php weighted_categories(1, 10, ""); ?> </div>
然后需要在模板的 style.css 中加入你自己的分类级别样式定义(必须,否则各个级别显示出来都一个样)。 附带的 style-sample.css 为示例。
修改后的 weighted_categories 定义如下:
function weighted_categories($minlevel=1, $maxlevel=10, $exclude_categories) - $minlevel: 最小级别的编号 - $maxlevel: 最大级别的编号 - $exclude_categories: 不想显示的分类id,使用逗号分割,例如 "1,25"表示不显示 id 为 1 或 25 的分类
当然,为了让这些标签看起来更像真正的标签,我们需要在WordPress的选项中打开永久链接, 并在选项->永久链接的分类基础选项中填入“/tag”,这样分类的链接就会显示为 /tag/分类名。
