' . $hook . ''; } public static function process_hooks() { // If we have one, get the PHP files from it. $template_files = self::get_files( '*.php', GLOB_MARK, '../templates/' ); $template_files[] = '../includes/wc-template-functions.php'; $template_files[] = '../includes/wc-template-hooks.php'; $shortcode_files = self::get_files( '*.php', GLOB_MARK, '../includes/shortcodes/' ); $widget_files = self::get_files( '*.php', GLOB_MARK, '../includes/widgets/' ); $admin_files = self::get_files( '*.php', GLOB_MARK, '../includes/admin/' ); $class_files = self::get_files( '*.php', GLOB_MARK, '../includes/' ); $other_files = array( '../woocommerce.php' ); self::$files_to_scan = array( 'Template Hooks' => $template_files, 'Shortcode Hooks' => $shortcode_files, 'Widget Hooks' => $widget_files, 'Class Hooks' => $class_files, 'Admin Hooks' => $admin_files, 'Other Hooks' => $other_files, ); $scanned = array(); ob_start(); echo '
'; echo '

Action and Filter Hook Reference

'; foreach ( self::$files_to_scan as $heading => $files ) { self::$custom_hooks_found = array(); foreach ( $files as $f ) { self::$current_file = basename( $f ); $tokens = token_get_all( file_get_contents( $f ) ); $token_type = false; $current_class = ''; $current_function = ''; if ( in_array( self::$current_file, $scanned ) ) { continue; } $scanned[] = self::$current_file; foreach ( $tokens as $index => $token ) { if ( is_array( $token ) ) { if ( $token[0] == T_CLASS ) { $token_type = 'class'; } elseif ( $token[0] == T_FUNCTION ) { $token_type = 'function'; } elseif ( $token[1] === 'do_action' ) { $token_type = 'action'; } elseif ( $token[1] === 'apply_filters' ) { $token_type = 'filter'; } elseif ( $token_type && ! empty( trim( $token[1] ) ) ) { switch ( $token_type ) { case 'class' : $current_class = $token[1]; break; case 'function' : $current_function = $token[1]; break; case 'filter' : case 'action' : $hook = trim( $token[1], "'" ); $loop = 0; if ( '_' === substr( $hook, '-1', 1 ) ) { $hook .= '{'; $open = true; // Keep adding to hook until we find a comma or colon while ( 1 ) { $loop ++; $next_hook = trim( trim( is_string( $tokens[ $index + $loop ] ) ? $tokens[ $index + $loop ] : $tokens[ $index + $loop ][1], '"' ), "'" ); if ( in_array( $next_hook, array( '.', '{', '}', '"', "'", ' ' ) ) ) { continue; } $hook_first = substr( $next_hook, 0, 1 ); $hook_last = substr( $next_hook, -1, 1 ); if ( in_array( $next_hook, array( ',', ';' ) ) ) { if ( $open ) { $hook .= '}'; $open = false; } break; } if ( '_' === $hook_first ) { $next_hook = '}' . $next_hook; $open = false; } if ( '_' === $hook_last ) { $next_hook .= '{'; $open = true; } $hook .= $next_hook; } } if ( isset( self::$custom_hooks_found[ $hook ] ) ) { self::$custom_hooks_found[ $hook ]['file'][] = self::$current_file; } else { self::$custom_hooks_found[ $hook ] = array( 'line' => $token[2], 'class' => $current_class, 'function' => $current_function, 'file' => array( self::$current_file ), 'type' => $token_type, ); } break; } $token_type = false; } } } } foreach ( self::$custom_hooks_found as $hook => $details ) { if ( ! strstr( $hook, 'woocommerce' ) && ! strstr( $hook, 'product' ) && ! strstr( $hook, 'wc_' ) ) { unset( self::$custom_hooks_found[ $hook ] ); } } ksort( self::$custom_hooks_found ); if ( ! empty( self::$custom_hooks_found ) ) { echo '

' . $heading . '

'; echo ''; foreach ( self::$custom_hooks_found as $hook => $details ) { echo '' . "\n"; } echo '
HookTypeFile(s)
' . self::get_hook_link( $hook, $details ) . ' ' . $details['type'] . ' ' . implode( ', ', array_unique( $details['file'] ) ) . '
'; } } echo '