问题描述
我有一个关于 WordPress 的问题,特别是版本 3.0 和更新版本。
有没有人知道如何获取将要应用的所有函数的数组或列表,或者是’registered’ 到 the_content 过滤器?
这个想法是生成一个可以从过滤器中删除的函数的复选框列表,如 wpautop 。我知道如何使用硬编码标签从过滤器中删除功能,但我希望创建一个更具动态性的解决方案。
如果任何人有任何想法,如果这是可能的,如何做到这一点我会很感兴趣。谢谢。
最佳解决思路
从过滤器阵列打印的简单功能?
function print_filters_for( $hook = '' ) {
global $wp_filter;
if( empty( $hook ) || !isset( $wp_filter[$hook] ) )
return;
print '<pre>';
print_r( $wp_filter[$hook] );
print '</pre>';
}
把它称为你需要的地方。
print_filters_for( 'the_content' );
次佳解决思路
这是一个更高级的例子,除了来自 $wp_filter
数组的数据外,还将显示连接钩子的文件的路径,以及定义函数的代码行。
要获取挂接在特定操作 (或过滤器) 上的函数的基本列表,就足以从过滤器数组中获取项目,但是由于函数可以以各种方式附加 (作为类方法或闭包),该列表将包含一吨的有关数据,包括呈现为字符串的对象。该示例将仅按照优先级顺序显示相关数据:
-
函数名 (取决于回调语法):
-
函数回调:
'function_name'
-
对象方法:
array( $object, 'function_name' )
-
静态类方法:
array( 'class_name', 'function_name' )
和'class_name::function_name'
-
封闭:
function() {}
-
相对静态类方法:
array( 'class_name', 'parent::function_name' )
-
-
接受的观点
-
文件名
-
起始线
-
ID
-
优先
function list_hooks( $hook = '' ) {
global $wp_filter;
if ( isset( $wp_filter[$hook]->callbacks ) ) {
array_walk( $wp_filter[$hook]->callbacks, function( $callbacks, $priority ) use ( &$hooks ) {
foreach ( $callbacks as $id => $callback )
$hooks[] = array_merge( [ 'id' => $id, 'priority' => $priority ], $callback );
});
} else {
return [];
}
foreach( $hooks as &$item ) {
// skip if callback does not exist
if ( !is_callable( $item['function'] ) ) continue;
// function name as string or static class method eg. 'Foo::Bar'
if ( is_string( $item['function'] ) ) {
$ref = strpos( $item['function'], '::' ) ? new ReflectionClass( strstr( $item['function'], '::', true ) ) : new ReflectionFunction( $item['function'] );
$item['file'] = $ref->getFileName();
$item['line'] = get_class( $ref ) == 'ReflectionFunction'
? $ref->getStartLine()
: $ref->getMethod( substr( $item['function'], strpos( $item['function'], '::' ) + 2 ) )->getStartLine();
// array( object, method ), array( string object, method ), array( string object, string 'parent::method' )
} elseif ( is_array( $item['function'] ) ) {
$ref = new ReflectionClass( $item['function'][0] );
// $item['function'][0] is a reference to existing object
$item['function'] = array(
is_object( $item['function'][0] ) ? get_class( $item['function'][0] ) : $item['function'][0],
$item['function'][1]
);
$item['file'] = $ref->getFileName();
$item['line'] = strpos( $item['function'][1], '::' )
? $ref->getParentClass()->getMethod( substr( $item['function'][1], strpos( $item['function'][1], '::' ) + 2 ) )->getStartLine()
: $ref->getMethod( $item['function'][1] )->getStartLine();
// closures
} elseif ( is_callable( $item['function'] ) ) {
$ref = new ReflectionFunction( $item['function'] );
$item['function'] = get_class( $item['function'] );
$item['file'] = $ref->getFileName();
$item['line'] = $ref->getStartLine();
}
}
return $hooks;
}
由于可以在整个运行时间内添加和删除挂钩,所以输出取决于该函数的调用位置 (wp_footer
操作是获取完整列表的好地方)
print_r
the_content
过滤器示例:
Array
(
[0] => Array
(
[id] => 000000004c8a4a660000000011808a14run_shortcode
[priority] => 8
[function] => Array
(
[0] => WP_Embed
[1] => run_shortcode
)
[accepted_args] => 1
[file] => C:xampphtdocswordpresswp-includesclass-wp-embed.php
[line] => 58
)
[1] => Array
(
[id] => wptexturize
[priority] => 10
[function] => wptexturize
[accepted_args] => 1
[file] => C:xampphtdocswordpresswp-includesformatting.php
[line] => 41
)
[2] => Array
(
[id] => 0000000006c5dc6d0000000064b1bc8e
[priority] => 10
[function] => Closure
[accepted_args] => 1
[file] => C:xampphtdocswordpresswp-contentpluginspluginplugin.php
[line] => 16
)
.....
编辑:2017-05-05
-
适用于
WP_Hook
类 -
增加优先权
-
固定:如果回调不存在则引发错误,尽管 WordPress 也引发了警告
-
固定:具有相同 ID 但不同优先级的钩子覆盖前一个
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。