升级WP旧模板,让它支持Widgets

正如大家所见,我使用的WordPress模板已经是很旧很旧的了,是以前在WordPress 1.5还是1.0系列的默认模板之上,简单修改而来的。没有选用三栏布局,因为我喜欢用稍微大一点的字体,三栏布局对我来说侧边栏东西太多,加上文章长了以后侧边栏的下面空白很大。不过旧模板自然也就没有Widgets:

No Sidebars Defined

You are seeing this message because the theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions.

刚开始我还能忍受,Sidebar上没有的东西俺自己手工加上,不过用上Simple Tags插件之后,感叹到了插件和Tags的强大,Relate Post很方便,可Relate Tags就是出不来,探查一番,原因应该就是我的模板不支持Widgets。所以忍不住了,模板可以不变样,但不能不升级,我就动手把它改成支持Widgets的吧。

刚才的提示中已经给出了修改指引的链接,首先把模板中的Sidebar改成ul形式的,Theme Editor -> Sidebar (sidebar.php),第一行的ul换成div即可:

<ul id="sidebar">
......中间的很多内容
</ul>

看了一下,对外观没有太大影响,css应该是用id来引用的,不过还是需要调整一点css:

/* 启用Widgets后Sidebar样式有些变化,在这里修正 */
#sidebar {list-style: none;}
#sidebar li ul li:before {
    content: "\00BB \0020";
}
#sidebar li ul li {
    margin-bottom: 5px;
}

然后还是修改Sidebar模板文件,加入是否有动态Sidebar的检查、如果有就调入的PHP代码:

<ul id="sidebar">
<?php if ( !function_exists('dynamic_sidebar')
    || !dynamic_sidebar() ) : ?>
......中间的很多内容
<?php endif; ?>
</ul>

代码一共就3行,前面加2行,后面加一行,就是个简单的判断而已。别着急,现在还没有完成,还有最后一步。

在模板目录下,比如我的就是wp-content/themes/fwolfs-blog这个目录,创建一个新文件functions.php,内容就4行:

<?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?>

好了,现在再刷新Design -> Widgets页面,就有内容了,我的旧模板现在也支持Widgets了。

同样的,Design -> Theme Editor页面中也会多一项可编辑内容:

Theme Functions (functions.php)

PS1: 如果要添加多个Sidebar,需要模板的支持,也就是模板中制定需要几个Sidebar,在Design中就能管理几个(register_sidebars(n),n就是Sidebar数量)。

PS2: 如果想在Widgets的Text里面内嵌php代码,比如设定只有首页才显示BlogRoll,那么需要安装PHP Code Widget插件,并使用PHP Code代码块。直接在原来的Text中写php代码的话,会原封不动的被当成php代码输出,昏死。

PS3: 一切都折腾好了,Relate Tags功能还是得手工添加php代码块到Widgets中:

<?php
if (is_tag()) {
    st_related_tags();
    st_remove_related_tags();
}
?>

Linux下的firefox如何播放在线媒体

印象中,我Ubuntu下的firefox上网时,从来没有看到在线视频“动”过,包括观看十七大转播的时候,虽然cctv专门把首页都改成了报告专栏,但视频直播我看不到,只能看看文字转播。linux下的firefox就不能看在线视频么?显然不是,只是需要额外作点工作而已。

首先,我找到了mplayerplug-in,嫌编译太麻烦,直接下载了它为Fedora Core 6准备的rpm包,用alien转成deb,dpkg -i安装,倒是都顺利,可仍然不能播放。Mozilla Plugin Support on Linux (x86)页面上给这个插件标的状态是“Untested”,看来似乎还不够完善。

然后,又找到了别人说不错的Firefox Addon MediaPlayerConnectivity,也许是我网速太慢,居然在安装的时候遇到了错误,无法继续。

最后,又看到网上别人说装个mplayer-plugin包就可以了,apt一搜索,压根就没有嘛,不过拐了个小弯,用apt搜索了一下mplayer,发现了mozilla-mplayer,安装试试,安装时还会自动提示把刚才装的mplayerplug-in卸载,看来有戏,完成后一试,果然不错,能用,并且还挺好用呢。

