callbacks as $priority => $callbacks ) { foreach ( $callbacks as $callback ) { $file = self::callback_file( $callback['function'] ); if ( '' !== $file && str_starts_with( $file, $plugins_dir ) && ! str_starts_with( $file, $own_dir ) ) { remove_action( $hook, $callback['function'], $priority ); } } } } } /** Path of the file where a callback is defined, or an empty string. */ private static function callback_file( $callback ): string { try { if ( is_string( $callback ) && str_contains( $callback, '::' ) ) { $callback = explode( '::', $callback, 2 ); } if ( is_array( $callback ) && 2 === count( $callback ) ) { $reflection = new \ReflectionMethod( $callback[0], $callback[1] ); } elseif ( is_string( $callback ) || $callback instanceof \Closure ) { $reflection = new \ReflectionFunction( $callback ); } elseif ( is_object( $callback ) && method_exists( $callback, '__invoke' ) ) { $reflection = new \ReflectionMethod( $callback, '__invoke' ); } else { return ''; } } catch ( \ReflectionException $e ) { return ''; } $file = $reflection->getFileName(); return $file ? wp_normalize_path( $file ) : ''; } }