WordPressのフックを設定している箇所を特定する方法
フックに登録されている関数が定義されている箇所はどこだろう?というときに,それを表示する処理です.
//// フックの列挙
global $wp_filter;
$action = 'pre_get_document_title';
if ( is_object( $wp_filter[$action] ) ) {
foreach ( $wp_filter[$action]->callbacks as $priority => $callbacks ) {
foreach ( $callbacks as $key => $filter ) {
$type = $filter_id = '';
try {
$callback = '';
$accepted_args = 1;
if ( isset( $filter['function'] ) ) {
if ( isset( $filter['accepted_args'] ) ) {
$accepted_args = (int)$filter['accepted_args'];
}
$ref = null;
if ( is_string( $filter['function'] ) ) {
$callback = $filter['function']; //global function
$ref = new \ReflectionFunction( $filter['function'] );
}
else if ( is_object( $filter['function'] ) ) {
$callback = 'closure'; //closure function
$ref = new \ReflectionFunction( $filter['function'] );
}
else if ( is_array( $filter['function'] ) ) {
if ( is_string( $filter['function'][0] ) ) { //static class
$class = $filter['function'][0];
$func = $filter['function'][1];
$callback = "$class::$func";
$ref = new \ReflectionMethod( $class, $func);
}
else if ( is_object( $filter['function'][0] ) ) { //instance class
$class = get_class( $filter['function'][0] );
$func = $filter['function'][1];
$callback = "$class::$func";
$ref = new \ReflectionMethod( $class, $func);
}
}
if ( is_object($ref) ) {
$file = wp_normalize_path( $ref->getFileName() );
$rootdir = wp_normalize_path( ABSPATH );
$plugin_root = wp_normalize_path( dirname( plugin_dir_path( __FILE__ ), 1)) . '/';
$theme_root = wp_normalize_path( get_theme_root() ) . '/';
if ( strpos($file, $plugin_root) !== false ) {
$type = 'plugins';
$file = str_ireplace( $plugin_root, '', $file);
}
else if ( strpos($file, $theme_root) !== false) {
$type = 'themes';
$file = str_ireplace( $theme_root, '', $file);
}
else {
$type = 'core';
$file = str_ireplace( $rootdir, '', $file);
}
echo '<!-- ';
echo esc_html($file);
echo ' -->';
}
}
}
catch ( Exception $e ) {
return null;
}
}
}
}
https://celtislab.net/archives/20200928/wp-remove-hook-closure/
こちらのページ「WordPress のアクションフックに登録されている無名関数(クロージャー)を解除する方法」を参照しました.