想测试一下的话,可以到这里打开个在线视频试试,注意标着Inline才是在线的,External是直接提供下载的。缓存的时候如果着急,可以点右键选“Play”先看着;还有好处就是有很多选项可以定制,甚至能指定视频缓存保存位置──想保存在线视频的话就省事多了。

另外说点题外话,在制作网站时,嵌入媒体建议使用相对标准的语法,就像符合web 标准的媒体播放器代码一文中推荐的那样,比如我嵌入的wmv视频代码:

<object type="video/x-ms-wmv" data="a.wmv" width="320" height="260">
<param name="src" value="a.wmv" />
<param name="autostart" value="true" />
<param name="controller" value="true" />
</object>

使用标准的代码即简单明了,又有利于跨平台、跨浏览器的兼容。

WordPress 插件编写简例

虽然市面上有很多 WordPress 的插件,但未必能够满足我们那些稍微“变态”一些的需求,所以,参照wp官方的插件编写指南,写下这个简单的说明和小例子,希望对大家有所帮助。

插件编写需要php的基础知识,并且本说明的内容大多只适用于wp1.5以后版本。

插件程序建议放置在wp-content/plugins/目录,如果有多个程序文件的话,可以在这个目录下建立子目录,程序所需的资源文件建议也放在这个目录下,便于更新和管理。

wp插件主要分为两种:

  • Action 对wp的行为事件进行修改,比如修改数据库,发送邮件或者修改显示结构等。
  • Filter 对wp的输入输出内容进行修改。

在本例中,我们将建立一个简单的Filter插件,替换wp本来的文章摘要生成功能,把以前手工修改代码实现的内容,用插件来替代。

wp推荐在插件程序中加入这样的文件头,便于wp辨认插件的信息,就像下面这样:

<?php
/*
	Plugin Name: 插件名称
	Plugin URI: http://插件网址
	Description: 插件说明
	Version: 插件版本
	Author: 插件作者
	Author URI: http://作者网址
*/

插件的代码风格主要是基于过程方式的,所以要尽力避免函数重名,可以在函数名之前加上自己的名称前缀,也可以把自己的类包含在一个类当中,不过小型插件还不至于复杂到要使用类的程度吧?

函数的编写就是php代码了,注意Filter一定要返回数据,即使没有修改也要返回,不然后续的其他函数就没法干活了。更多的信息可以看官方的插件api

编写完成之后,函数是不会自动执行的,wp为插件函数的执行提供了一种hook机制,就是在原始的wp程序中,预置了一些hook或者叫挂载点,通过把插件函数挂在这些hook上,就可以被执行,目前wp提供的挂载点一览见Hooks列表。

针对我编写的函数,是要挂在生成文章摘要的地方,查找了一下Hooks列表,发现和摘要(excerpt)相关的有:

default_excerpt 
excerpt_edit_pre
excerpt_save_pre 
get_the_excerpt
the_excerpt

从名称可以看出,default_excerpt是文章的默认摘要,excerpt_edit_pre和excerpt_save_pre是编辑文章是对摘要进行的预处理,get_the_excerpt是取摘要,the_excerpt是返回摘要。我编写的是生成摘要的功能,应该挂在get_the_excerpt或者是the_excerpt上,考虑the_excerpt可能更“底层”一些,挂在这里。

挂载的语法也是一个php函数调用,格式如下:

add_filter('hook_name', 'your_filter', [priority], [accepted_args]);

priority为优先级,默认为10,数字小的会先执行;accepted_args为参数个数,默认值为1,如果插件函数需要多个参数的话需要自行设定。这两个参数在使用默认值的时候都可省略。

基本上有这些就够了,我的插件程序完整代码如下:

<?php
/*
	Plugin Name: Excerpt Trimmer
	Plugin URI: http://www.fwolf.com/
	Description: 替换wp本身的“摘要”生成功能,用于在列表或者查询页面显示文章部分内容。
	Version: 1.0
	Author: Fwolf
	Author URI: http://www.fwolf.com/
*/
 
