0 ) { $saved_level = self::$log_level; self::$log_level = self::$last_message_level ?? 'info'; self::write_log( sprintf( 'Previous message repeated %d more time(s)', self::$repeat_count ) ); self::$log_level = $saved_level; self::$repeat_count = 0; } } /** * Reset deduplication state. * * Used by tests to ensure clean state between test methods. */ public static function reset_dedup_state(): void { self::$last_message_hash = null; self::$last_message_level = null; self::$repeat_count = 0; self::$shutdown_registered = false; } /** * Log a warning message. * * @param mixed $message The message to log. * @param mixed $context Optional additional context data. */ public static function warning( $message, $context = null ): void { $previous_level = self::$log_level; self::$log_level = 'warning'; self::log( $message, $context ); self::$log_level = $previous_level; } /** * Log an error message. * * @param mixed $message The message to log. * @param mixed $context Optional additional context data. */ public static function error( $message, $context = null ): void { $previous_level = self::$log_level; self::$log_level = 'error'; self::log( $message, $context ); self::$log_level = $previous_level; } /** * Write a message to the WC logger, applying the logging filter. * * Registers a shutdown hook on first write to flush any remaining * repeat count at end of request. * * @param string $message The formatted message to write. * * @return bool Whether the message was written, so callers can mirror the * `woocommerce_pos_logging` decision instead of re-applying it. */ private static function write_log( string $message ): bool { if ( ! apply_filters( 'woocommerce_pos_logging', true, $message ) ) { return false; } if ( ! isset( self::$logger ) ) { self::$logger = wc_get_logger(); } self::$logger->log( self::$log_level, $message, array( 'source' => self::WC_LOG_FILENAME ) ); if ( ! self::$shutdown_registered ) { self::$shutdown_registered = true; add_action( 'shutdown', function () { Logger::flush_repeat_count(); } ); } return true; } }