Dissect WordPress Plugin
ä¸€ç›´å¯¹è½¯ä»¶çš„ç»„ä»¶ã€æ’ä»¶æž¶æž„éžå¸¸æ„Ÿå…´è¶£ï¼Œæˆ‘认为现在开å‘任何应用程åºï¼Œä¸€å®šè¦æœ‰ä¸€ä¸ªæž¶æž„良好的æ’ä»¶æœºåˆ¶ï¼Œè¿™æ ·å¯ä»¥å¸å¼•其他人æ¥å¼€å‘æ’件,æžå¤§çš„æ‰©å……系统的功能。Eclipse就是一个éžå¸¸æ£’的例åï¼Œå‡ ä¹Žä½ æƒ³ä»€ä¹ˆåŠŸèƒ½ï¼Œéƒ½å¯ä»¥ä»Žç¤¾åŒºä¸æ‰¾åˆ°ç›¸åº”的第三方æ’件。Firefoxä¹ŸåŒæ ·å¦‚æ¤ï¼Œå®ƒçš„æ’ä»¶æœºåˆ¶éžå¸¸çµæ´»ï¼ˆå°¤å…¶æ˜¯ç›¸å¯¹IEè€Œè¨€ï¼‰ï¼Œå› æ¤Firefox社区ä¸å¯ä»¥æ‰¾åˆ°å„ç§å„æ ·çš„æ’件。
å°±åƒNat在Open Source Summitä¸çš„一å¥è¯ï¼š
You have to give people work to do.
Create an “architecture of participation†as Tim O’Reilly says.
自从开始使用WordPress,就想å¦ä¹ å¦ä¹ WordPress强大的æ’ä»¶æœºåˆ¶ã€‚ä»¥å‰æ›¾ç»ç ”究过的COMã€XPCOMã€Firefox Extensionsã€Eclipse Plugin都是桌é¢åº”用级别的组件结构,而对Web应用ä¸çš„æ’ä»¶ç¡®å®žçŸ¥ä¹‹ç”šå°‘ï¼ŒäºŽæ˜¯ï¼ŒDissect了一下WordPress(1.5.1.3)。虽然对PHP䏿˜¯å¾ˆç†Ÿæ‚‰ï¼Œä¸è¿‡çœ‹çœ‹æºç 还是问题ä¸å¤§ã€‚
1)WordPressè¯»å–æ‰€æœ‰å¯ç”¨çš„æ’ä»¶
在文件“admin-functions.phpâ€ä¸ï¼Œå‡½æ•°
用æ¥ä»Žæ–‡ä»¶ç³»ç»Ÿå¾—到所有的æ’件。原ç†å¾ˆç®€å•,就是读喒wp-content/plugins’目录下的所有PHP文件。这个函数å…è®¸ä¸€çº§çš„åæ–‡ä»¶å¤¹ï¼Œä¹Ÿå°±æ˜¯è¯´åœ¨’wp-content/plugins’下é¢çš„PHPæ–‡ä»¶ï¼Œä»¥åŠæ‰€ä»¥åœ¨æ¤ç›®å½•ä¸‹çš„ä¸€çº§åæ–‡ä»¶å¤¹å†…部的PHP文件被列作æ’件的候选,用下é¢çš„å‡½æ•°åŽ»è¿›ä¸€æ¥æå–æ’ä»¶ä¿¡æ¯ã€‚è¿™æ ·çš„å¥½å¤„æ˜¯æ–¹ä¾¿ç”¨æˆ·åˆ©ç”¨æ–‡ä»¶å¤¹æ¥å¯¹æ’件进行管ç†å’Œç»„织。
而函数
用æ¥å¾—到æ’ä»¶çš„æè¿°ï¼ˆPlugin Descriptor),主è¦åŒ…括æ’件的版本ã€åç§°ã€ä½œè€…,ç‰ä¿¡æ¯ï¼Œè€Œè¿™äº›å…¶å®žæ˜¯ä»¥æ³¨é‡Šçš„æ–¹å¼å˜åœ¨çš„。用WordPressä¸è‡ªå¸¦çš„Helloæ’ä»¶æ¥ä¸¾ä¾‹ï¼š
è¿™æ ·ï¼Œåœ¨get_plugin_data函数ä¸ï¼Œå°±å¯ä»¥æ¥å¾—到æ’件的详细信æ¯ã€‚
2)Active & Deactive Plugin
Active(Deactive)æ’ä»¶çš„æ“作都在Plugins.phpä¸ï¼Œæ¯”如我è¦Deactive “Helloâ€è¿™ä¸ªæ’件,最åŽçš„URLå…¶å®žæ˜¯è¿™ä¸ªæ ·å:
å…¶ä¸ï¼Œâ€œActionâ€è¡¨ç¤ºåŠ¨ä½œï¼Œå€¼ä¸ºâ€œactiveâ€æˆ–者“deactivateâ€ï¼Œè€Œâ€œPluginâ€è¡¨ç¤ºåŠ¨ä½œçš„å¯¹è±¡æ’件,æ¤å¤„为“hello.phpâ€ã€‚得到动作指令åŽï¼Œé¦–先从数æ®åº“ä¸å–出当å‰å·²ç»æ¿€æ´»çš„æ’ä»¶ã€‚
ç„¶åŽæ ¹æ®åŠ¨ä½œï¼Œé‡æ–°ç”Ÿæˆå·²æ¿€æ´»æ’件数组,å˜å…¥æ•°æ®åº“ï¼Œå¹¶é‡æ–°åŠ è½½æ¤é¡µã€‚åŠ è½½çš„æ—¶å€™å°±éœ€è¦è€ƒè™‘è¿™äº›å·²ç»æ¿€æ´»çš„æ’ä»¶æ˜¯æ€Žä¹ˆå·¥ä½œçš„äº†ã€‚
BTW:附上数æ®åº“çš„Options表ä¸0æ’ä»¶å’Œåªæœ‰1个æ’件的值:
没有æ’件:’a:1:{i:0;s:0:"";}’
åªæœ‰Helloæ’件:’a:2:{i:0;s:0:"";i:1;s:9:"hello.php";}’
3)æ’件(Activeï¼‰å¦‚ä½•åŠ è½½åˆ°ç³»ç»Ÿä¸
WordPressä¸çš„æ¯é¡µéƒ½ä¼šåŒ…å«â€œwp-config.phpâ€æ–‡ä»¶ï¼Œè€Œåœ¨â€œwp-config.phpâ€çš„æœ€åŽæœ‰è¿™æ ·ä¸€å¥ï¼š
在“wp-settings.phpâ€æ–‡ä»¶ä¸ï¼Œå¯ä»¥æ‰¾åˆ°ä»¥ä¸‹ä¸Žæ’件相关的代ç 片æ–:
å¯è§ï¼Œè¿™æ®µä»£ç 会å–å‡ºç³»ç»Ÿä¸æ‰€æœ‰Activeçš„æ’件,并Includeè¿›æ¥ã€‚所以在æ¯é¡µåŠ è½½çš„æ—¶å€™ï¼Œéƒ½ä¼šé¦–å…ˆInclude这些æ’件代ç 。那么,这些æ’ä»¶è‡ªå·±åœ¨åŠ è½½çš„æ—¶å€™éƒ½åšäº†ä»€ä¹ˆå‘¢ï¼Ÿ
4)æ’ä»¶çš„åŠ è½½
æ’ä»¶çš„åŠ è½½å…¶å®žæœ€é‡è¦çš„一个部分就是æ’件的事件注册机制,WordPressæ’ä»¶ä¸çš„事件注册其实和Eclipseä¸çš„æ‰©å±•点(Extension-Point)机制éžå¸¸ç›¸åƒï¼Œè€Œè¿™ç§ç±»ä¼¼â€œæ’销â€ã€â€œæ’销座â€çš„è½¯ä»¶æ’æ‹”æ–¹å¼ä¹Ÿæˆä¸ºäº†æœ€è¿‘软件组件架构方é¢åº”用最多的实践。
äº‹ä»¶æ³¨å†Œè¿‡ç¨‹ä¸æ¯”较é‡è¦çš„å‡ ä¸ªå‡½æ•°åˆ†åˆ«æ˜¯ï¼šdo_actionã€add_actionã€add_filter。
WordPressä¸é»˜è®¤å®šä¹‰äº†å¾ˆå¤šæ‰©å±•点(也å¯ä»¥å«åšâ€œé’©åâ€ï¼‰ï¼Œæˆ–者说注册了很多系统事件(WPä¸çš„æ£è§„å«æ³•应该是“Action Tagâ€ï¼‰ï¼Œæ¯”如“admin_headâ€è¡¨ç¤ºAdmin页é¢çš„Head输出事件,“publish_postâ€è¡¨ç¤ºå‘布一篇帖å的事件ç‰ç‰ã€‚而æ’ä»¶è¦åšçš„就是扩展这些扩展点,或者说挂接这些钩å,从而实现系统的扩展功能。add_action就是通常æ’件扩展æŸä¸ªæ‰©å±•点用到的函数,而do_action是扩展点本身开始执行的函数。
刚æ‰è¯´è¿‡WordPressä¸çš„æ¯ä¸€é¡µæ‰§è¡Œå‰éƒ½ä¼šInclude所有Activeçš„æ’件代ç ,而这些代ç 通常都会用“add_actionâ€æ¥å°†è‡ªå·±çš„函数注册到系统的扩展点ä¸ã€‚è¿™æ ·ï¼Œåœ¨æ‰©å±•ç‚¹æ‰§è¡Œçš„æ—¶å€™ï¼Œå°±ä¼šæ‰¾åˆ°ç³»ç»Ÿä¸æ‰€æœ‰å·²ç»æŒ‚接到这个扩展点上的æ’ä»¶çš„å‡½æ•°æ¥æ‰§è¡Œä¹‹ï¼Œä»Žè€Œæ‰©å……系统的功能。
WordPressä¸çš„å¾ˆå¤šåŠŸèƒ½ä¹Ÿéƒ½æ˜¯é€šè¿‡è¿™ç§æ’件结构æ¥å®žçŽ°çš„ï¼Œé»˜è®¤æ³¨å†Œäº†å¾ˆå¤šç³»ç»Ÿäº‹ä»¶ï¼Œéƒ½åœ¨’default-filter.php’ä¸ã€‚比如:
这个是用æ¥åœ¨å‘布æ¯ç¯‡å¸–å的时候å‘é€XML-RPC Pingçš„ã€‚å†æ¯”如:
用æ¥å°†æ£æ–‡ï¼ˆcontent)ä¸çš„笑脸符å·è½¬æ¢ä¸ºå›¾åƒã€‚
还是举“Helloâ€æ’ä»¶æ¥è¯´ã€‚Helloæ’ä»¶ä¼šéšæœºçš„在Admin Pageçš„å³ä¸Šè§’显示一段è¯ï¼Œå®ƒçš„å·¥ä½œåŽŸç†æ˜¯è¿™æ ·çš„:
在æ¯ä¸€ä¸ªAdmin pageçš„å‰é¢éƒ½æœ‰
而在“admin-head.phpâ€ä¸å°†ä¼šæ‰§è¡Œæ‰©å±•点“admin_headâ€çš„æ‰€æœ‰æ‰©å±•:
è¿™æ ·ï¼Œå°±ä¼šæ‰§è¡Œæ‰€æœ‰æŒ‚æŽ¥åˆ°admin_head的函数
Admin Pageçš„Footeréƒ¨åˆ†åŒæ ·å¦‚æ¤ï¼Œ
è¿™æ ·ï¼Œå°±ä¼šæ‰§è¡Œæ‰€æœ‰æŒ‚æŽ¥åˆ°admin_footer的函数
冿¥çœ‹çœ‹Helloæ’ä»¶çš„åˆå§‹åŒ–过程ä¸ï¼š
å¯è§ï¼Œå°†dollyçš„CSS部分æ’到Header部分,而在footer部分æ’入显示代ç ï¼Œè¿™æ ·ï¼Œåœ¨AdminPageçš„å³ä¸Šè§’å°±ä¼šéšæœºæ˜¾ç¤ºä¸€æ®µè¯ã€‚
冿¥çœ‹çœ‹æ›¾ç»è¯´è¿‡çš„Google Sitemapæ’件,æ’件䏿œ‰ä¸€é¡¹åŠŸèƒ½æ˜¯åœ¨å‘布ã€ä¿®æ”¹æˆ–è€…åˆ é™¤æ–‡ç« çš„æ—¶å€™é‡æ–°Build Sitemap文件,这个功能就是通过注册系统的三个事件(“publish_postâ€ï¼Œâ€œedit_postâ€ï¼Œâ€œdelete_postâ€ï¼‰æ¥å®Œæˆçš„。
BTW:其ä¸çš„æ³¨é‡Šä¹Ÿå¾ˆæœ‰æ„æ€ï¼Œæˆ‘ä¹Ÿè§‰å¾—ç¡®å®žéœ€è¦æœ‰â€œpublic_content_changedâ€è¿™æ ·ä¸€ä¸ªäº‹ä»¶ï¼Œå°±ä¸å¿…分别订阅三个å•独的事件了。
对了,就在我们刚æ‰è¯´çš„wp-settings.phpä¸çš„æ’ä»¶å¯åЍåŽï¼Œæœ‰
è¿™æ ·ä¸€ä¸ªç³»ç»Ÿäº‹ä»¶ï¼Œå¯ä»¥æ³¨å†Œè¿™ä¸ªäº‹ä»¶æ¥åšä¸€äº›å¸Œæœ›åœ¨æ‰€æœ‰æ’ä»¶Load完毕而åšçš„事儿。
5)如果æ’件䏿¶‰åŠUI
å…¶å®žæ˜¯ä¸€æ ·çš„ã€‚ä»¥WordPress FeedBurner Plugin䏿·»åŠ èœå•为例:
å¦‚æžœæƒ³æ·»åŠ ä¸€ä¸ªèœå•ï¼Œå°±éœ€è¦æ³¨å†Œâ€œadmin_menuâ€è¿™ä¸ªAction Tag(系统事件):
å³å¯ï¼Œæ’ä»¶ä¸çš„这个函数为:
“add_options_pageâ€è¿™ä¸ªå‡½æ•°å°±ä¼šåœ¨ç³»ç»Ÿçš„“Optionsâ€èœå•䏿·»åŠ â€œFeedBurnerâ€è¿™æ ·ä¸€ä¸ªåèœå•。
è€Œè¿™ä¸ªå‡½æ•°å…¶å®žå°±æ˜¯å¢žåŠ Menu 或者 SubMenu,
6)其它
还有一些简å•çš„æ’ä»¶å°±æ˜¯åªæä¾›ä¸€äº›API函数。比如Most_Commented Plugin,它æä¾›ä¸€ä¸ªAPI “mdv_most_commentedâ€ï¼šé€šè¿‡æ•°æ®åº“æŸ¥è¯¢å¾—åˆ°è¯„è®ºæœ€å¤šçš„æ–‡ç« ï¼Œå¹¶åŠ ä»¥æ˜¾ç¤ºã€‚å› ä¸ºè¿™ä¸ªæ’ä»¶å·²ç»è¢«Include过,所以å¯ä»¥ç”¨è¿™ä¸ªAPIæ¥è¿›è¡Œæ˜¾ç¤ºã€‚
历å²ï¼š
2005.07.14 - 创建
2005.07.16 - 新增get_pluginsçš„åæ–‡ä»¶å¤¹è§£æžéƒ¨åˆ†
Popularity: 40%
Related entries:

