December 17, 2007
不好意思各位, 阿里妈妈的wordpress插件大赛总算是告一个段落了, 也不管是否能得奖, 我总是参与了, 过程是真实的(看《五星大酒店》看多了, 总喜欢用这个真实的字眼); 现在我归来了, 继续写的Wordpress插件DIY的教程。
上次我们讲了《 Wordpress插件DIY:使用API提高插件易用性 》, 本来这一次应该是讲运用javascript来提高插件的易用性, 后来我想想, 感觉这个API还有点东西可讲, 我要给大家讲讲我是怎么用API写出了我的第二个插件, 那可是我最得意的著作, 前无古人的啊(我就自恋一下, 再推一下插件吗; 你、 你、 你, 还有那位, 你们呕吐啥)。 我故意要讲这个插件, 就是因为这个插件全部运用了wordpress的API最终实现了在此之前大家用hack wordpress 原始代码的功能, 下面就切入正题。
关于这个插件的背景我就不介绍了, 不了解的朋友可以看这里 — “ wp插件:password register我的密码我做主 ”, 我写插件的灵感很多都来自于别的朋友, 这个插件的诞生就是因为“随便说说SBTalk”的需求, 在此之前, 没有相关的插件存在, 因此编写这个插件就有以下几个难点需要解决。
1、 如何在注册页面插入密码框?
2、 如何将注册页面的输入的密码在后台收到并最后写入到数据库?
3、 如何将wordpress原始的注册邮件变更为修改后的合适的邮件(这个功能在能够发送email的服务器上可以看出效果, 如果不进行修改, 就会看到发送到密码函件还是原始wordpress自己产生, 而不是你设定的, 虽然这个密码已经毫无用处了, 但始终不是很完美)
本着这三个问题我开始查找 wordpress 的 API 库, 经过仔细的查找和测试, 最后发现用一下这三个 API 可以解决我们上面面临的问题。
add_action(’register_form’
add_action(’register_post’
add_action(’user_register’
add_filter(’login_message’
先来说说这几个 API 的作用(详细的说明请自行参看 wordpress 的 API 开发文档), register_form 用来在注册页面插入密码输入框(当然你也可以插入别的内容), register_post 用来截获输入的密码, user_register 用来往数据库中写入刚才截获的密码(大家可能会问, 为什么不直接在register_post 的 action 中直接写入密码呢? 其实我也想这么做的, 可惜不行。 后面我会说明原因为什么还要累赘的增加这么一个 API), 最后一个login_message用来在注册页面提示消息, 比如说什么时候你输错了密码, 总要给你反馈个消息吧? 就靠这个东西了。
不知道大家有没有注意到我在罗列使用的 API 时, 在前面还加入了 HOOK 的类型, 这里其中有三个是 action , 还有一个是 filter, 为什么要把这个罗列在这里呢? 我在前面一篇文章中已经讲过 action 和 filter 的区别了, 这里故意提出来这些类型, 就是想让各位加深印象, 其实这个hook的类型很重要, 有时候我们最想要的是filter, 却偏偏只有 action, 这个时候就要采取其他的办法使得这个action可以达到filter的功能。
关于前面两个 register_form 和 register_post 我就不再细细说明了, 不是很明白的朋友可以在后面留言我们继续讨论, 也可以看看源码和 API 文档, 作用就是一个是截获注册页面的对话框的建立, 另一个是截获注册页面发送的信息, 从而找出注册者在输入框中输入的密码; 正是由于这两个 API , 才使得我们可以完全放弃 hack 使用 plugins 实现我们需要的功能, 从这上面来说, wordpress 的开发组真的考虑到很周到, 连这种 API 都给我们建立好了。
这里我们就要来结合 register_post 和 user_register 说说我为什么不利用 register_post 将密码写入注册表, 却偏偏还要另外找一个 user_register 来呢? 的确, 在 register_post中从理论上来说是已经有了机会将新的密码写入注册表, 但这个时间上还没有达到要求, 这个时候其实用户还没有建立, 用户没有建立又怎么可以把密码写入呢? 没办法, 这个时候的密码只能另外存起来另找时机, 这个另外的时机正好是 user_register, 这个 API 的发生时间是在wordpress建立用户之后, 这个时候我就可以将设立的密码写入数据库了。
其实我最初的想法是不想直接操作数据库的, 我觉得写插件应该避免直接操作数据库(涉及到数据库的操作尽量还是应该wordpress自己来做)。 但这里是没有办法了, 最后在user_register中直接操作了数据库, 抹掉了原来wordpress自己建立的密码而改成了用户自己创建的密码, 这就是为什么要增加 user_register 的 hook 的缘故, 就是因为register_post这个hook发生的时间不是我们要利用的时间。
最后一个是login_message 这个 hook, 这个 hook 其实刚开始令我很奇怪的, 因为是根据名称是 login_message, 我需要找的是一个在register的中可以显示信息(包括错误信息和成功信息)的 hook, 但结果在测试之后发现 login_message 才是对的, 这个 login_message 就是在 register 中才显示信息, 而在普通的 login 事件中没有发生(不知道wordpress开发组是怎么想的)。
就这样拼拼凑凑就凑出了这么一个 wordpress password register 的插件, 算是比较完美, 不用修改任何地方, 直接在后台启用就可以使用了, 易用性还算比较可以。
对不起, 且慢! 还有一个不足的地方, 这个插件启用后, 每次注册的邮件中发送的密码是错误的(其实那是wordpress自己创建的密码), 而不是用户刚才自己设定的密码, 虽然说这个发错了邮件倒不是啥重要的事情, 就是无伤大雅的事情, 不过小雅还是伤了, 或许还有可能用户自己密码忘了, 结果翻翻邮件还翻不到可能会比较生气, 怎么办呢? 难道还是需要修改wp的源代码不成!
还好, 这个问题wordpress的开发组也没有帮我们拉下解决办法, 这个就是自定义函数。 讲到这里我想起来了, 我上面一篇讲如何提高插件易用性的几个方法用, 漏写了一条, 这里补上。
5、 使用wordpress提供的自定义函数功能(wordpress 的pluggable.php 文件中的函数好像都是自己重新定义的, wordpress在加载的时候会优先加载你定义的函数而忽略他们原始的定义, 这个功能太赞了)
其他的几条方法请参见上一篇。
有了这个就好办了, wordpress在建立新用户后给新用户发送邮件的函数是这个 — wp_new_user_notification(), 你一搜索就可以看到这个函数正好位于 pluggable.php 文件中, 真乃天助我也, 自己重新定义这个函数, 将wordpress 自己新注册用户的邮件给屏蔽掉, 而来发送我们自己新设定的邮件, 这样就不ok了? 对, 就是这么办的, 因为你可以在我的插件中看到我也写了这个函数, 放心啦, 不会跟wordpress自己定义的冲突掉!
至此, wordpress password register 这个插件才算是真正比较完美了, 几乎没有任何瑕疵可以让你看出来这是一个插件, 看起来非常像一个wordpress自身就集成的功能。
好了, 关于提高插件的易用性之使用 wordpress API 的技巧就这样讲完了, 这里其实还提到了一个技巧, 就是用自定义函数覆盖wordpress原始函数, 使得功能更为强大。
下一次我就跟大家来讨论讨论 提高插件易用性中的第二个技巧, 就是利用javascript, 如果你有什么这方面的感受, 也不妨给我留言或者发邮件给我, 我非常高兴能和你一起讨论问题。
如果你对这篇文章有什么意见或者建议, 也不妨给我留个言, 我会认真阅读你的留言并进行回复; 您的参与, 我相信会让偶爱偶家蓬荜生辉。
您喜欢本文吗?即刻订阅"偶爱偶家",精彩文章不再错过!现在就给我们留个话吗?


9 responses to "Wordpress插件DIY:使用API提高插件易用性"
很技术的东西,看不大懂,不过还是占了沙发,楼下的坐板凳吧。
[Reply]
不错,勤劳的小蜜蜂,嗡嗡翁,呵呵
[Reply]
期待下一个专题讨论~
[Reply]
谢谢各位的支持, 其实我也就是三脚猫功夫, 希望不是在这里误人子弟了, 哈哈; 在cosbeta 和 icyleaf 面前整个就是班门弄斧了, 惭愧惭愧
[Reply]
终于又回来写教程啦··期待已久,看来每天都要来学习了··
[Reply]
[...] Wordpress插件DIY:使用API提高插件易用性Wordpress插件DIY:使用API提高插件易用性Wordpress插件DIY:几个原则WP PLUGINS:wp [...]
[...] Wordpress插件DIY:使用API提高插件易用性(续) [...]
继续跟踪学习中
[Reply]
http://www.6inchboot.com/
UGG boots;cheap UGG;UGG classic
[Reply]