Home  >  Article  >  Backend Development  >  A brief analysis of WordPress plug-in execution process_PHP tutorial

A brief analysis of WordPress plug-in execution process_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 17:35:441051browse

1、首先,我现在pugins文件夹下写一个自己的插件
复制PHP内容到剪贴板
PHP代码:

/*
Plugin Name: test
Plugin URI: [url=http://wordpress.org/]http://wordpress.org/[/url]#
Description: 我测试用的
Author: lw(fantasy)
Version: 0.1
Author URI: [url=http://www.xxx.com/]http://www.xxx.com/[/url]
*/

$test = "

这是我的第一个插件!
";

function output(){ 
    global $test;
    echo $test;
}

add_action(wp_footer,output);
?>


然后在后台启用。。

2、WP执行是加载在”wp-settings.php”,而在此文件中,可以找到以下与插件相关的代码片断:
复制PHP内容到剪贴板
PHP代码:
if ( get_option(active_plugins) ) {
$current_plugins = get_option(active_plugins);
dump($current_plugins);
if ( is_array($current_plugins) ) {
  foreach ($current_plugins as $plugin) {
   if ( != $plugin && 0 == validate_file($plugin) && file_exists(WP_PLUGIN_DIR . / . $plugin) )
    include_once(WP_PLUGIN_DIR . / . $plugin);
  }
}
}


我dump了一下$current_plugins,得到

Array
(
    [0] => Fanfou-Daily/Fanfou-Daily.php
    [1] => mulberrykit.php
    [2] => test.php
)

可以看到我写的test.php插件已经被include进去了。。

3、在主题模板里的footer.php里面会执行一个函数

而这个wp_footer里面又执行

do_action(wp_footer);

而这个do_action就是执行前面我们已经注册了的【add_action(wp_footer,output); 】output()函数。。。

这样就输出了"

这是我的第一个插件!
"

Finally, post the source code of do_action for everyone to experience it
Copy the PHP content to the clipboard
PHP code:
/**
* do_action() - Execute functions hooked on a specific action hook.
*
* This function invokes all functions attached to action hook $tag.
* It is possible to create new action hooks by simply calling this function,
* specifying the name of the new hook using the $tag parameter.
*
* You can pass extra arguments to the hooks, much like you can with apply_filters().
*
* @see apply_filters() This function works similar with the exception that nothing is
* returned and only the functions or methods are called.
*
* @package WordPress
* @subpackage Plugin
* @since 1.2
* @global array $wp_filter Stores all of the filters
* @global array $wp_actions Increments the amount of times action was triggered.
*
* @param string $tag The name of the action to be executed.
* @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action.
* @return null Will return null if $tag does not exist in $wp_filter array
*/
function do_action($tag, $ arg = ) {
global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
if ( is_array($wp_actions) )
$wp_actions[] = $tag;
else
$ wp_actions = array($tag);
$wp_current_filter[] = $tag;
// Do all actions first
if ( isset($wp_filter[all]) ) {
$all_args = func_get_args ();
_wp_call_all_hook($all_args);
}
if ( !isset($wp_filter[$tag]) ) {
array_pop($wp_current_filter);
return;
}
$args = array();
if ( is_array($arg) && 1 == count($arg) && is_object($arg[0]) ) // array(&$this)
$args[] =& $arg[0];
else
$args[] = $arg;
for ( $a = 2; $a < func_num_args(); $a++ )
$args[] = func_get_arg($a);
// Sort
if ( !isset( $merged_filters[ $tag ] ) ) {
ksort($wp_filter[$tag]);
$merged_filters[ $tag ] = true;
}
reset( $wp_filter[ $tag ] );
do {
foreach ( (array) current($wp_filter[$tag]) as $the_ )
if ( !is_null($the_[function]) )
call_user_func_array($the_[function], array_slice($args, 0, (int) $the_[accepted_args]));
} while ( next($wp_filter[$tag]) !== false );
array_pop($wp_current_filter);
}


The most important one is call_user_func_array($the_[function], array_slice($args, 0, (int) $the_[accepted_args])); This sentence

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/508294.htmlTechArticle1. First, I now write my own plug-in in the pugins folder to copy PHP content to the clipboard PHP code: ?php /* Plugin Name: test Plugin URI: [url=http://wordpress.org/]http://word...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn