Dissect WordPress Plugin
2006.02.02 12:39 ÏÂÎç WordPress
Ò»Ö±¶ÔÈí¼þµÄ×é¼þ¡¢²å¼þ¼Ü¹¹·Ç³£¸ÐÐËȤ£¬ÎÒÈÏΪÏÖÔÚ¿ª·¢ÈκÎÓ¦ÓóÌÐò£¬Ò»¶¨ÒªÓÐÒ»¸ö¼Ü¹¹Á¼ºÃµÄ²å¼þ»úÖÆ£¬ÕâÑù¿ÉÒÔÎüÒýÆäËûÈËÀ´¿ª·¢²å¼þ£¬¼«´óµÄÀ©³äϵͳµÄ¹¦ÄÜ¡£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Ó¦ÓÃÖеIJå¼þȷʵ֪֮ÉõÉÙ£¬ÓÚÊÇ£¬DissectÁËÒ»ÏÂWordPress£¨1.5.1.3£©¡£ËäÈ»¶ÔPHP²»ÊǺÜÊìϤ£¬²»¹ý¿´¿´Ô´Â뻹ÊÇÎÊÌâ²»´ó¡£
1£©WordPress¶ÁÈ¡ËùÓпÉÓõIJå¼þ
ÔÚÎļþ¡°admin-functions.php¡±ÖУ¬º¯Êý
<?php function get_plugins() ?> ?>
ÓÃÀ´´ÓÎļþϵͳµÃµ½ËùÓеIJå¼þ¡£ÔÀíºÜ¼òµ¥£¬¾ÍÊǶÁÈ¡¡¯wp-content/plugins¡¯Ä¿Â¼ÏµÄËùÓÐPHPÎļþ¡£Õâ¸öº¯ÊýÔÊÐíÒ»¼¶µÄ×ÓÎļþ¼Ð£¬Ò²¾ÍÊÇ˵ÔÚ¡¯wp-content/plugins¡¯ÏÂÃæµÄPHPÎļþ£¬ÒÔ¼°ËùÒÔÔÚ´ËĿ¼ÏµÄÒ»¼¶×ÓÎļþ¼ÐÄÚ²¿µÄPHPÎļþ±»ÁÐ×÷²å¼þµÄºòÑ¡£¬ÓÃÏÂÃæµÄº¯ÊýÈ¥½øÒ»²½ÌáÈ¡²å¼þÐÅÏ¢¡£ÕâÑùµÄºÃ´¦ÊÇ·½±ãÓû§ÀûÓÃÎļþ¼ÐÀ´¶Ô²å¼þ½øÐйÜÀíºÍ×éÖ¯¡£
¶øº¯Êý
<?php function get_plugin_data() ?>
ÓÃÀ´µÃµ½²å¼þµÄÃèÊö£¨Plugin Descriptor£©£¬Ö÷Òª°üÀ¨²å¼þµÄ°æ±¾¡¢Ãû³Æ¡¢×÷Õߣ¬µÈÐÅÏ¢£¬¶øÕâЩÆäʵÊÇÒÔ×¢Ê͵ķ½Ê½´æÔڵġ£ÓÃWordPressÖÐ×Ô´øµÄHello²å¼þÀ´¾ÙÀý£º
<?php Plugin Name: Hello Dolly Plugin URI: http://wordpress.org/# Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire ... Author: Matt Mullenweg Version: 1.0 Author URI: http://photomatt.net/ ?>
ÕâÑù£¬ÔÚget_plugin_dataº¯ÊýÖУ¬¾Í¿ÉÒÔÀ´µÃµ½²å¼þµÄÏêϸÐÅÏ¢¡£
<?php
function get_plugin_data($plugin_file) {
$plugin_data = implode('', file($plugin_file));
preg_match("|Plugin Name:(.*)|i", $plugin_data, $plugin_name);
preg_match("|Plugin URI:(.*)|i", $plugin_data, $plugin_uri);
preg_match("|Description:(.*)|i", $plugin_data, $description);
preg_match("|Author:(.*)|i", $plugin_data, $author_name);
preg_match("|Author URI:(.*)|i", $plugin_data, $author_uri);
?>
2£©Active & Deactive Plugin
Active£¨Deactive£©²å¼þµÄ²Ù×÷¶¼ÔÚPlugins.phpÖУ¬±ÈÈçÎÒÒªDeactive ¡°Hello¡±Õâ¸ö²å¼þ£¬×îºóµÄURLÆäʵÊÇÕâ¸öÑù×Ó£º
<?php http://localhost/blog/wp-admin/plugins.php?action=deactivate&plugin=hello.php ?>
ÆäÖУ¬¡°Action¡±±íʾ¶¯×÷£¬ÖµÎª¡°active¡±»òÕß¡°deactivate¡±£¬¶ø¡°Plugin¡±±íʾ¶¯×÷µÄ¶ÔÏó²å¼þ£¬´Ë´¦Îª¡°hello.php¡±¡£µÃµ½¶¯×÷Ö¸Áîºó£¬Ê×ÏÈ´ÓÊý¾Ý¿âÖÐÈ¡³öµ±Ç°ÒѾ¼¤»îµÄ²å¼þ¡£
<?php $current = get_settings('active_plugins'); ?>
È»ºó¸ù¾Ý¶¯×÷£¬ÖØÐÂÉú³ÉÒѼ¤»î²å¼þÊý×飬´æÈëÊý¾Ý¿â£¬²¢ÖØÐ¼ÓÔØ´ËÒ³¡£¼ÓÔØµÄʱºò¾ÍÐèÒª¿¼ÂÇÕâЩÒѾ¼¤»îµÄ²å¼þÊÇÔõô¹¤×÷µÄÁË¡£
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¡±µÄ×îºóÓÐÕâÑùÒ»¾ä£º
<?php require_once(ABSPATH.'wp-settings.php'); ?>
ÔÚ¡°wp-settings.php¡±ÎļþÖУ¬¿ÉÒÔÕÒµ½ÒÔÏÂÓë²å¼þÏà¹ØµÄ´úÂëÆ¬¶Ï£º
<?php
if ( get_settings('active_plugins') ) {
$current_plugins = get_settings('active_plugins');
if ( is_array($current_plugins) ) {
foreach ($current_plugins as $plugin) {
if ('' != $plugin && file_exists(ABSPATH . 'wp-content/plugins/' . $plugin))
include_once(ABSPATH . 'wp-content/plugins/' . $plugin);
}
}
}
?>
¿É¼û£¬Õâ¶Î´úÂë»áÈ¡³öϵͳÖÐËùÓÐActiveµÄ²å¼þ£¬²¢Include½øÀ´¡£ËùÒÔÔÚÿҳ¼ÓÔØµÄʱºò£¬¶¼»áÊ×ÏÈIncludeÕâЩ²å¼þ´úÂë¡£ÄÇô£¬ÕâЩ²å¼þ×Ô¼ºÔÚ¼ÓÔØµÄʱºò¶¼×öÁËÊ²Ã´ÄØ£¿
4£©²å¼þµÄ¼ÓÔØ
²å¼þµÄ¼ÓÔØÆäʵ×îÖØÒªµÄÒ»¸ö²¿·Ö¾ÍÊDzå¼þµÄʼþ×¢²á»úÖÆ£¬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¡±À´½«×Ô¼ºµÄº¯Êý×¢²áµ½ÏµÍ³µÄÀ©Õ¹µãÖС£ÕâÑù£¬ÔÚÀ©Õ¹µãÖ´ÐеÄʱºò£¬¾Í»áÕÒµ½ÏµÍ³ÖÐËùÓÐÒѾ¹Ò½Óµ½Õâ¸öÀ©Õ¹µãÉϵIJå¼þµÄº¯ÊýÀ´Ö´ÐÐÖ®£¬´Ó¶øÀ©³äϵͳµÄ¹¦ÄÜ¡£
WordPressÖеĺܶ๦ÄÜÒ²¶¼ÊÇͨ¹ýÕâÖÖ²å¼þ½á¹¹À´ÊµÏֵģ¬Ä¬ÈÏ×¢²áÁ˺ܶàϵͳʼþ£¬¶¼ÔÚ¡¯default-filter.php¡¯ÖС£±ÈÈ磺
<?php add_action('publish_post', 'generic_ping'); ?>
Õâ¸öÊÇÓÃÀ´ÔÚ·¢²¼Ã¿ÆªÌû×ÓµÄʱºò·¢ËÍXML-RPC PingµÄ¡£ÔÙ±ÈÈ磺
<?php add_filter('the_content', 'convert_smilies'); ?>
ÓÃÀ´½«ÕýÎÄ£¨content£©ÖеÄЦÁ³·ûºÅת»»ÎªÍ¼Ïñ¡£
»¹ÊǾ١°Hello¡±²å¼þÀ´Ëµ¡£Hello²å¼þ»áËæ»úµÄÔÚAdmin PageµÄÓÒÉϽÇÏÔʾһ¶Î»°£¬ËüµÄ¹¤×÷ÔÀíÊÇÕâÑùµÄ£º
ÔÚÿһ¸öAdmin pageµÄÇ°Ãæ¶¼ÓÐ
<?php require_once('admin-header.php'); ?>
¶øÔÚ¡°admin-head.php¡±Öн«»áÖ´ÐÐÀ©Õ¹µã¡°admin_head¡±µÄËùÓÐÀ©Õ¹£º
<?php
do_action('admin_head', '');
?>
ÕâÑù£¬¾Í»áÖ´ÐÐËùÓйҽӵ½admin_headµÄº¯Êý
Admin PageµÄFooter²¿·ÖͬÑùÈç´Ë£¬
<?php
do_action('admin_footer', '');
?>
ÕâÑù£¬¾Í»áÖ´ÐÐËùÓйҽӵ½admin_footerµÄº¯Êý
ÔÙÀ´¿´¿´Hello²å¼þµÄ³õʼ»¯¹ý³ÌÖУº
<?php
// This just echoes the chosen line, we'll position it later
function hello_dolly() {
global $chosen;
echo "<p id='dolly'>$chosen</p>";
}
// Now we set that function up to execute when the admin_footer action is called
add_action('admin_footer', 'hello_dolly');
// We need some CSS to position the paragraph
function dolly_css() {
echo "
<style type='text/css'>
#dolly {
position: absolute;
top: 5px;
margin: 0; padding: 0;
right: 3em;
font-size: 20px;
color: #f66;
}
</style>
";
}
add_action('admin_head', 'dolly_css');
?>
¿É¼û£¬½«dollyµÄCSS²¿·Ö²åµ½Header²¿·Ö£¬¶øÔÚfooter²¿·Ö²åÈëÏÔʾ´úÂ룬ÕâÑù£¬ÔÚAdminPageµÄÓÒÉϽǾͻáËæ»úÏÔʾһ¶Î»°¡£
ÔÙÀ´¿´¿´Ôø¾Ëµ¹ýµÄGoogle Sitemap²å¼þ£¬²å¼þÖÐÓÐÒ»ÏÄÜÊÇÔÚ·¢²¼¡¢Ð޸ĻòÕßɾ³ýÎÄÕµÄʱºòÖØÐÂBuild SitemapÎļþ£¬Õâ¸ö¹¦ÄܾÍÊÇͨ¹ý×¢²áϵͳµÄÈý¸öʼþ£¨¡°publish_post¡±£¬¡°edit_post¡±£¬¡°delete_post¡±£©À´Íê³ÉµÄ¡£
<?php
//Register to various events... @WordPress Dev Team: I wish me a 'public_content_changed' action ?
if(defined("SM_ACTIVE") && SM_ACTIVE===true) {
//If a new post gets published
add_action('publish_post', 'sm_buildSitemap');
//Existing post gets edited (published or not)
add_action('edit_post', 'sm_buildSitemap');
//Existing posts gets deleted (published or not)
add_action('delete_post', 'sm_buildSitemap');
}
#endregion
?>
BTW£ºÆäÖеÄ×¢ÊÍÒ²ºÜÓÐÒâ˼£¬ÎÒÒ²¾õµÃȷʵÐèÒªÓС°public_content_changed¡±ÕâÑùÒ»¸öʼþ£¬¾Í²»±Ø·Ö±ð¶©ÔÄÈý¸öµ¥¶ÀµÄʼþÁË¡£
¶ÔÁË£¬¾ÍÔÚÎÒÃǸղÅ˵µÄwp-settings.phpÖеIJå¼þÆô¶¯ºó£¬ÓÐ
<?php do_action('plugins_loaded'); ?>
ÕâÑùÒ»¸öϵͳʼþ£¬¿ÉÒÔ×¢²áÕâ¸öʼþÀ´×öһЩϣÍûÔÚËùÓвå¼þLoadÍê±Ï¶ø×öµÄʶù¡£
5£©Èç¹û²å¼þÖÐÉæ¼°UI
ÆäʵÊÇÒ»ÑùµÄ¡£ÒÔWordPress FeedBurner PluginÖÐÌí¼Ó²Ëµ¥ÎªÀý£º
Èç¹ûÏëÌí¼ÓÒ»¸ö²Ëµ¥£¬¾ÍÐèҪע²á¡°admin_menu¡±Õâ¸öAction Tag£¨ÏµÍ³Ê¼þ£©£º
<?php add_action('admin_menu', 'ol_add_feedburner_options_page'); ?>
¼´¿É£¬²å¼þÖеÄÕâ¸öº¯ÊýΪ£º
<?php function ol_add_feedburner_options_page() {
if (function_exists('add_options_page')) {
add_options_page('FeedBurner', 'FeedBurner', 8, basename(__FILE__), 'ol_feedburner_options_subpanel');
}<br>}
?>
¡°add_options_page¡±Õâ¸öº¯Êý¾Í»áÔÚϵͳµÄ¡°Options¡±²Ëµ¥ÖÐÌí¼Ó¡°FeedBurner¡±ÕâÑùÒ»¸ö×Ӳ˵¥¡£
¶øÕâ¸öº¯ÊýÆäʵ¾ÍÊÇÔö¼Ó Menu »òÕß SubMenu£¬
<?php
function add_submenu_page($parent, $page_title, $menu_title, $access_level, $file, $function = '') {
global $submenu;
global $menu;
$parent = plugin_basename($parent);
$file = plugin_basename($file);
// If the parent doesn't already have a submenu, add a link to the parent
// as the first item in the submenu. If the submenu file is the same as the
// parent file someone is trying to link back to the parent manually. In
// this case, don't automatically add a link back to avoid duplication.
if (! isset($submenu[$parent]) && $file != $parent) {
foreach ($menu as $parent_menu) {
if ($parent_menu[2] == $parent) {
$submenu[$parent][] = $parent_menu;
}
}
}
$submenu[$parent][] = array($menu_title, $access_level, $file, $page_title);
$hookname = get_plugin_page_hookname($file, $parent);
if ( !empty($function) && !empty($hookname) )
add_action($hookname, $function);
return $hookname;
}
function add_options_page($page_title, $menu_title, $access_level, $file, $function = '') {
return add_submenu_page('options-general.php', $page_title, $menu_title, $access_level, $file, $function);
}
?>
6£©ÆäËü
»¹ÓÐһЩ¼òµ¥µÄ²å¼þ¾ÍÊÇÖ»ÌṩһЩAPIº¯Êý¡£±ÈÈçMost_Commented Plugin£¬ËüÌṩһ¸öAPI ¡°mdv_most_commented¡±£ºÍ¨¹ýÊý¾Ý¿â²éѯµÃµ½ÆÀÂÛ×î¶àµÄÎÄÕ£¬²¢¼ÓÒÔÏÔʾ¡£ÒòΪÕâ¸ö²å¼þÒѾ±»Include¹ý£¬ËùÒÔ¿ÉÒÔÓÃÕâ¸öAPIÀ´½øÐÐÏÔʾ¡£
ÀúÊ·£º
2005.07.14 – ´´½¨
2005.07.16 – ÐÂÔöget_pluginsµÄ×ÓÎļþ¼Ð½âÎö²¿·Ö