December 4, 2007
上一篇日志:Wordpress插件DIY:几个原则。
这篇日志我和大家来讨论讨论写插件的第一个原则 —— 插件的易用性。 我把这个原则定为写插件最重要的, 因为人总是有偷懒精神的, 而且人也不可能都是高能力的, 况且就算是高能力, 也不一定是在修改代码方面的, 所以插件的易用性就太重要了, 我以前用别人的插件, 最后被迫我不能更换模板, 换一次模板我差不多需要开三个晚上的夜班才能完整的搞定所有的问题, 麻烦程度可想而知。
要使得插件易用性好, 大概有如下几种方法:
1、 使用Wordpress自己的API;
2、 使用javascript;
3、 主动分析内容、 分析文件;
4、 使用php技巧;
5、 目前还没有想到, 保留想到并添加的权利。
这篇文章我们就来讲讲使用wordpress API带来的易用性, 以及合理使用 wordpress API 的必要性。
*******************************************
1、 使用wordpress的API。
wordpress在开发的过程中提供了很多的API供插件开发者使用, 正是由于这些API, 可以使得我们可以用插件来丰富wordpress的功能; 同样的, 也正可以用这些插件, 我们这些插件的编写者可以使得插件写的更加简单易用, 给使用插件的上帝们更好的体验性。
Wordpress的API大致分为两块(具体的你可以看这里:http://codex.wordpress.org/Plugin_API, 还可以查看这里:http://wphooks.flatearth.org/), 一块是action, 官方是这样解释的:
Actions: Actions are the hooks that the WordPress core launches at specific points during execution, or when specific events occur. Your plugin can specify that one or more of its PHP functions are executed at these points, using the Action API.(我的理解就是action就是新开一个线程, 让你的插件和Wordpress的内容同时运行起来, 各不相干。)
wordpress支持的action都在这里:http://codex.wordpress.org/Plugin_API/Action_Reference
另一块是filter, 官方的解释如下:
Filters: Filters are the hooks that WordPress launches to modify text of various types before adding it to the database or sending it to the browser screen. Your plugin can specify that one or more of its PHP functions is executed to modify specific types of text at these times, using the Filter API.(我的理解是在执行wordpress的内容之前加入一个过滤器, 你的插件就可以处理内容然后将处理后的内容扔给wordpress继续处理)
wordpress支持的filter都在这里:http://codex.wordpress.org/Plugin_API/Filter_Reference
这两种类型的wordpress API我们都是可以直接使用, 而且也应该是灵活使用的, 但我个人的感觉是wordpress关于API的使用文档不够详细, 很多时候我就只能一个个的去试API, 从而找到自己所需要的。
对于如何使用API,“我爱水煮鱼”写的《 自己动手写 WordPress 插件:使用 API 》已经介绍的很详细了, 我这里就不再介绍, 我下面结合我的wp thread comment举个例子来说明一下使用API的优越性。
我在wordpress thread comment中使用了如下的API:
add_action(’comment_post’, array(&$this,’btc_add_reply_id’));
add_action(’comment_form’, array(&$this,’btc_add_reply_id_formfield’), 1);add_action(’wp_head’, array(&$this,’wp_thread_comment_header’));
add_filter(’comment_text’, array(&$this,’wp_thread_comment_addchildcomment’), 2000);
add_filter(’comments_array’, array(&$this,’wp_thread_comment_changecomment’),10,2);
在 wordpress thread comment 中需要在发表评论的form增加一个parent id的数据域, 我在这里使用add_action(’comment_form’, array(&$this,’btc_add_reply_id_formfield’), 1); 将这个parent id的数据域加入到网页中的发表评论的form中, 这样就可以免去用户自己去修改自己的主题, 在comments.php自己添加这行代码, 减轻了用户使用该插件的难度。
我迸发写这个插件的想法是当时有这个评论回复的需求, 那时候市场上大概就只有Brian’s Threaded Comments这么一个评论回复型的插件, 可我在试用之后, 发现这个插件因为用它自己的评论模板替换了主题中的评论模板, 与主题可能不匹配, 而修改起来的难度却不小, 最后我就只能自己摸索着写一个插件, 这也是我第一个写的插件, 最后形成了 wordpress thread comment, 这个插件中有部分代码就是参考和使用了Brian’s Threaded Comments的代码, 再一次向Brian表示感谢。
其实当我真的开始着手写这个插件的时候, 还是觉得很难, 难点有这样几个:
1、 怎么利用 wordpress 的 API 将父评论和子评论分离开来? 因为在comments.php的comments的foreach中只能存在父评论, 否则就无法实现我最初的目标了, 最后我找遍了API找到了这个comments_array(), 具体的作用请浏览wordpress的插件开发文档中关于这个api的描述吧。
2、 怎么在父评论中嵌入子评论呢? 这个API倒是比较简单, 有comment_text, 但使用的结果发现跟wp ajax edit comments 有冲突, wp ajax edit comments 无法正常的在每个评论中显示, 最后没有办法, 我只能选择了get_comment_text这个API, 但这个API也是无法跟wp ajax edit comments 共存的, 所以最初的版本都没有解决这个问题, 最后我用上了我所说的技巧四, php的技巧才搞定了这个问题, 所以在下面的过程中我还会提及这个问题的解决。
3、 在回复评论的过程中要用到javascript, 而在javascript中要用到一个叫document.getElementById的东西, 怎么知道form的id呢? 每个主题模板都可能不一样; 刚开始的时候, 我采用让使用插件的朋友自己填写, 可还是有部分朋友不会用, 倒不是不会自己填, 而是根本就找不到form id的值, 也不知道该到哪里找, 后来我经过分析wordpress的源代码, 发现这个form id其实还是有固定的格式的, 我就在我的插件中采取分析这些固定的内容来提取这个form id, 这样可以再次降低使用这个插件的难度, 使得插件更加容易被普通用户所接受, 这个就是我说的技巧三了, 我也会在下面详细解说。
通过这些API, 我最后将需要大改主题模板的插件弄成了一般不再需要修改主题模板而可以直接使用, 对各种模板都有良好兼容性的插件, 也达到了我自己偷懒的目的; 如果朋友们愿意深究, 看看wp thread comment 的源码。
最后, 我要提及的一点是, 要想快速提高自己编写插件的能力, 最简单的还是多看别人写的插件的源代码, 可以快速的了解wordpress的API和插件编写的方法, 我自己就是这么成长起来的, 说的难听点有点偷师学艺的味道, 呵呵。
您喜欢本文吗?即刻订阅"偶爱偶家",精彩文章不再错过!现在就给我们留个话吗?



3 responses to "Wordpress插件DIY:使用API提高插件易用性"
技巧不错,但是还有一个效率的问题得考虑,看着很多插件使劲的add_filter和大把大把的js载入,我就为将要用这个插件的人担心阿
cosbeta, 鱼和熊掌不可兼得的问题没有办法, 易用性的结果就是牺牲了效率, 但我感觉关键的效率倒不在程序的执行上, 而是在wp的hook机制如何, 如果hook机制弄得好, 应该不会很影响效率, 不过js如果太大, 的确很影响数据传输
[...] Wordpress插件DIY:使用API提高插件易用性 [...]