WordPress使用挂钩来帮助开发人员以相对简单的方式完成他们需要做的事情。有些钩子是apply_filter()
和do_action()
由WordPress定义。让我们看看打电话时会发生什么the_title()
一直到它碰到你定义的钩子为止。
<?php the_title(); ?>
Developer Resources - the_title()
function the_title($before = \'\', $after = \'\', $echo = true) {
$title = get_the_title();
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
就在它调用的顶部
get_the_title()
我们可以在这里找到过滤器。让我们看一下:
Developer Resources - get_the_title()
function get_the_title( $post = 0 ) {
$post = get_post( $post );
$title = isset( $post->post_title ) ? $post->post_title : \'\';
$id = isset( $post->ID ) ? $post->ID : 0;
if ( ! is_admin() ) {
if ( ! empty( $post->post_password ) ) {
/**
* Filter the text prepended to the post title for protected posts.
*
* The filter is only applied on the front end.
*
* @since 2.8.0
*
* @param string $prepend Text displayed before the post title.
* Default \'Protected: %s\'.
* @param WP_Post $post Current post object.
*/
$protected_title_format = apply_filters( \'protected_title_format\', __( \'Protected: %s\' ), $post );
$title = sprintf( $protected_title_format, $title );
} else if ( isset( $post->post_status ) && \'private\' == $post->post_status ) {
/**
* Filter the text prepended to the post title of private posts.
*
* The filter is only applied on the front end.
*
* @since 2.8.0
*
* @param string $prepend Text displayed before the post title.
* Default \'Private: %s\'.
* @param WP_Post $post Current post object.
*/
$private_title_format = apply_filters( \'private_title_format\', __( \'Private: %s\' ), $post );
$title = sprintf( $private_title_format, $title );
}
}
/**
* Filter the post title.
*
* @since 0.71
*
* @param string $title The post title.
* @param int $id The post ID.
*/
return apply_filters( \'the_title\', $title, $id );
}
您会直接注意到它调用的函数的底部
apply_filters()
并在
function_name
像
string,
$title
像
string 和
$id
像
int 然后返回任何内容
apply_fitlers()
返回,这是您的挂钩。让我们看看
apply_filters()
:
Developer Resources - apply_filters()
function apply_filters( $tag, $value ) {
global $wp_filter, $merged_filters, $wp_current_filter;
$args = array();
// Do \'all\' actions first.
if ( isset($wp_filter[\'all\']) ) {
$wp_current_filter[] = $tag;
$args = func_get_args();
_wp_call_all_hook($args);
}
if ( !isset($wp_filter[$tag]) ) {
if ( isset($wp_filter[\'all\']) )
array_pop($wp_current_filter);
return $value;
}
if ( !isset($wp_filter[\'all\']) )
$wp_current_filter[] = $tag;
// Sort.
if ( !isset( $merged_filters[ $tag ] ) ) {
ksort($wp_filter[$tag]);
$merged_filters[ $tag ] = true;
}
reset( $wp_filter[ $tag ] );
if ( empty($args) )
$args = func_get_args();
do {
foreach( (array) current($wp_filter[$tag]) as $the_ )
if ( !is_null($the_[\'function\']) ){
$args[1] = $value;
$value = call_user_func_array($the_[\'function\'], array_slice($args, 1, (int) $the_[\'accepted_args\']));
}
} while ( next($wp_filter[$tag]) !== false );
array_pop( $wp_current_filter );
return $value;
}
它看起来很复杂,但在我们开始之前,让我们先看看这个函数最重要的部分,
$wp_filter
. 现在这个小错误包含了您和WordPress添加的所有过滤器。您可以在
wp_head()
查看完整列表。看起来像这样(还有很多吨,我刚刚选的
the_title
因为这是主题!)
[the_title] => Array
(
[10] => Array
(
[wptexturize] => Array
(
[function] => wptexturize
[accepted_args] => 1
)
[convert_chars] => Array
(
[function] => convert_chars
[accepted_args] => 1
)
[trim] => Array
(
[function] => trim
[accepted_args] => 1
)
)
[11] => Array
(
[capital_P_dangit] => Array
(
[function] => capital_P_dangit
[accepted_args] => 1
)
)
)
这是一个多维过滤器数组,索引为
tag, 然后由
priority 最终由
function name. 我觉得很整洁!由于没有传递优先级,您添加的过滤器默认为索引
10,并将添加到正下方
trim
然后通过函数名进一步索引
cm_title
.
让我们往回走一点。如果我们看看get_the_title()
上面的函数我们看到它通过three 变量输入到apply_filters
功能,但我们可以清楚地看到,它只接受two 参数!我必须仔细研究一下,它看起来像一个小函数,func_get_args()
我们看到里面乱扔垃圾apply_filters()
实际上会抓住任何传递给它的东西。Here\'s an example, 这个Codepen 也很好。现在,即使可以传递任何内容,如果我们回过头来看我们的多维数组,有一个accepted_args
参数从技术上讲,即使它允许您这样做,您也不能这样做。
呸
最后,它使用$wp_filters
阵列:
do {
foreach( (array) current($wp_filter[$tag]) as $the_ )
if ( !is_null($the_[\'function\']) ){
$args[1] = $value;
$value = call_user_func_array($the_[\'function\'], array_slice($args, 1, (int) $the_[\'accepted_args\']));
}
} while ( next($wp_filter[$tag]) !== false );
所以,让我们一起来吧!
the_title()
呼叫get_the_title()
get_the_title()
退货apply_filters()
, 传入:“the\\u title”(函数名),$title
(字符串帖子标题),$id
(int post id)apply_filters()
查看包含所有已添加过滤器的全局数组,然后运行这些过滤器并传入传递给它的信息($title
, 和$id
).
您调用的函数
add_filter
实际上,将函数名、优先级和参数添加到全局
$wp_filters
大堆您可以看到以下内容:
Developer Resources - add_filter()
function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
global $wp_filter, $merged_filters;
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
$wp_filter[$tag][$priority][$idx] = array(\'function\' => $function_to_add, \'accepted_args\' => $accepted_args);
unset( $merged_filters[ $tag ] );
return true;
}
真的,这是以前打过的
the_title()
有人打过电话。您的函数加载了
wp_head()
因此,您通过插件或
functions.php
也将添加到此全局数组。
那太长了,但如果你在评论中有任何问题,希望现在它更有意义了!