' . $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 '
Hook | Type | File(s) |
';
foreach ( self::$custom_hooks_found as $hook => $details ) {
echo '
' . self::get_hook_link( $hook, $details ) . ' |
' . $details['type'] . ' |
' . implode( ', ', array_unique( $details['file'] ) ) . ' |
' . "\n";
}
echo '
';
}
}
echo '