Commit 969d0766637 for woocommerce
commit 969d07666372bcd6054e72fcc6cc7f5f8de82ed7
Author: SH Sajal Chowdhury <72102985+shsajalchowdhury@users.noreply.github.com>
Date: Sun Jul 12 00:16:02 2026 +0600
Add filter to disable webhook delivery logging (#64372)
* Add filter to disable webhook delivery logging
Adds woocommerce_webhook_enable_delivery_log filter to the log_delivery method,
allowing developers to disable delivery log file creation while preserving
failure tracking functionality.
Usage: add_filter( 'woocommerce_webhook_enable_delivery_log', '__return_false' );
Fixes #33432
* Add changelog entry
* Bump @since to 11.1.0 and add test for the webhook delivery log filter
* Fix phpcs violations in webhook delivery log test
---------
Co-authored-by: Brandon Kraft <public@brandonkraft.com>
diff --git a/plugins/woocommerce/changelog/pr-64372 b/plugins/woocommerce/changelog/pr-64372
new file mode 100644
index 00000000000..18c8d1612a1
--- /dev/null
+++ b/plugins/woocommerce/changelog/pr-64372
@@ -0,0 +1,4 @@
+Significance: patch
+Type: add
+
+Add woocommerce_webhook_enable_delivery_log filter to disable delivery logs.
diff --git a/plugins/woocommerce/includes/class-wc-webhook.php b/plugins/woocommerce/includes/class-wc-webhook.php
index dbff8f68dbd..f8f26b50050 100644
--- a/plugins/woocommerce/includes/class-wc-webhook.php
+++ b/plugins/woocommerce/includes/class-wc-webhook.php
@@ -547,12 +547,23 @@ class WC_Webhook extends WC_Legacy_Webhook {
$message['Webhook Delivery']['Response']['Body'] = 'Webhook body is not logged unless WP_DEBUG mode is turned on. This is to avoid the storing of personal data in the logs.';
}
- $logger->info(
- wc_print_r( $message, true ),
- array(
- 'source' => 'webhooks-delivery',
- )
- );
+ /**
+ * Filter to disable webhook delivery logging.
+ *
+ * @since 11.1.0
+ * @param bool $enable_logging Whether to log the delivery. Default true.
+ * @param int $webhook_id The webhook ID.
+ */
+ $enable_logging = apply_filters( 'woocommerce_webhook_enable_delivery_log', true, $this->get_id() );
+
+ if ( $enable_logging ) {
+ $logger->info(
+ wc_print_r( $message, true ),
+ array(
+ 'source' => 'webhooks-delivery',
+ )
+ );
+ }
// Track failures.
// Check for a success, which is a 2xx, 301 or 302 Response Code.
diff --git a/plugins/woocommerce/tests/php/includes/class-wc-webhook-tests.php b/plugins/woocommerce/tests/php/includes/class-wc-webhook-tests.php
index f1f51120993..6955c52fcec 100644
--- a/plugins/woocommerce/tests/php/includes/class-wc-webhook-tests.php
+++ b/plugins/woocommerce/tests/php/includes/class-wc-webhook-tests.php
@@ -112,4 +112,82 @@ class WC_Webhook_Test extends WC_Unit_Test_Case {
$this->assertSame( 999, $webhook2->get_user_id() );
}
+ /**
+ * @testDox The woocommerce_webhook_enable_delivery_log filter toggles delivery logging without affecting failure tracking.
+ */
+ public function test_delivery_logging_respects_enable_delivery_log_filter() {
+ // Ensure logging is enabled and every level is handled so the delivery log write is observable.
+ update_option( 'woocommerce_logs_logging_enabled', 'yes' );
+ update_option( 'woocommerce_logs_level_threshold', 'none' );
+
+ $logged = 0;
+ $log_spy = function ( $message, $level, $context ) use ( &$logged ) {
+ if ( isset( $context['source'] ) && 'webhooks-delivery' === $context['source'] ) {
+ ++$logged;
+ }
+ return $message;
+ };
+ add_filter( 'woocommerce_logger_log_message', $log_spy, 10, 3 );
+
+ $webhook = new WC_Webhook();
+ $webhook->set_status( 'active' );
+ $webhook->set_topic( 'order.created' );
+ $webhook->set_delivery_url( 'https://example.com/webhook' );
+ $webhook->set_user_id( 1 );
+ $webhook->save();
+
+ $request = array(
+ 'method' => 'POST',
+ 'user-agent' => 'WooCommerce',
+ 'headers' => array(),
+ 'body' => '{}',
+ );
+ $success = array(
+ 'response' => array(
+ 'code' => 200,
+ 'message' => 'OK',
+ ),
+ 'headers' => array(),
+ 'body' => '',
+ );
+ $failure = array(
+ 'response' => array(
+ 'code' => 500,
+ 'message' => 'Internal Server Error',
+ ),
+ 'headers' => array(),
+ 'body' => '',
+ );
+
+ // By default the delivery is logged, and the filter receives the webhook ID.
+ $received_id = null;
+ $id_spy = function ( $enable, $webhook_id ) use ( &$received_id ) {
+ $received_id = $webhook_id;
+ return $enable;
+ };
+ add_filter( 'woocommerce_webhook_enable_delivery_log', $id_spy, 10, 2 );
+ $webhook->log_delivery( 'delivery-default', $request, $success, 0.1 );
+ remove_filter( 'woocommerce_webhook_enable_delivery_log', $id_spy, 10 );
+
+ $this->assertSame( $webhook->get_id(), $received_id, 'The filter should receive the webhook ID.' );
+ $this->assertGreaterThan( 0, $logged, 'The delivery should be logged by default.' );
+
+ // When the filter returns false the log is suppressed, but failure tracking still runs.
+ $logged = 0;
+ $webhook->set_failure_count( 0 );
+ $webhook->save();
+ add_filter( 'woocommerce_webhook_enable_delivery_log', '__return_false' );
+ $webhook->log_delivery( 'delivery-disabled', $request, $failure, 0.1 );
+ remove_filter( 'woocommerce_webhook_enable_delivery_log', '__return_false' );
+
+ $this->assertSame( 0, $logged, 'The delivery log should be suppressed when the filter returns false.' );
+ $this->assertGreaterThan(
+ 0,
+ wc_get_webhook( $webhook->get_id() )->get_failure_count(),
+ 'Failure tracking must still run when delivery logging is disabled.'
+ );
+
+ remove_filter( 'woocommerce_logger_log_message', $log_spy, 10 );
+ }
+
}