WordPressのフックを設定している箇所を特定する方法

2022年1月8日

フックに登録されている関数が定義されている箇所はどこだろう?というときに,それを表示する処理です.

//// フックの列挙
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 のアクションフックに登録されている無名関数(クロージャー)を解除する方法」を参照しました.