ÊÀ½ç±­ÍøÒ³°æ_ÊÀ½ç±­(Öйú)¹Ù·½ÔÚÏߵǼ

FV.Zone Project Code

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Ó¦ÓÃÖе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&amp;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µÄ×ÓÎļþ¼Ð½âÎö²¿·Ö

Leave a Reply

You must be logged in to post a comment.

  • ÊÀ½ç±­ÍøÒ³°æ_ÊÀ½ç±­(Öйú)¹Ù·½ÔÚÏߵǼ:FV.Zone Feed

  • ÊÀ½ç±­ÍøÒ³°æ_ÊÀ½ç±­(Öйú)¹Ù·½ÔÚÏߵǼ:ÊéÇ©ºÐ×Ó

    • BloggerAPI
    • jQuery
    • Mongrel Apache
    • Web Document
    • WinSCP
  • ÊÀ½ç±­ÍøÒ³°æ_ÊÀ½ç±­(Öйú)¹Ù·½ÔÚÏߵǼ:ÓÑÇéÁ´½Ó

ÊÀ½ç±­ÍøÒ³°æ_ÊÀ½ç±­(Öйú)¹Ù·½ÔÚÏߵǼ