diff --git a/plugins/woocommerce/changelog/try-expired-logs-filter b/plugins/woocommerce/changelog/try-expired-logs-filter new file mode 100644 index 00000000000..d42f9f1e437 --- /dev/null +++ b/plugins/woocommerce/changelog/try-expired-logs-filter @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add a filter to allow preventing an expired log file from being deleted diff --git a/plugins/woocommerce/src/Internal/Admin/Logging/LogHandlerFileV2.php b/plugins/woocommerce/src/Internal/Admin/Logging/LogHandlerFileV2.php index 90856799762..dd509419cf6 100644 --- a/plugins/woocommerce/src/Internal/Admin/Logging/LogHandlerFileV2.php +++ b/plugins/woocommerce/src/Internal/Admin/Logging/LogHandlerFileV2.php @@ -237,7 +237,29 @@ class LogHandlerFileV2 extends WC_Log_Handler { ) ); - if ( is_wp_error( $files ) || count( $files ) < 1 ) { + if ( is_wp_error( $files ) ) { + return 0; + } + + $files = array_filter( + $files, + function( $file ) use ( $timestamp ) { + /** + * Allows preventing an expired log file from being deleted. + * + * @param bool $delete True to delete the file. + * @param File $file The log file object. + * @param int $timestamp The expiration threshold. + * + * @since 8.7.0 + */ + $delete = apply_filters( 'woocommerce_logger_delete_expired_file', true, $file, $timestamp ); + + return boolval( $delete ); + } + ); + + if ( count( $files ) < 1 ) { return 0; } @@ -254,31 +276,16 @@ class LogHandlerFileV2 extends WC_Log_Handler { time(), 'info', sprintf( - '%s %s', - sprintf( - esc_html( - // translators: %s is a number of log files. - _n( - '%s expired log file was deleted.', - '%s expired log files were deleted.', - $deleted, - 'woocommerce' - ) - ), - number_format_i18n( $deleted ) + esc_html( + // translators: %s is a number of log files. + _n( + '%s expired log file was deleted.', + '%s expired log files were deleted.', + $deleted, + 'woocommerce' + ) ), - sprintf( - esc_html( - // translators: %s is a number of days. - _n( - 'The retention period for log files is %s day.', - 'The retention period for log files is %s days.', - $retention_days, - 'woocommerce' - ) - ), - number_format_i18n( $retention_days ) - ) + number_format_i18n( $deleted ) ), array( 'source' => 'wc_logger', diff --git a/plugins/woocommerce/src/Internal/Admin/Logging/Settings.php b/plugins/woocommerce/src/Internal/Admin/Logging/Settings.php index 0e8890608ef..125660842dd 100644 --- a/plugins/woocommerce/src/Internal/Admin/Logging/Settings.php +++ b/plugins/woocommerce/src/Internal/Admin/Logging/Settings.php @@ -154,18 +154,28 @@ class Settings { 'step' => 1, ); + $desc = array(); + $hardcoded = has_filter( 'woocommerce_logger_days_to_retain_logs' ); - $desc = ''; if ( $hardcoded ) { $custom_attributes['disabled'] = 'true'; - $desc = sprintf( + $desc[] = sprintf( // translators: %s is the name of a filter hook. __( 'This setting cannot be changed here because it is being set by a filter on the %s hook.', 'woocommerce' ), 'woocommerce_logger_days_to_retain_logs' ); } + $file_delete_has_filter = LogHandlerFileV2::class === $this->get_default_handler() && has_filter( 'woocommerce_logger_delete_expired_file' ); + if ( $file_delete_has_filter ) { + $desc[] = sprintf( + // translators: %s is the name of a filter hook. + __( 'The %s hook has a filter set, so some log files may have different retention settings.', 'woocommerce' ), + 'woocommerce_logger_delete_expired_file' + ); + } + return array( 'title' => __( 'Retention period', 'woocommerce' ), 'desc_tip' => __( 'This sets how many days log entries will be kept before being auto-deleted.', 'woocommerce' ), @@ -181,7 +191,7 @@ class Settings { ' %s', __( 'days', 'woocommerce' ), ), - 'desc' => $desc, + 'desc' => implode( '

', $desc ), ); }