function fw_excerpt($text)
{
	$excerpt_length = 4;
	$words = explode("\n", $text, $excerpt_length + 1);
	if (count($words) > $excerpt_length) {
		array_pop($words);
		array_push($words, '<p />......<a href="' . get_permalink($post->ID) . '">[阅读全文]</a>');
		$text = implode("\n", $words);
	}
	return $text;
} // end of func fw_excerpt
 
add_filter('the_excerpt', 'fw_excerpt');
?>

可以看出插件程序也就是由上面介绍的3部分组成:文件头,函数体,挂载声明。

其实就简单插件来讲,最关键的是找对相应的hook,这就要靠经验和摸索了,wp官方文档好像也没有对每个hook作出详细的解释。

现在,把我这个插件程序保存为wp-contents/plugin/excerpt.php,登录wp,进入plugin设置,就能够看到“Excerpt Trimmer”插件了,启用之就大功告成了。我还存了一份在这里,方便下载。

如何为网站添加sitemap文件

什么是sitemap?简单的说,就是一个xml文件,定义了你网站“主要栏目”的结构,以方便搜索引擎更好的建立索引和抓取文件。是对一些从其他页面不怎么链接得到的页面尤其有用,更详细的信息可以查阅Wikipedia上的说明

Google是支持sitemap的,Google帮助中的How do I create a Sitemap file?一文列举了一些生成sitemap的方式和工具,我采取的是第一种——sitemap protocol方式,详细说明在这里,英文好的朋友可以直接去啃,不用看我在下面罗嗦了。

第一步,准备工作

由于Google Sitemap Generator是使用python语言编写的,所以需要python 2.2以上的版本支持,其余的要求如要有文件的访问权等等不再详述。由于我的操作系统是Ubuntu,所以python支持也没问题。

http://www.sourceforge.net/project/showfiles.php?group_id=137793&package_id=153422下载Google Sitemap Generator的程序文件,在本机建一个目录把它解压缩。

第二步,创建配置文件

把刚才解压缩得到的example_config.xml文件另存为config.xml,并编辑之:

<site base_url=”http://www.example.com/” store_into=”/var/www/docroot/sitemap.xml.gz” verbose=”1″ >

其中base_url是网站地址,store_into是sitemap文件的地址,最好使用绝对路径,于是上面的内容修改为:

<site base_url=”http://www.fwolf.com/” store_into=”/home/fwolf/sitemap.xml.gz” verbose=”1″ >

接下来修改** MODIFY or DELETE **开头的sitemap生成方式定义部分,要删除掉不打算使用的生成方式,按照xml语法标签来分,生成方式有以下几种:

  • url,网页地址,附加定义为最后修改时间,更新周期,优先级,个人认为这种方式比较麻烦。
  • urllist,通过一个包含网页地址列表的文件,可以定义文件优先级,个人认为这种方式还不如直接使用urllist文件省事。
  • directory,文件地址,附加定义为文件、对应网址、默认索引页,个人认为这种方式比较适合我们,因为在本机一般都会有一套比较完整的网站文件,用他们来生成sitemap再合适不过了。
  • accesslog,网站日志文件,有必要么?
  • sitemap,sitemap节点文件,主要用于把多个分散的sitemap文件集合起来。

在这里我们删除掉其他的方式,只保留directory方式,并对其进行修改,结果如下:

<directory path=”/home/fwolf/website” url=”http://www.fwolf.com/” default_file=”index.html” /> <directory path=”/home/fwolf/website/wordpress” url=”http://www.fwolf.com/blog” default_file=”index.php” /> <directory path=”/home/fwolf/website/bnt” url=”http://www.fwolf.com/bnt” default_file=”index.php” /> <directory path=”/home/fwolf/website/dokuwiki” url=”http://www.fwolf.com/dokuwiki” default_file=”index.php” />

注意一般简单的网站只要有一个directory就可以了,但也可以有多个directory段,仅当你的网站是用子目录来划分栏目,也就是对应到本机不一定放在一个目录下调试的情况下才建议使用。可以用default_file来定义首页文件。

接下来修改FILTERS段,索引文件过滤部分。过滤规则是自上而下匹配的,匹配动作action有两种drop和pass,drop明确不索引文件,pass则是索引文件(但也有可能被后面的规则排除),匹配规则type可以是wildcard或者regexp,wildcard是使用通配符*和?来匹配文件,regexp自然就是正则表达式了。注意默认的匹配动作是drop不索引文件,所以要想简单的索引所有文件,这一段留空就可以了。