July 20th, 2005 at 11:17 pm
[…] å½“ä½ çš„Blogæ—¥æ¸ä¸°å¯Œï¼Œå¯ä»¥è€ƒè™‘è®©é‚£äº›é™ˆå¹´è€æ–‡å‡ºæ¥æ™’晒太阳,就用这个Random Postå°±ä¸é”™ã€‚相信看了WordPressçš„æ’件结构,就能明白这个æ’件的基本原ç†ã€‚ […]
Meng Yan ( åŸå²© ) @ Weblog » Blog Archive » Dissect WordPress Themes Says:July 26th, 2005 at 2:46 pm
[…] è¦æƒ³çœŸæ£æˆåŠŸï¼Œå¿…é¡»èƒ½å¤Ÿæä¾›ä¸€ä¸ªå¯ä»¥ä¾›äººå‚与的架构,Eclipse如æ¤ï¼ŒFirefox亦如æ¤ã€‚与Pluginä¸€æ ·ï¼ŒWordPressä¸çš„Theme机制也éžå¸¸çµæ´»å’Œå¼ºå¤§ï¼Œç¤¾åŒºè´¡çŒ®å‡ºçš„一个个漂亮的Theme都是这个良好架构下的æ°ä½œã€‚ […]
GoTop’s Blog » Blog Archive » 两篇关于 WordPressçš„pluginå’Œtheme原ç†çš„æ–‡ç« Says:March 6th, 2006 at 12:41 am
[…] http://www.mengyan.org/blog/archives/2005/07/14/32.html […]
Louis Says:October 31st, 2006 at 5:19 pm
Hello,
Just wondering if anyone could help. I did something stupid and started my blog using a numerical archive system, and now I'd like to change it so that the post title is part of the URL for SEO reasons. Is there any Wordpress plugins that anyone knows of that could switch it without sending Googlers to invalid pages? Maybe some sort of redirector to the correct page?
Thanks.
GAOZHI BLOG » Blog Archive » Dissect WordPress Plugin(深入剖æžWordPressæ’件机制) Says:July 26th, 2007 at 4:14 pm
[…] 还有一些简å•çš„æ’ä»¶å°±æ˜¯åªæä¾›ä¸€äº›API函数。比如Most_Commented Plugin,它æä¾›ä¸€ä¸ªAPI “mdv_most_commentedâ€ï¼šé€šè¿‡æ•°æ®åº“æŸ¥è¯¢å¾—åˆ°è¯„è®ºæœ€å¤šçš„æ–‡ç« ï¼Œå¹¶åŠ ä»¥æ˜¾ç¤ºã€‚å› ä¸ºè¿™ä¸ªæ’ä»¶å·²ç»è¢«Include过,所以å¯ä»¥ç”¨è¿™ä¸ªAPIæ¥è¿›è¡Œæ˜¾ç¤ºã€‚ æ–‡ç« æ¥æº:http://www.mengyan.org/blog/archives/2005/07/14/32.html Leave a Comment […]
出家如åˆï¼Œæˆä½›æœ‰ä½™ » Dissect WordPress Plugin Says:October 3rd, 2007 at 2:25 am
[…] http://www.mengyan.org/blog/archives/2005/07/14/32.html […]
WordPressçš„ä¸€äº›å·¥ä½œåŽŸç† | 失è½çš„神庙 Says:March 13th, 2008 at 2:04 pm
[…] Dissect WordPress Plugin ç†è§£wordpressçš„æ’件机制 […]