=== BuddyPilot Order Webhook Guard ===
Contributors: buddypilot, domkawula
Tags: woocommerce, webhook, orders, invoice, integration
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Stops a burst of WooCommerce order.updated webhooks (and the duplicate invoices they cause) when past guest orders are linked to a customer account.

== Description ==

**BuddyPilot Order Webhook Guard** fixes one specific WooCommerce side effect. Since WooCommerce 11.0, verifying a customer's email address (a completed password reset, a set-password link for a new account, or a clicked verification link) reassigns every matching guest order to that account. Each reassigned order is saved, and every save fires the `order.updated` webhook.

If an external integration listens to `order.updated` and acts on it, for example an invoicing service that issues an invoice per order update, a single password reset can produce a burst of unwanted webhooks and duplicate documents, one for each past guest order on that email address.

This plugin suppresses the `order.updated` webhook only while that linking routine runs. The orders are still reassigned to the account, so the customer keeps their order history and download permissions; only the webhook delivery for those particular saves is skipped. Every other `order.updated` event, such as a status change or a manual edit in the admin, is delivered as usual.

= What it does =

* Suppresses the `order.updated` webhook only during guest-order linking, and nothing else
* Keeps the account linking intact, so customers keep their past orders and download permissions
* Covers both linking paths: automatic (after email verification) and manual (the admin "link orders" action on the Customers report)
* Leaves every other webhook topic, and every other `order.updated` event, untouched
* Uses only public WooCommerce extension points and does not modify WooCommerce core
* Zero configuration: no settings page, no options, no database writes

= How it works =

WooCommerce links past guest orders through its `wc_update_new_customer_past_orders()` routine. The plugin wraps that routine with a short-lived, process-local flag and, while the flag is raised, returns false from the `woocommerce_webhook_should_deliver` filter for the `order.updated` topic. WooCommerce evaluates that decision synchronously as each order is saved, so no matching webhook is queued for delivery. The flag is always cleared afterwards, even if an order save throws.

== Installation ==

1. Upload the `buddypilot-order-webhook-guard` folder to `/wp-content/plugins/`, or install the plugin ZIP via **Plugins > Add New > Upload Plugin**.
2. Activate the plugin through the **Plugins** menu in WordPress.
3. There is nothing to configure. WooCommerce must be active.

== Frequently Asked Questions ==

= Does this stop guest orders from being linked to customer accounts? =

No. The linking still happens, so customers keep their past guest orders and any download permissions. Only the `order.updated` webhook that would fire during the linking is suppressed.

= Does it affect normal order.updated webhooks? =

No. Suppression is active only during the guest-order linking routine. Status changes, manual edits, and every other order update deliver their webhooks normally.

= Which integrations does this help? =

Any integration that consumes the WooCommerce `order.updated` webhook and reacts to it, for example invoicing services that create a document per order update.

= Does it work without WooCommerce? =

No. The plugin registers nothing meaningful unless WooCommerce is active, and does nothing otherwise.

= Does it write anything to the database? =

No. There are no options, no custom tables, and no settings screen. Deactivating the plugin fully restores the default WooCommerce behaviour.

== Changelog ==

= 1.0.0 =
* Initial release.
* Suppress the `order.updated` webhook while past guest orders are linked to a customer account, on both the email-verification path and the admin "link orders" path.

== Upgrade Notice ==

= 1.0.0 =
Initial release.
