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 ),
);
}