=== CartTrigger – Quantity Discounts ===
Contributors: polettoespana
Donate link: https://www.paypal.me/polettoespana
Tags: woocommerce, discount, quantity discount, bulk discount
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 2.3.3
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
WC tested up to: 10.7.0
Requires Plugins: woocommerce

Show cart notices and apply automatic discounts when customers reach a quantity threshold — configurable per category, or SKU.

== Description ==

**CartTrigger – Quantity Discounts** is a lightweight WooCommerce plugin that encourages customers to buy more by showing a notice when they reach a trigger quantity, and automatically applying a discount when they hit the target quantity.

Each discount rule is fully configurable:

* **Trigger qty** — the cart quantity at which the promotional notice is shown
* **Target qty** — the quantity that unlocks the automatic discount
* **Discount type** — percentage (%) or fixed amount
* **Discount scope** — apply to the entire cart subtotal or only to the matched items' subtotal
* **Category filter** — limit the rule to one or more product categories (subcategories included automatically)
* **SKU filter** — target one or more specific products by SKU (takes priority over category)
* **Notice position** — show on cart/checkout only, product page only, or both
* **Custom CSS class** — style each notice independently with your own CSS
* **Conflict mode** — control how the plugin behaves when other discounts (coupons) are already active in the cart

**Key features:**

* Multiple rules with independent triggers and targets
* Best-discount logic: when multiple rules share the same target and scope, only the highest discount is applied
* Product page notices via a dedicated template with its own text and CSS class
* Coupon conflict modes: stack, exclusive, or best-discount-wins
* Full support for WPML and Polylang (notice text registered as translatable string)
* Compatible with WooCommerce HPOS (Custom Order Tables)
* No bloat — zero external dependencies, no JavaScript on the frontend

**Available notice variables:**

`{current}` — current quantity in cart
`{missing}` — quantity still needed to reach the target
`{target}` — target quantity
`{discount}` — formatted discount value (e.g. *10%* or *€5.00*)

== Installation ==

1. Upload the `carttrigger-quantity-discounts` folder to the `/wp-content/plugins/` directory, or install the plugin directly from the WordPress plugin screen.
2. Activate the plugin through the **Plugins** screen in WordPress.
3. Go to **WooCommerce → Quantity Discounts** to configure your discount rules.

== Frequently Asked Questions ==

= Does the plugin work with product variations? =

Yes. When using SKU-based rules, the plugin matches against the variation's own SKU (if set) or falls back to the parent product's SKU.

= Can I apply the discount only to specific product categories? =

Yes. Each rule has a category selector. Selecting a parent category automatically includes all its subcategories.

= What happens if two rules have the same target quantity? =

The plugin automatically applies the highest discount among all matching rules. It will never stack multiple discounts for the same target/scope group.

= Can I show a different message on the product page and in the cart? =

Yes. Under **Notice position → Product page notice** you can set a separate template (or leave it empty to reuse the cart template).

= Is it compatible with WPML and Polylang? =

Yes. The notice templates are registered as translatable strings and can be translated from the WPML String Translation or Polylang String Translations interface.

= What happens if a customer has a coupon in the cart? =

It depends on the **Conflict mode** setting (WooCommerce → Quantity Discounts → Coupon behaviour):

* **Stack** (default) — the quantity discount is always applied alongside any active coupons.
* **Exclusive** — the quantity discount is skipped entirely if any coupon is active.
* **Best discount wins** — the plugin compares its total discount against the coupon discount total and applies the quantity discount only if it is greater; otherwise the coupon takes precedence.

= Is it compatible with WooCommerce High-Performance Order Storage (HPOS)? =

Yes. The plugin declares full HPOS compatibility.

== Screenshots ==

1. Admin settings page — discount rules table with trigger, target, discount type, scope, category/SKU filters, notice text, position and conflict mode.
2. Cart page — notice shown to the customer when the trigger quantity is reached, and discount applied at checkout.
3. Product page — notice displayed below the Add to Cart button.

== Changelog ==

= 2.3.3 =
* Compatibility: WordPress 7.0.

= 2.3.2 =
* Renamed internal prefix to meet WordPress.org naming requirements.
* Moved admin JavaScript to an enqueued external file.
* Fixed late escaping on echoed variables.
* Fixed folder name in installation instructions.

= 2.3.1 =
* Conflict mode now also suppresses cart and product page notices when a coupon is active (Exclusive and Best modes) — prevents showing a discount promise that would not be applied.

= 2.3.0 =
* Added conflict mode setting: Stack, Exclusive, or Best discount wins — controls how the plugin interacts with active coupons.

= 2.2.0 =
* Added SKU-based rule filtering (takes priority over category).
* Added product page notices with dedicated template and CSS class.
* Added discount scope per rule: entire cart or category subtotal only.
* Added HPOS (Custom Order Tables) compatibility declaration.
* Added Settings link in the plugin list row.
* Improved notice styling: custom CSS class now applied server-side via WooCommerce notice data.
* Renamed plugin to CartTrigger – Quantity Discounts.

= 2.1.0 =
* Added support for WPML and Polylang string translation.
* Added conflict warning for rules with the same target but different discount values.
* Added per-rule custom CSS class for frontend notices.

= 2.0.0 =
* Initial public release.
* Configurable trigger/target quantity rules.
* Percentage and fixed discount types.
* Category filtering with automatic subcategory inclusion.

== Upgrade Notice ==

= 2.3.2 =
Internal code cleanup to comply with WordPress.org review requirements. No breaking changes for end users.

= 2.3.1 =
Notices are now also suppressed in Exclusive and Best modes when a coupon is active. No breaking changes.

= 2.3.0 =
New setting: conflict mode for coupon interaction (Stack / Exclusive / Best). No breaking changes — existing rules default to Stack (previous behaviour).

= 2.2.0 =
New features: SKU filtering, product page notices, discount scope per rule. No breaking changes — existing rules continue to work unchanged.
