'WordPress插件' 分类的存档

Viper's Plugins Used——显示Blog所使用的WordPress插件

Viper's Plugins UsedViper's Plugins Used,显示Blog所使用的WordPress插件的列表。

呼,接触这个插件一个多月了,今天终于花了点时间研究了一下这个插件。插件看起来不算复杂,只是在一个页面显示插件的列表而已。不过作者把插件设计成需要制作页面模版才能使用,所以弄起来有些麻烦。

Viper's Plugins Used最新版本是1.12,发布于2005年9月15日。插件的示例页面在这里。下载ZIP压缩包得到两个文件,一个readme.txt说明文件,一个程序主文件。把程序主文件上传到plugin目录,激活插件,然后打开readme.txt文件,照着里面的说明写页面模版吧。

继续阅读《Viper's Plugins Used——显示Blog所使用的WordPress插件》

CoolPlayer——媒体播放插件

为了把一首wma放到Blog上,我安装了CoolPlayerCoolPlayer这个插件。

这真是个功能强大的插件,它支持Flash、QuickTime、Real Media、Windows Media等各种媒体文件,还支持YouTube和Google Video的视频,还有图片文件和pdf文件,对于不支持的文件比如ZIP文件,插件会直接给出链接提供下载。对于媒体文件,插件也会在播放界面的下方给出下载链接,方便感兴趣的访问者直接下载该文件。插件支持同时指定多个文件。插件的特色是对各种浏览器都支持的非常好,比如IE、Firefox、Opera。当然,这个庞大的功能自然会使用js文件。唉,我的Blog页面上载入的js文件又增多了。

继续阅读《CoolPlayer——媒体播放插件》

WordPress 2.0.4中WordPress Database Backup插件的定时备份功能失效

8月6号下午4点,super37告诉我,自从更新到WordPress 2.0.4以后一直没有收到定时备份的邮件了。我到邮箱里看了一下,确实是升级之后就没有再收到了。

比较了一下,WordPress 2.0.4中,WP自带的WordPress Database Backup插件修改了3处。WP-cron插件没有动,仍然是1.4版本(插件里写成1.3版了,所以在插件页面会显示成1.3版)。看了一下,第三处最可疑,wpdbBackup_init()函数里添加了一条if ( !current_user_can('import') ) return;这个函数写着init,自然是初始化用的咯。只要检测到当前用户不能执行import操作,就立即return,不执行下面的建立wpdbBackup类的对象的操作,等于是把整个插件屏蔽了。而WP-cron的原理是每次有人访问Blog的时候检测一下有没有到了时间又还没执行的任务,有则立刻执行。wp-db-backup插件修改以后,只要每天夜里12点以后,第一个访问的不是管理员,那么自动备份就不能进行。

不知道WordPress开发组加这一句干嘛,难道是被WordPress 2.0.3的import bug吓怕了,所以到处加是否可以import的检测?数据库备份插件检查import导入权限干嘛呢,奇怪。没办法,先把这行注释掉,等着看今晚12点能否正常备份。在WordPress Trac报了个bug:Scheduled Backup in wp-db-backup plugin doesn't work,看能否有回应。

Update:在Gmail里收到备份了,时间2006-8-8 12:00am,还蛮准的 :)

Audio Player——在文章中使用Flash播放MP3文件

今天看到胡里胡涂发布了AudioPlayer汉化版AudioPlayer汉化版。这个插件很不错,简洁,不花哨。

胡里胡涂说这个插件有一点问题,有些MP3文件的tag信息显示不正常,即使反编译了Flash文件也没法解决。我看了一下那个MP3文件,tag里用的BIG5编码。我给转成GBK编码,上传测试,无效;把tag格式由ID3v1换成ID3v2,无效;使用UTF-16编码的ID3v2,无效;转成APEv2格式的tag,程序不支持,汗了。最后把一个地方修改了一下,可以正常显示了。
mp3infp

无语,不选那个复选框就好了,只是这个Flash里默认的字体太小,大概只有10px吧,中文显示看不清,起码要12px才可以。不管了,反正以后有显示不正常的,就把tag转成UTF-16的ID3v2格式,并取消选择Unsync就是了。用mp3infpmp3infp修改起tag来非常方便,不是吗?

试试看效果如何:

