rary rewrite flush detector. */ add_filter( 'flush_rewrite_rules_hard', function( $hard ) { error_log( '================ REWRITE FLUSH DETECTED ================' ); error_log( 'URI=' . ( $_SERVER['REQUEST_URI'] ?? 'CLI' ) ); error_log( 'HARD=' . ( $hard ? 'YES' : 'NO' ) ); error_log( 'CURRENT FILTER=' . current_filter() ); global $wp_filter; /* * Identify callbacks registered on the current action. */ $hook = current_filter(); if ( isset( $wp_filter[ $hook ] ) && ! empty( $wp_filter[ $hook ]->callbacks ) ) { foreach ( $wp_filter[ $hook ]->callbacks as $priority => $callbacks ) { foreach ( $callbacks as $callback ) { $function = $callback['function']; if ( is_string( $function ) ) { $name = $function; } elseif ( is_array( $function ) ) { if ( is_object( $function[0] ) ) { $name = get_class( $function[0] ) . '->' . $function[1]; } else { $name = $function[0] . '::' . $function[1]; } } elseif ( $function instanceof Closure ) { $name = 'Closure'; } else { $name = 'Unknown callback'; } error_log( 'CURRENT HOOK CALLBACK | priority=' . $priority . ' | ' . $name ); } } } /* * More useful backtrace. */ $trace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); foreach ( $trace as $i => $frame ) { $file = $frame['file'] ?? ''; $line = $frame['line'] ?? ''; $function = $frame['function'] ?? ''; $class = $frame['class'] ?? ''; $type = $frame['type'] ?? ''; error_log( sprintf( 'TRACE #%d: %s%s%s | %s:%s', $i, $class, $type, $function, $file, $line ) ); } error_log( '================ END REWRITE FLUSH ================' ); return $hard; }, PHP_INT_MAX );