钩子简介
WordPress不论是在开发主题或者插件的过程中经常要使用到WordPress的钩子技术,钩子英文叫hook–翻译:挂钩/吊钩,现在通过实例来说一下什么是WordPress钩子。

一般的主题在header.php中都有会加上函数wp_head(),有的还会在footer.php中添加wp_footer()函数,而且很多插件都会提醒如果主题代码中没有wp_head()函数可能无法使用插件,其实原因就是这两个函数就是使用到了钩子,新功能要挂钩在这两个函数上面。这样说可能有点晕,下面我们来看下具体介绍。

wp_head()函数
wp_head()位于wp-includes/general-template.php文件中:


/**
 * Fire the wp_head action
 * @since 1.2.0
 * @uses do_action() Calls 'wp_head' hook.
 */
function wp_head() {
	do_action('wp_head');
}

这个函数说明:使用do_action()来调用wp_head 钩子。这个do_action()函数可以解释为:执行一个动作,这里执行一个叫名称为wp_head的动作,里面的参数wp_head并不是函数,而仅仅是一个名称,也可以理解为它就是一个钩子。

do_action()是执行一个动作,但是这个动作要干嘛还没定义,所以我们还需要一个函数:add_action(),add_action跟do_action位于同一个文件中。

add_action()函数可以给“动作”添加具体事务,比如前面我们已经定义并执行了一个动作“wp_head”,然后我们add_action(‘hook’,’function’)(举例),就给这个“hook”动作添加了具体内容,在程序中来讲,“function”这个参数应该是个函数名称,也就是执行这个函数。

add_action()实例
我们通过wp_head()函数来往wp头部输出一个meta信息:


add_action('wp_head','echo_author');
function echo_author(){
    echo '<meta name="author" content="WordPress教程网" />';
}

我们只需要往wp_head动作上添加一个函数,输出meta信息即可,上面的函数添加在哪里,当然是主题的functions.php文件里面,或者其它主题被包含的函数文件,只要主题会执行的地方就可以。

这个应用很简单,很多插件就是这样工作的,像这样来输出CSS或JS代码。

do_action()函数


//$tag  必需、你想创建的动作钩子的名称
//$arg  传递给已有的动作钩子的值
do_action($tag, $arg);   

准确的说do_action()函数是创建一个动作并执行它,因为这个要执行的动作并不需要像变量一样需要先申明明,do_action(‘wp_head’)就是直接创建一个叫wp_head的动作然后执行它。实例:

下面我们还是用一个例子来看如何用do_action()申明一个挂勾(Hook),然后利用add_action()将我们的函数和这个挂勾(Hook)挂上。

首先打开文件general-template.php(在wp-includes目录下),在其中加入下面这段代码


function do_action_example(){
	$arg1 = array('example',90, 'do_action()');
	$arg2 = 'this is the second arg';
	echo 'Here is a function starting: do action example';
	do_action( 'do_action_example', $arg1, $arg2);
	echo 'this line is following the function is claim it is a hook' ;
}
function function_to_attache($a, $b){ print_r($a); echo ''. $b; }

然后打开文件sidebar.php, 把这行代码拷到任何你想输出文本信息的地方。


add_action('do_action_example', 'function_to_attache', 1, 2); 
//告诉WordPress在钩子do_action_example添加函数function_to_attache

打开主页,你应该看到这样的结果显示:


Here is a function starting: do action example
Array ( [0] => example [1] => 90 [2] => do_action() )
this is the second arg
this line is following the function is claim it is a hook

我们并没有invoke(调用)函数function_to_attache,可是它里面的内容被执行了,因为我们在sidebar.php中调用了do_action_example()这个挂勾(Hook)函数。