Update:今天仔细研究了一下这个插件。这确实是个好插件,当然也有些小瑕疵。

Audio Player主页下载插件后,解压得到audio-player.php文件和audio-player目录,将这两者上传至WordPress的plugins目录,到插件页面激活。这时插件已经可以使用了,在文章里写入[ audio:http://yskin.net/wp-content/uploads/audio/曾宝仪-专注.mp3],发布出来就可以看到效果了。

下面说一下Audio Player选项页里各个选项。好像汉化者翻译的不怎么样,估计他最终也没有弄明白"enclosures"是什么意思,如果把写版权声明和责任说明的时间多花点在汉化上也许会更好些,嘿嘿。 /023

  • 第一项是MP3文件默认存放的路径,插件推荐是/audio,而我设置成/wp-content/uploads/audio。这个很好理解,如果你写了这样的代码:[ audio:曾宝仪-专注.mp3],只有文件名而没有完整的路径,那么插件会到这个默认目录中去查找这个文件。
  • 第二项是插件的使用方式。三个选项分别是使用[audio]标签、当发布podcasting时添加一个enclosures自定义域、替换文章内所有链接到MP3文件的链接。一般使用第一种即可。
  • 第三项是在站内所有的播放器播放时在前后分别插入一段音频。这个也只对podcasting有用吧。
  • 第四项是在feed中的显示选项。你可以选择在feed中音频的显示方式。你可以选择显示MP3文件的下载链接,或者什么都不显示,或者一段提示,请浏览者到文章页面来听这段音频。我觉得在feed中直接显示播放器也应该是可以的,可是这个插件就是这么设计的。
  • 第五项是调整播放器显示界面各部分的颜色。下面有一幅图片详细说明每个选项具体对应的位置,你在调整各个部位的颜色的同时可以立刻在下面看到显示效果,真是非常的方便。这些设置都是作为播放器的默认值,你也可以直接在调用播放器的代码里设置各部分颜色,它们将只用于此次调用,并覆盖掉默认设置。

[audio]标签的使用方法有多种,你可以直接使用[ audio:http://yskin.net/wp-content/uploads/audio/曾宝仪-专注.mp3]这样的完整链接形式,也可以使用[ audio:曾宝仪-专注.mp3]这样的简短形式,插件会在默认目录下查找文件。你还可以放置多个MP3文件,只需要用逗号把他们分隔起来,比如[ audio:a.mp3,b.mp3]。不过,这个插件没有前一首,后一首的按钮,也没有播放列表,所以播放多首歌曲时不是很方便。没办法,它是个轻量级的播放器嘛。你还可以在调用播放器的时候加上参数,在选项页允许设置的各部位颜色这里也同样可以设置,具体可以参照软件主页中的Runtime options部分。还有两个额外的参数:autostart和loop,看名字就知道,前一个是自动播放,后一个是循环播放。这两项默认值都是no,使用时只要把他们设成yes就可以了:[ audio:a.mp3|autostart=yes|loop=yes]。需要提醒一句的是,音频文件的自动播放有时会令人反感。

另外,在文章以外其实也可以使用播放器,只要把代码写入一篇文章,发布后得到生成的HTML代码,再复制到模版里就可以了。播放的MP3文件的URL也可以在这段HTML代码里找到,如果听到别人的Blog中播放的音乐不错的话也可以用这个方法来找到MP3文件的URL然后下载。URL在"soundFile"字样后面,不过被HTML实体化了,可以用UEStudio解一下码。

Update2:今天胡里胡涂又说要研究研究,我也就跟着再研究一下。Flash这个东西我不熟,是胡里胡涂帮忙把swf反编译成fla的。也许是反编译器不太好,胡里胡涂说反编译后再编译成swf就不能工作了,我也就只能大概看看fla文件。Flash里有个ActionScript,也就是个类似于Javascript的脚本语言。没有Flash软件,直接用UEStudio打开fla文件看里面的脚本,凭着以前C语言的基础,勉强能看懂一点。(这说明了C语言是多么的重要,学会了C,再学一点C++里类的知识,那么JavaScript、PHP什么的全都可以迎刃而解。C语言真是祖宗级的语言啊。)感觉上ActionScript就是借用了JavaScript的语言规范,很多地方都很象,比如定义类的函数,和C++区别很大。大概看了一下,读取ID3 tag直接用了这样的语句:

emff.id3Tags[_l1.index].data[0] = _l1.id3.artist;
emff.id3Tags[_l1.index].data[1] = _l1.id3.songname;

去网上查了一下,Macromedia网站的文档里说这是Flash提供的功能。Flash读取MP3文件时已经解析出ID3标签,并存在这些变量里。查了下这个"emff",指的是Easy musicplayer for FlashEasy musicplayer for Flash,Audio Player 1.0的更新记录里也提到了它是基于这个emff播放器的。

也就是说,读取ID3 tag是由Flash进行的,那么Audio Player对各种ID3标签的兼容性也就等于Flash对于各种ID3标签的兼容性。我对Flash不太了解,大概分析一下吧:fla文件里是ActionScript源代码,编译后形成swf文件,然后浏览器读取后交给Flash Player播放出来。我想兼容性应该取决于Flash Player,因为我觉得ActionScript是解释执行的。不过swf文件里也许会标记出自带的代码所使用ActionScript版本,这也会影响兼容性吧。上面提到的Macromedia网站的文档里说,Flash Player 6添加了对ID3v1的支持,Flash Player 7添加了对ID3v2的支持,包括2.3和2.4。《ActionScript 3.0 的 Sound类》一文中提到:“MP3声音文件可包含ID3标签,ID3标签提供文件的元数据。如果一个你使用Sound.load()方法加载的MP3文件包含了ID3标签,你可以查询这些属性。只有使用UTF-8编码的ID3标签能够被支持。Flash Player 9以及后续版本支持ID3 2.0标签,特别是2.3和2.4。”后面一句自然不可能,怎么会从Flash Player 9才开始支持呢。“只支持UTF-8编码的ID3标签”也是不正确的,ID3v1里没有确定编码方式,而ID3v2里只有2.4可以写入UTF-8,之前的版本只能用UTF-16。

那么,很明显,Flash读取ID3标签时,只支持ISO 8859-1UTF-16编码格式(对于ID3v2.4标签多支持个UTF-8)。这也体现在mp3infp软件里,ID3v2里只能选择这两种编码,ID3v1里则没得选择。ID3在最初设计时,就只考虑了英语和一些欧洲国家的语言,于是用了ISO 8859-1编码方式。一般的软件比如foobar2000和Winamp迫于现在tag的混乱状态,解码tag时都是按照本地编码方式解码的,比如GBK。这也是没办法,ID3v1设计时就没有考虑到兼容性,弄的亚洲国家只好拿本地编码往里写,比如GB2312、GBK、BIG5。ID3v1标签部分又不象HTML文档那样允许在HTTP头或者HTML文档开头声明编码方式,于是造成了很大的混乱,每个地方的播放器都优先使用本地的编码方式解码,写入tag时也是以本地编码写入,这样出来的MP3文件拿到别的语言的播放器上就不能正常显示tag。Flash比较遵守ID3标准,在ID3v2的说明文档的ID3v2 frame overview一节里也提到,tag的编码要么是ISO 8859-1编码方式,要么是16-bit unicode 2.0,也就是UTF-16,而且必须加BOM,以便区别于ISO 8859-1。所以,Flash读取ID3标签时,如果是ID3v1,就直接使用ISO 8859-1方式解码,于是所有第一个字位为0的字节被认为是ASCII码,为1的被认为是西欧字符,不会象Winamp和foobar2000那样用本地编码比如GBK解码。如果是ID3v2,并且编码方式是ISO 8859-1的,和前面的ID3v1一样。乱码就是这么出来地。如果是UTF-16或者ID3v2.4的UTF-8,则可以正常解码,不会产生乱码。

关于"Unsync",在mp3infp作者的网站上的这篇文章有一段介绍,不过是日文的。在这个页面也有一段介绍,把Unsync翻译成“非同期化”,不过也是日文的。用Google翻译翻成英文,再扛上糍粑看了半天,看的晕晕乎乎的。最后在ID3官方网站看到了ID3 tag version 2.3.0:5.The 'unsynchronisation scheme'。Unsync具体的行为里面讲的很清楚,不过这一段开头就讲到:"The only purpose of the 'unsynchronisation scheme' is to make the ID3v2 tag as compatible as possible with existing software. There is no use in 'unsynchronising' tags if the file is only to be processed by new software. Unsynchronisation may only be made with MPEG 2 layer I, II and III and MPEG 2.5 files."也就是说只是为了满足一些老软件的特殊需求,如果你用的播放器都是比较新的软件则无须使用这个功能,而且这个功能也只能用于MPEG 2和MPEG 2.5的文件。

呃,稍微解释一下,所谓MP3文件,指的是MPEG 1 layer Ⅲ, MPEG 2 layer Ⅲ, MPEG 2.5 layer Ⅲ这三种文件,而一般我们接触到的扩展名为MP3的文件,90%是MPEG 1 layer Ⅲ格式,其余的则是另两种MP3格式,还有一些是MP2格式的。所以这个功能大多数MP3文件上都不能用,遇到的MP3文件都把这个功能关闭就可以了。

所以,上传到Blog上用Audio Player插件播放的MP3,如果是英文的则无所谓,只要注意一下ID3读取的顺序,如果同时有ID3v1和ID3v2两个tag,则ID3v2优先读取。如果是中文的,则需要把正确的信息写入ID3v2 tag里,并把编码方式选为UTF-16或者ID3v2.4的UTF-8,并取消选择Unsync。至于在本机收藏的MP3文件嘛,我从两三年前接触了foobar2000以来,就一直让收藏的MP3文件只留一个APEv2 tag,这样就非常方便,尤其是更新tag的时候。另外还要提到一点,ID3v1和APEv2标签都是保存在文件尾部的,ID3v2标签则是直到v2.3都是保存在文件头的,V2.4则可以选择保存在文件头或文件尾。ID3v2这样的保存方式造成一个问题,就是更新tag的时候,软件必须修改文件头,所以整个文件都要被读出来,修改后重新写回硬盘,造成更新tag速度很慢。而ID3v1和APEv2标签,由于在文件尾,所以更新时只要修改文件存放的最后几个扇区就可以了。再加上ID3v1标签能存放的信息很少,比如吴宗宪的“是不是这样的夜晚你才会这样的想起我”这首歌,由于ID3v1的歌名部分只能存放30个字节,而这首歌的歌名有17个字,用GBK编码存入需要34个字节,ID3v1存不下。而且APEv2标签很简练,存放的数据不是非常多的情况下,占用的空间比ID3v2少。综合起来,APEV2标签是最好的选择。

不过现在的情况下,当tag为中文时,由于Flash不支持APEv2标签,所以ID3v2是唯一的选择。而且在网络上,由于ID3v2标签在文件头,所以浏览者会很快看到歌曲名和歌手名出现在播放器界面上,不会象ID3v1标签那样,一定要整首歌曲缓冲完毕才能看到歌曲名。所以用在播放器的MP3文件我们还是尽量用ID3v2的标签吧。

另外提一下,很多人有MP3硬件播放器,也就是随身带着的那个可以听歌的小东西。那玩意也分好坏,有些比较古老的经常要求标签必须是ID3v1,因为它的解码芯片只能识别ID3v1,支持不了比较新的比如ID3v2.4格式,更别说UTF-16编码和APEv2标签了。歌词也大多只能支持lyric歌词文件,不支持tag内嵌的歌词。所以用那玩意的时候,尽量用些早期的格式比如ID3v1,免得它不认得。

好了,我所了解的都说完了,要想解决这个问题,要么刚收购了Macromedia的Adobe更新Flash Player,增加解码方式的判断,提高兼容性,虽然这样就离标准更远了,不过现在大家都是这样,大势所趋,没办法啊。要么自己注意点,尽量用ID3v2的UTF-16和UTF-8格式。字体大小的问题嘛,还是让作者解决吧。

Update3:最近好像有很多人问到Audio Player为啥不支持WMA。首先,WMA格式是小一些,在低码率的情况下,WMA格式音质无疑比MP3要好,所以WMA很适合低码率环境。以前研究foobar2000时,有一点很多人不明白,就是码率一样的情况下,文件大小基本一样。因为码率的定义就是每秒音频占用的字位数,比如128 Kbps码率的音频文件(无论是MP3还是WMA或者APE),指的是每一秒钟的声音要占用128K个bit,也就是16K字节的空间。所以,码率一样的情况下,无论哪种音频文件大小都差不多,差别只在于tag等数据,顶多差几K。

而Audio Player不支持WMA,在插件主页写的很清楚:"This plugin only plays MP3 files. This is a limitation of the Adobe Flash Player."这是受Flash播放器所限,没办法的。或许这说明Adobe和Microsoft关系不好?呵呵。所以,如果想在Blog里播放WMA文件,还是用CoolPlayerCoolPlayer吧。

Spam Karma 2——反垃圾评论插件

看了aHfUi留言,安装了Spam Karma 2。

这个反垃圾评论插件好复杂,研究了2个多小时,终于有点眉目,过来写一下感受。

Spam Karma 2Spam Karma 2,反垃圾评论插件,通过一些方法计算一条评论的karma值来判定他是否是一条垃圾评论。

继续阅读《Spam Karma 2——反垃圾评论插件》

Quotmarks Replacer

Quotmarks ReplacerQuotmarks Replacer,用于修正Wordpress自动将半角符号转换为全角符号的问题。

Wordpress自动转换符号的问题从1.5的时代就有了(我没经历过1.5时代,看这里说的),Blog标题那儿实在太难看,我当时是直接改了模板,把标题文字直接写到了模板里,这样起码标题好看些,不过文章里还是没办法。现在有这个插件,不用再那么麻烦了,只要简单的安装,激活就可以了 :)

这个软件是必须的,装完Wordpress就该立刻把这个插件装上。插件作者说好像没有几个人用,这恐怕是因为宣传的不好呀。这种必须安装的插件,应该让每一个使用Wordpress的使用汉语的人都来使用。

Update:今天发现这个插件还有个遗漏的地方,文章页面的title部分没有处理,应该在插件的尾部加上这一条:

add_filter ('single_post_title','qmr_filter');

去插件主页报了bug,等作者修复吧。

Update2:Sparanoid已经更新了,hoho。

WordPress FeedBurner Plugin

WordPress FeedBurner PluginWordPress FeedBurner Plugin,用于把现有的feed地址指向FeedBurner上地址。

参考了桑林志《WordPress FeedBurner 插件》安装了这个插件。安装很简单,把插件上传激活后,在选项页面按照插件的提示,把FeedBurner的烧录地址指向随机生成的feed地址,然后将FeedBurner的新地址填上点更新即可。

用上这个插件以后,当有人查看你的feed的时候会自动跳转到你在FeedBurner上烧录的地址,这样省了很多事,不用再去修改模板里的feed地址,也不再怕有人不用FeedBurner上的地址订阅而导致的订阅人数统计不准。另外,也可以参考这篇文章,将一个域名指向烧录过的地址,以便在FeedBurner无法访问的时候修改烧录地址而不影响订阅者的订阅。

Update:今天去Google Sitemaps里看了下,发现有很多错误提示。我让Google Sitemaps订阅了我的feed和sitemap.xml文件,现在feed指向了FeedBurner,而FeedBurner为了统计每篇文章点击次数而把页面地址设置成类似http://feeds.feedburner.com/yskin?m=197这样。因为页面地址不在本站,所以Google Sitemaps报错。没办法,只好取消feed的订阅,不过,sitemap.xml文件是由插件在有文章被添加或修改的时候即时更新的,只订阅他也就够了不是么,呵呵。

Update2:设置好后可以到feedburner里的feed设置页面,点击Optimize->Browser Friendly,再点"Use your redirected feed URL in BrowserFriendly",把自己的feed地址(http://yskin.net/feed/)填到下面的"Redirected Feed URL"框中,feedburner就会记住这个地址。当需要生成订阅地址的时候,比如用浏览器直接打开feed页面时,右上方显示的可以直接点击以订阅到bloglines等的图标就会用这个地址来生成。总之,既然设置了重定向,就要让订阅者尽量用原来的feed地址订阅。一旦feedburner出现问题时(比如被GFW了),可以立刻取消或更改重定向,以保证订阅者可以及时得到更新;而当feedburner还可以正常访问的时候,就可以享受烧录feed、给feed里的每项增加显示当前评论数的小图片、以及由feedburner网站承担feed的流量等功能。

Ultimate Tag Warrior——为WP增加TAG支持的插件

Ultimate Tag WarriorUltimate Tag Warrior,很有名的为Wordpress提供TAG支持的插件。今天终于照着天佑《Ultimate Tag Warrior 教学》把他安装上了。我用的K2模板和Extended Live Archive插件都支持Ultimate Tag Warrior,只要简单的激活UTW就可以用了。

照着天佑的说明和UTW的help文件添加了An inline tag-adder,这样就可以直接在阅读文章的时候为其添加Tag了(当然,你需要以管理员身份登陆)。天佑的说明是针对Wordpress的默认模板的,我的K2模板需要一点小修改。

把K2模板原来的:

<span class="tagdata">Tags: <?php UTW_ShowTagsForCurrentPost("commalist") ?>.</span>

修改为:

<span class="tagdata">Tags: <span id="tags-<?php the_ID(); ?>"><?php UTW_ShowTagsForCurrentPost("commalist") ?></span>.<?php UTW_AddTagToCurrentPost("commalist") ?></span>

把显示的TAG用span框起来,添加一个id属性,这是为了在添加了Tag之后由Javascript脚本找到这个地方并更新Tags的显示。UTW_AddTagToCurrentPost函数可以在检测到以管理员身份登陆后,在该位置显示添加Tag的小输入框,我直接添加在显示Tag的函数的后面:

然后在sidebar添加显示相关文章的功能,方法参考了天佑的文章和另外一篇《用UTW插件实现相关帖的显示》,我直接copy了K2为支持related_posts所写的代码,改了一下:

<?php if ((function_exists('UTW_ShowRelatedPostsForCurrentPost')) && is_single() && ($notfound != '1')) { ?>
<div class="sb-delicious"><h2>Related Entries</h2>
<ul>
<?php UTW_ShowRelatedPostsForCurrentPost("posthtmllist", '', 5); ?>
</ul>
</div>
<?php } ?>

Extended Live Archive

Extended Live ArchiveExtended Live Archive是使用AJAX技术,以时间表、文章分类以及Tag(需要Ultimate Tag Warrior插件支持)分类搜寻文章的Wordpress插件,去我的Archives页看一下效果就知道了。

有两篇Extended Live Archive教学文章:《详解 Extended Live Archive Plugin 的安装》《Extended Live Archive 0.10 版本教学》,可以参考一下。

我用的K2模板提供了对ELA的支持,只要装上插件,在K2里激活Archive页面就可以了,不过效果和按照两篇介绍文章里的不一样,估计是用了K2自带的CSS。刚开始很困惑,以为自己设置错了,后来发现其他用K2模板的Blog也和我一样,比如这里,就连《ELA 0.10版本教学》那篇文章的Blog的Archive页面都是这样的。但是,我发现这个页面显示出来的效果和教学里的一样,就去研究了一下他的代码。

也许他是没用K2内置的调用方法吧,我先用着K2内置的,以后有空再改改他。

Admin Drop Down Menu——使WP后台操作更方便

Admin Drop Down MenuAdmin Drop Down Menu(Replaces admin menu and submenu with a 2 level horizontal CSS dropdown menu bar. Saves lots of clicks !)是一个调整后台管理界面上方菜单的插件。激活这个插件后,当你在管理后台里将鼠标移动到上方的菜单项上的时候,子菜单就会即时显示出来。这样可以减少点击次数,想写新文章再也不用点两次了。就像插件说明所说的那样:Saves lots of clicks!

作者做了一个效果预览页面,可以先去看看效果。

Update:这个插件用了那么久(快半年了),终于开始出了问题。作者的网站也打不开,唉,只好自己修改。

这几天写了新插件,导致选项下面的子菜单太多,占了两行。导致显示出现问题。看了一下插件里的CSS,做了一些修改。未启用WP Tiger AdministrationWP Tiger Administration插件时,定义界面的CSS在wp_ozh_adminmenu_css()函数里。后面一些* html开头的是为IE准备的CSS,我就不管啦,只改了下面几个地方:

$id li ul li {
padding: 1px;
}
$id li ul li a,$id li ul li a:link,$id li ul li a:visited {
color: #ddeaf4;
}
$id li ul li a.current {
color: black;
}
/* Nested ULs */
$id li ul {
left:-2000px;
}

问题基本解决了,还有个小问题,在选项页子菜单显示两行的状态下,移动到其他菜单显示的子菜单由于只有一行,挡不住选项页的第二行子菜单。这个好像没办法了,除非用JavaScript。