<filter action=”drop” type=”wildcard” pattern=”*/cert/*” />

这里我只简单的屏蔽掉信息产业部备案文件保存的那个目录,注意pattern是要和完整的网址进行匹配,略微不同于apache conf文件中的rewrite规则写法。

第三步,运行Google Sitemap Generator

很简单,./sitemap_gen.py –config=config.xml 就可以了,生成的sitemap文件会保存在刚才定义的store_into目录中,要想解压缩查看的话,用gunzip -d sitemap.xml.gz解开就可以了。一定要仔细查看这个sitemap文件,并根据它的内容,再去修改config.xml,反复直到满意为止。

最后,登录Google Webmaster Tools提交你的sitemap文件即可。

Google Sitemap Generator生成的sitemap文件中还是存在很多不必要的文件的,比如dokuwiki和wordpress的源文件、说明文档有上千个,手工和用FILTERS来去除我觉得都不是很方便, 所以再介绍一种更简单的添加sitemap的方式,就是纯文本文件,例如:

http://www.fwolf.com/ http://www.fwolf.com/blog/ http://www.fwolf.com/bnt/ http://www.fwolf.com/dokuwiki/

上述内容保存为sitemap.txt,然后上传到网站根目录,就可以到Google Webmaster Tools里面提交了,使用地址http://www.fwolf.com/sitemap.txt,注意每行一个网址,不能有其他任何内容,最好放在网站的根目录下。相对于使用Google Sitemap Generator生成sitemap.xml来说,我觉得这种纯文本文件的方式更简单、实用,包含的内容也更容易控制,应该更适合小型网站使用。

Update @ 2008-07-10

推荐一个不错的WordPress插件,用来管理和生成Sitemap:Google (XML) Sitemaps Generator for WordPress,我现在也在用它。

更改 WordPress 自动生成摘要的方式

WordPress 在搜索或列 Archives(按时间、按分类)的时候,在列表中是显示帖子摘要的。原来我觉得这样不好,就把列表中显示摘要改成了在列表中显示全部帖子,使用一段时间以后发现很不好。

首先列表会变得很臃肿,失去了列表的本身作用——方便用户寻找真正想要看的帖子,其次,在搜索引擎抓取页面的时候,把那些列表页面也抓了过去,但随着帖子的不断增多,列表的更新远快于搜索引擎缓存的更新,用户使用搜索引擎进来以后,在列表中就很难找到目标了。

这样在列表中只显示摘要的优势就体现出来了,首先页面很清爽,用户可以清楚的找到要查看的目标,然后搜索引擎抓取内容的时候,会更多的关注页面的 Permalink,用户也就会通过搜索直达目标帖子,方便了用户。

打开 WordPress 的wp-includes\functions-formatting.php,找到其中的 function wp_trim_excerpt(about line 741),将如下代码

		$excerpt_length = 55;
		$words = explode(' ', $text, $excerpt_length + 1);
		if (count($words) > $excerpt_length) {
			array_pop($words);
			array_push($words, '[...]');
			$text = implode(' ', $words);
		}

更改为

		$excerpt_length = 3;
		$words = explode("\n", $text, $excerpt_length + 1);
		if (count($words) > $excerpt_length) {
			array_pop($words);
			array_push($words, '<p />......<a href="' . get_permalink($post->ID) . '">[阅读全文]</a>');
			$text = implode("\n", $words);
		}

就可以了,WordPress 默认的生成摘要是用空格来判断的,就是取到55个空格结束,这适用于西方采用空格作为词间隔的语言,但中文是不分词的,所以我使用读取3行的方式,取前3行,对哪种语言都是适用的。

Update @ 2007-02-09

升级到 WordPress 2.1以后,这个修改的地点变为wp-includes/formatting.php,第780行左右。

Update @ 2007-02-26

编写了一个插件,不用再手工修改代码了。

Update @ 2009-08-25

Betty全面总结了几种中文摘要方式,形成了一个综合的适合中文的摘要插件,并且提交到了WordPress 官网,带有简单的配置后台,很不错。