You've already forked wc-tier-and-package-prices
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 88e30d028c |
@@ -18,7 +18,8 @@
|
|||||||
"Bash(for po in *.po)",
|
"Bash(for po in *.po)",
|
||||||
"Bash(do msgfmt -o \"$po%.po.mo\" \"$po\")",
|
"Bash(do msgfmt -o \"$po%.po.mo\" \"$po\")",
|
||||||
"Bash(done)",
|
"Bash(done)",
|
||||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nRelease version 1.1.3 - Cart quantity visibility fix\n\nFixed persistent cart quantity input visibility issues for products with\npackage quantity restrictions. Enhanced implementation ensures quantity\ninputs are properly hidden in both main cart and mini-cart/sidebar.\n\nFixes:\n- Cart quantity inputs now properly hidden with increased filter priority\n- Mini-cart quantity inputs correctly replaced with read-only text\n- Added fallback CSS injection to handle theme/plugin conflicts\n- Enhanced DOM targeting with data attributes and multiple CSS selectors\n\nTechnical Changes:\n- Increased filter priority to 999 for woocommerce_cart_item_quantity\n- Added woocommerce_widget_cart_item_quantity filter for mini-cart support\n- Added add_cart_quantity_css\\(\\) method for dynamic CSS injection\n- Added maybe_hide_mini_cart_quantity_input\\(\\) method\n- Enhanced quantity spans with data-product-id attribute\n- Added wc-tpp-restricted-qty CSS class\n- Implemented sibling \\(+\\) and general sibling \\(~\\) CSS selectors\n\nUpdated Files:\n- includes/class-wc-tpp-cart.php \\(enhanced with mini-cart support\\)\n- wc-tier-and-package-prices.php \\(version 1.1.3\\)\n- composer.json \\(version 1.1.3\\)\n- CHANGELOG.md \\(v1.1.3 section\\)\n- All translation files \\(.pot, .po, .mo\\) updated to version 1.1.3\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>\nEOF\n\\)\")"
|
"Bash(git commit -m \"$\\(cat <<''EOF''\nRelease version 1.1.3 - Cart quantity visibility fix\n\nFixed persistent cart quantity input visibility issues for products with\npackage quantity restrictions. Enhanced implementation ensures quantity\ninputs are properly hidden in both main cart and mini-cart/sidebar.\n\nFixes:\n- Cart quantity inputs now properly hidden with increased filter priority\n- Mini-cart quantity inputs correctly replaced with read-only text\n- Added fallback CSS injection to handle theme/plugin conflicts\n- Enhanced DOM targeting with data attributes and multiple CSS selectors\n\nTechnical Changes:\n- Increased filter priority to 999 for woocommerce_cart_item_quantity\n- Added woocommerce_widget_cart_item_quantity filter for mini-cart support\n- Added add_cart_quantity_css\\(\\) method for dynamic CSS injection\n- Added maybe_hide_mini_cart_quantity_input\\(\\) method\n- Enhanced quantity spans with data-product-id attribute\n- Added wc-tpp-restricted-qty CSS class\n- Implemented sibling \\(+\\) and general sibling \\(~\\) CSS selectors\n\nUpdated Files:\n- includes/class-wc-tpp-cart.php \\(enhanced with mini-cart support\\)\n- wc-tier-and-package-prices.php \\(version 1.1.3\\)\n- composer.json \\(version 1.1.3\\)\n- CHANGELOG.md \\(v1.1.3 section\\)\n- All translation files \\(.pot, .po, .mo\\) updated to version 1.1.3\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||||
|
"Bash(git commit:*)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
CHANGELOG.md
23
CHANGELOG.md
@@ -5,6 +5,29 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.1.4] - 2025-12-21
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- WooCommerce Blocks support for quantity restrictions
|
||||||
|
- `woocommerce_store_api_product_quantity_editable` filter for block-based carts
|
||||||
|
- `block_quantity_editable()` method in WC_TPP_Cart class
|
||||||
|
- CSS targeting for `.wc-block-components-quantity-selector` elements
|
||||||
|
|
||||||
|
### Enhanced
|
||||||
|
- "View Options" button styling to match standard WooCommerce "Add to Cart" buttons
|
||||||
|
- Button padding, font weight, and border radius for better visual consistency
|
||||||
|
- Hover effects with smooth transitions
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- WooCommerce blocks cart quantity selector visibility for restricted products
|
||||||
|
- WooCommerce blocks mini-cart quantity selector visibility
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- Added Store API integration for block-based cart/mini-cart
|
||||||
|
- Enhanced CSS for block cart items with product-specific selectors
|
||||||
|
- Improved button styling with WooCommerce standard values (0.618em × 1em padding)
|
||||||
|
- Added transition effects for better UX
|
||||||
|
|
||||||
## [1.1.3] - 2025-12-21
|
## [1.1.3] - 2025-12-21
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
# WooCommerce Tier and Package Prices
|
# WooCommerce Tier and Package Prices
|
||||||
|
|
||||||
|
__THIS PROJECT IS 100% VIBE-CODED USING CLAUDE.AI__
|
||||||
|
|
||||||
A powerful WooCommerce plugin that adds tier pricing and package pricing functionality to your products with configurable quantities at fixed prices.
|
A powerful WooCommerce plugin that adds tier pricing and package pricing functionality to your products with configurable quantities at fixed prices.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|||||||
@@ -161,8 +161,15 @@ a.wc-tpp-view-options {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
line-height: 1.5;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
|
/* Match WooCommerce button styling */
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: 700;
|
||||||
|
padding: 0.618em 1em;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-radius: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.wc-tpp-view-options::before {
|
a.wc-tpp-view-options::before {
|
||||||
@@ -170,8 +177,15 @@ a.wc-tpp-view-options::before {
|
|||||||
font-family: "dashicons";
|
font-family: "dashicons";
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 1.1em;
|
font-size: 1em;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hover state for View Options button */
|
||||||
|
a.wc-tpp-view-options:hover {
|
||||||
|
opacity: 0.85;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cart quantity display for restricted products */
|
/* Cart quantity display for restricted products */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "magdev/wc-tier-package-prices",
|
"name": "magdev/wc-tier-package-prices",
|
||||||
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
||||||
"version": "1.1.3",
|
"version": "1.1.4",
|
||||||
"type": "wordpress-plugin",
|
"type": "wordpress-plugin",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"authors": [
|
"authors": [
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ class WC_TPP_Cart {
|
|||||||
add_filter('woocommerce_cart_item_quantity', array($this, 'maybe_hide_cart_quantity_input'), 999, 3);
|
add_filter('woocommerce_cart_item_quantity', array($this, 'maybe_hide_cart_quantity_input'), 999, 3);
|
||||||
add_filter('woocommerce_widget_cart_item_quantity', array($this, 'maybe_hide_mini_cart_quantity_input'), 999, 3);
|
add_filter('woocommerce_widget_cart_item_quantity', array($this, 'maybe_hide_mini_cart_quantity_input'), 999, 3);
|
||||||
add_action('wp_head', array($this, 'add_cart_quantity_css'));
|
add_action('wp_head', array($this, 'add_cart_quantity_css'));
|
||||||
|
|
||||||
|
// WooCommerce Blocks support
|
||||||
|
add_filter('woocommerce_store_api_product_quantity_editable', array($this, 'block_quantity_editable'), 10, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function apply_tier_package_pricing($cart) {
|
public function apply_tier_package_pricing($cart) {
|
||||||
@@ -204,15 +207,45 @@ class WC_TPP_Cart {
|
|||||||
if (!empty($restricted_products)) {
|
if (!empty($restricted_products)) {
|
||||||
echo '<style type="text/css">';
|
echo '<style type="text/css">';
|
||||||
foreach ($restricted_products as $product_id) {
|
foreach ($restricted_products as $product_id) {
|
||||||
// Hide quantity inputs for restricted products in cart
|
// Hide quantity inputs for restricted products in cart (classic cart)
|
||||||
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
||||||
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity,';
|
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity,';
|
||||||
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
||||||
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity { display: none !important; }';
|
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity { display: none !important; }';
|
||||||
|
|
||||||
|
// Hide WooCommerce blocks quantity selector for restricted products
|
||||||
|
echo '.wc-block-cart-item[data-product-id="' . esc_attr($product_id) . '"] .wc-block-components-quantity-selector,';
|
||||||
|
echo '.wc-block-mini-cart__items .wc-block-cart-item[data-product-id="' . esc_attr($product_id) . '"] .wc-block-components-quantity-selector { display: none !important; }';
|
||||||
}
|
}
|
||||||
echo '</style>';
|
echo '</style>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make quantity non-editable for restricted products in WooCommerce blocks
|
||||||
|
*
|
||||||
|
* @param bool $editable Whether the quantity is editable
|
||||||
|
* @param array $cart_item Cart item data
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function block_quantity_editable($editable, $cart_item) {
|
||||||
|
$product_id = $cart_item['id'] ?? ($cart_item['product_id'] ?? 0);
|
||||||
|
|
||||||
|
if (!$product_id) {
|
||||||
|
return $editable;
|
||||||
|
}
|
||||||
|
|
||||||
|
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||||
|
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||||
|
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||||
|
|
||||||
|
// If restriction is enabled and packages exist, make quantity non-editable
|
||||||
|
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $editable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Cart();
|
new WC_TPP_Cart();
|
||||||
|
|||||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
|||||||
# This file is distributed under the GPL v2 or later.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.3\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.4\n"
|
||||||
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
|
|||||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
|||||||
# This file is distributed under the GPL v2 or later.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.3\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.4\n"
|
||||||
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
|
|||||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
|||||||
# This file is distributed under the GPL v2 or later.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.3\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.4\n"
|
||||||
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# This file is distributed under the GPL v2 or later.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.3\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.4\n"
|
||||||
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
|
|||||||
339
releases/RELEASE-INFO-1.1.3.md
Normal file
339
releases/RELEASE-INFO-1.1.3.md
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
# WooCommerce Tier and Package Prices - Release 1.1.3
|
||||||
|
|
||||||
|
**Release Date:** December 21, 2025
|
||||||
|
**Version:** 1.1.3
|
||||||
|
**Package Size:** 394 KB
|
||||||
|
**Git Tag:** v1.1.3
|
||||||
|
|
||||||
|
## Download
|
||||||
|
|
||||||
|
**File:** `wc-tier-and-package-prices-1.1.3.zip`
|
||||||
|
|
||||||
|
### Checksums
|
||||||
|
|
||||||
|
**SHA256:**
|
||||||
|
```
|
||||||
|
7938542680b71a7b73269c96a4dff78f2222ac8409092011c5e40e97a5e465aa
|
||||||
|
```
|
||||||
|
|
||||||
|
**MD5:**
|
||||||
|
```
|
||||||
|
dfec91be7e375b09613ba81cfebbe013
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's New in 1.1.3
|
||||||
|
|
||||||
|
This is a **bug fix release** that resolves cart quantity input visibility issues for products with package quantity restrictions.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- **Cart Quantity Input Visibility** - FIXED
|
||||||
|
- Cart quantity inputs now properly hidden with increased filter priority (999)
|
||||||
|
- Mini-cart/sidebar quantity inputs correctly replaced with read-only text
|
||||||
|
- Added fallback CSS injection to handle theme/plugin conflicts
|
||||||
|
- Enhanced DOM targeting with data attributes and multiple CSS selectors
|
||||||
|
|
||||||
|
### Technical Enhancements
|
||||||
|
- Increased filter priority from 10 to 999 for `woocommerce_cart_item_quantity`
|
||||||
|
- Added `woocommerce_widget_cart_item_quantity` filter for mini-cart support
|
||||||
|
- Added `add_cart_quantity_css()` method for dynamic CSS injection
|
||||||
|
- Added `maybe_hide_mini_cart_quantity_input()` method in WC_TPP_Cart class
|
||||||
|
- Enhanced quantity spans with `data-product-id` attribute for targeted CSS
|
||||||
|
- Added `wc-tpp-restricted-qty` CSS class for improved targeting
|
||||||
|
- Implemented both sibling (+) and general sibling (~) CSS selectors for various DOM structures
|
||||||
|
|
||||||
|
## Problem Solved
|
||||||
|
|
||||||
|
**Issue:** In version 1.1.1 and 1.1.2, cart quantity inputs were still visible in the main cart and mini-cart/sidebar for products with package quantity restrictions, despite the feature being implemented.
|
||||||
|
|
||||||
|
**Root Cause:**
|
||||||
|
1. Filter priority was too low (10), allowing other plugins to override
|
||||||
|
2. Mini-cart used different filter hook (`woocommerce_widget_cart_item_quantity`)
|
||||||
|
3. Some themes/plugins had DOM structures that prevented proper hiding
|
||||||
|
4. No fallback mechanism for edge cases
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
1. Increased filter priority to 999 to ensure execution after other plugins
|
||||||
|
2. Added separate filter for mini-cart quantity display
|
||||||
|
3. Implemented dynamic CSS injection as fallback for all edge cases
|
||||||
|
4. Used data attributes for product-specific CSS targeting
|
||||||
|
5. Applied multiple CSS selectors (sibling + general sibling) to handle DOM variations
|
||||||
|
|
||||||
|
## What's Changed
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Cart quantity input visibility issue in cart and cart sidebar for restricted products
|
||||||
|
- Enhanced filter priority (999) to ensure quantity hiding runs after other plugins
|
||||||
|
- Mini-cart quantity input now properly hidden for restricted products
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- `woocommerce_widget_cart_item_quantity` filter support for mini-cart
|
||||||
|
- `add_cart_quantity_css()` method for dynamic CSS injection
|
||||||
|
- `data-product-id` attribute to quantity spans for targeted CSS selectors
|
||||||
|
- CSS class `wc-tpp-restricted-qty` for improved targeting
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- Increased filter priority from 10 to 999 for `woocommerce_cart_item_quantity`
|
||||||
|
- Added `maybe_hide_mini_cart_quantity_input()` method in WC_TPP_Cart class
|
||||||
|
- Dynamic CSS injection via `wp_head` action as fallback
|
||||||
|
- Used both sibling (+) and general sibling (~) CSS selectors for DOM variations
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### New Installation
|
||||||
|
|
||||||
|
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.3.zip`
|
||||||
|
2. Log in to your WordPress admin panel
|
||||||
|
3. Navigate to **Plugins > Add New > Upload Plugin**
|
||||||
|
4. Choose the downloaded ZIP file
|
||||||
|
5. Click **Install Now**
|
||||||
|
6. After installation, click **Activate Plugin**
|
||||||
|
7. Go to **WooCommerce > Settings > Tier & Package Prices** to configure
|
||||||
|
|
||||||
|
### Upgrade from 1.1.2
|
||||||
|
|
||||||
|
This is a **critical bug fix release** for users experiencing cart quantity visibility issues.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate version 1.1.2
|
||||||
|
2. Upload and activate version 1.1.3
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. Cart quantity inputs will now be properly hidden for restricted products
|
||||||
|
5. No additional configuration required
|
||||||
|
|
||||||
|
### Upgrade from 1.1.1 or Earlier
|
||||||
|
|
||||||
|
Safe to upgrade directly. This version includes all features from v1.1.0, v1.1.1, and v1.1.2 plus the cart quantity visibility fix.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate the current version
|
||||||
|
2. Upload and activate version 1.1.3
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. Cart quantity restriction feature now works correctly across all touchpoints
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- **WordPress:** 6.0 or higher
|
||||||
|
- **PHP:** 7.4 or higher
|
||||||
|
- **WooCommerce:** 8.0 or higher
|
||||||
|
|
||||||
|
## Complete Package Restriction Feature (v1.1.0 + v1.1.1 + v1.1.2 + v1.1.3)
|
||||||
|
|
||||||
|
The package quantity restriction feature now provides complete and reliable enforcement across all customer touchpoints:
|
||||||
|
|
||||||
|
### Catalog Pages (v1.1.2)
|
||||||
|
- ✅ "View Options" button instead of "Add to Cart" for restricted products
|
||||||
|
- ✅ Eye icon for visual distinction
|
||||||
|
- ✅ Direct link to product page
|
||||||
|
- ✅ Prevents invalid add-to-cart attempts from shop/category pages
|
||||||
|
|
||||||
|
### Product Page (v1.1.0)
|
||||||
|
- ✅ Quantity field automatically hidden when restriction enabled
|
||||||
|
- ✅ "Choose a package size below" notice displayed
|
||||||
|
- ✅ Visual package selection with highlighted states
|
||||||
|
- ✅ JavaScript validation prevents form submission without package selection
|
||||||
|
|
||||||
|
### Add to Cart Validation (v1.1.0)
|
||||||
|
- ✅ Server-side validation on add-to-cart
|
||||||
|
- ✅ User-friendly error messages showing available package sizes
|
||||||
|
- ✅ Prevents manual quantity manipulation via form fields
|
||||||
|
|
||||||
|
### Cart Page (v1.1.1 + v1.1.3 - FIXED)
|
||||||
|
- ✅ Quantity field hidden/replaced with read-only text
|
||||||
|
- ✅ Prevents cart quantity modification
|
||||||
|
- ✅ Consistent restriction enforcement
|
||||||
|
- ✅ No bypass via cart updates
|
||||||
|
- ✅ Works with all themes and plugins (high priority filters + CSS fallback)
|
||||||
|
- ✅ Mini-cart/sidebar properly handled
|
||||||
|
|
||||||
|
### Settings
|
||||||
|
- ✅ Global setting to enable restrictions site-wide
|
||||||
|
- ✅ Per-product override for individual products
|
||||||
|
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
|
||||||
|
|
||||||
|
## Technical Implementation Details
|
||||||
|
|
||||||
|
### Cart Quantity Hiding Strategy (v1.1.3)
|
||||||
|
|
||||||
|
The implementation uses a multi-layered approach to ensure reliability:
|
||||||
|
|
||||||
|
**Layer 1: Filter Replacement**
|
||||||
|
```php
|
||||||
|
// High priority (999) to run after other plugins
|
||||||
|
add_filter('woocommerce_cart_item_quantity', 'maybe_hide_cart_quantity_input', 999, 3);
|
||||||
|
add_filter('woocommerce_widget_cart_item_quantity', 'maybe_hide_mini_cart_quantity_input', 999, 3);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Layer 2: HTML Replacement**
|
||||||
|
Replace quantity input with read-only span:
|
||||||
|
```php
|
||||||
|
sprintf('<span class="wc-tpp-cart-quantity wc-tpp-restricted-qty" data-product-id="%d">%s</span>',
|
||||||
|
$product_id,
|
||||||
|
$cart_item['quantity']
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Layer 3: CSS Fallback**
|
||||||
|
Dynamic CSS injection for edge cases:
|
||||||
|
```php
|
||||||
|
.cart_item .wc-tpp-restricted-qty[data-product-id="123"] + .quantity,
|
||||||
|
.cart_item .wc-tpp-restricted-qty[data-product-id="123"] ~ .quantity {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This three-layer approach ensures cart quantity inputs are hidden regardless of theme, plugin conflicts, or DOM structure variations.
|
||||||
|
|
||||||
|
## Modified Files in 1.1.3
|
||||||
|
|
||||||
|
### Core Files Updated
|
||||||
|
- `wc-tier-and-package-prices.php` - Version updated to 1.1.3
|
||||||
|
- `composer.json` - Version updated to 1.1.3
|
||||||
|
- `CHANGELOG.md` - Added v1.1.3 section
|
||||||
|
|
||||||
|
### PHP Classes Modified
|
||||||
|
- `includes/class-wc-tpp-cart.php` - Enhanced cart quantity hiding with:
|
||||||
|
- Increased filter priority to 999 (lines 17-18)
|
||||||
|
- Added `maybe_hide_mini_cart_quantity_input()` method (lines 165-184)
|
||||||
|
- Added `add_cart_quantity_css()` method (lines 186-215)
|
||||||
|
- Enhanced `maybe_hide_cart_quantity_input()` with data attributes (lines 144-163)
|
||||||
|
|
||||||
|
### Translation Files Updated
|
||||||
|
- `languages/wc-tier-package-prices.pot` - Version updated to 1.1.3
|
||||||
|
- `languages/wc-tier-package-prices-en_US.po` - Version updated to 1.1.3
|
||||||
|
- `languages/wc-tier-package-prices-de_DE.po` - Version updated to 1.1.3
|
||||||
|
- `languages/wc-tier-package-prices-de_CH_informal.po` - Version updated to 1.1.3
|
||||||
|
- All `.mo` files recompiled
|
||||||
|
|
||||||
|
## Complete Feature Set
|
||||||
|
|
||||||
|
### Tier Pricing
|
||||||
|
- ✅ Quantity-based discount tiers
|
||||||
|
- ✅ Automatic price calculation
|
||||||
|
- ✅ Volume discount display
|
||||||
|
|
||||||
|
### Package Pricing
|
||||||
|
- ✅ Fixed-price bundles
|
||||||
|
- ✅ Custom package labels
|
||||||
|
- ✅ Multiple package options per product
|
||||||
|
- ✅ Quantity restriction to packages only (v1.1.0)
|
||||||
|
- ✅ Cart quantity enforcement (v1.1.1 + v1.1.3 - FIXED)
|
||||||
|
- ✅ Catalog button modification (v1.1.2)
|
||||||
|
|
||||||
|
### Admin Features
|
||||||
|
- ✅ WooCommerce Settings integration
|
||||||
|
- ✅ Easy-to-use product meta boxes
|
||||||
|
- ✅ Configurable display positions
|
||||||
|
- ✅ Native WooCommerce UI
|
||||||
|
- ✅ Global restriction setting
|
||||||
|
- ✅ Per-product restriction override
|
||||||
|
|
||||||
|
### Frontend Features
|
||||||
|
- ✅ Beautiful pricing tables (Twig templates)
|
||||||
|
- ✅ Real-time cart updates
|
||||||
|
- ✅ Responsive design
|
||||||
|
- ✅ 3 languages supported
|
||||||
|
- ✅ Package-only selection mode
|
||||||
|
- ✅ Automatic quantity field hiding (product page & cart)
|
||||||
|
- ✅ Visual package selection
|
||||||
|
- ✅ Read-only cart quantity display (FIXED in v1.1.3)
|
||||||
|
- ✅ Catalog "View Options" button
|
||||||
|
|
||||||
|
### Validation & Security
|
||||||
|
- ✅ Client-side JavaScript validation
|
||||||
|
- ✅ Server-side cart validation
|
||||||
|
- ✅ Cart quantity bypass prevention (FIXED in v1.1.3)
|
||||||
|
- ✅ Catalog add-to-cart prevention
|
||||||
|
- ✅ User-friendly error messages
|
||||||
|
- ✅ WooCommerce HPOS compatible
|
||||||
|
- ✅ Theme/plugin conflict resistant (v1.1.3)
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
**None.** This release is fully backward compatible with v1.1.2, v1.1.1, v1.1.0 and v1.0.x.
|
||||||
|
|
||||||
|
## Migration Notes
|
||||||
|
|
||||||
|
### From 1.1.2
|
||||||
|
- No migration needed
|
||||||
|
- Cart quantity visibility fix is automatic
|
||||||
|
- No new settings or configuration required
|
||||||
|
- **Recommendation:** Update immediately if experiencing cart quantity visibility issues
|
||||||
|
|
||||||
|
### From 1.1.1
|
||||||
|
- All v1.1.2 and v1.1.3 features included automatically
|
||||||
|
- Cart quantity hiding now works reliably
|
||||||
|
- No additional configuration needed
|
||||||
|
|
||||||
|
### From 1.1.0 or Earlier
|
||||||
|
- All v1.1.1, v1.1.2, and v1.1.3 features included automatically
|
||||||
|
- Restriction features remain disabled by default
|
||||||
|
- Must be explicitly enabled in settings
|
||||||
|
|
||||||
|
### Settings Location
|
||||||
|
All settings remain in: **WooCommerce > Settings > Tier & Package Prices**
|
||||||
|
|
||||||
|
### Data Preservation
|
||||||
|
- All existing tier pricing data preserved
|
||||||
|
- All existing package pricing data preserved
|
||||||
|
- All product meta data preserved
|
||||||
|
- No database changes required
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
### Current Version
|
||||||
|
1. Restriction only works when packages are defined
|
||||||
|
2. Cannot restrict to tier quantities (only packages)
|
||||||
|
3. Restriction applies to entire product (no variation-level control)
|
||||||
|
4. Cart quantity is read-only text (not a dropdown of package options)
|
||||||
|
5. "View Options" button uses standard WooCommerce button styling
|
||||||
|
|
||||||
|
### Future Enhancements
|
||||||
|
These features may be added in future versions:
|
||||||
|
- Customizable "View Options" button text
|
||||||
|
- Cart package quantity dropdown selector
|
||||||
|
- Variation-level restriction control
|
||||||
|
- Restrict to tier quantities option
|
||||||
|
- Minimum/maximum package selection limits
|
||||||
|
|
||||||
|
## Changelog Summary
|
||||||
|
|
||||||
|
### Version History
|
||||||
|
- **v1.1.3** (2025-12-21) - Cart quantity visibility bug fix
|
||||||
|
- **v1.1.2** (2025-12-21) - Catalog button modification
|
||||||
|
- **v1.1.1** (2025-12-21) - Cart quantity bypass fix
|
||||||
|
- **v1.1.0** (2025-12-21) - Package quantity restriction feature
|
||||||
|
- **v1.0.2** (2025-12-21) - WooCommerce Settings integration
|
||||||
|
- **v1.0.1** (2025-12-21) - Twig template engine integration
|
||||||
|
- **v1.0.0** (2025-12-21) - Initial release
|
||||||
|
|
||||||
|
## User Impact
|
||||||
|
|
||||||
|
### Before v1.1.3
|
||||||
|
Users could still modify quantity in cart/mini-cart despite restrictions being enabled, causing:
|
||||||
|
- Cart validation errors when updating quantities
|
||||||
|
- Confusion about why quantities could be changed in cart but not on product page
|
||||||
|
- Inconsistent user experience across different touchpoints
|
||||||
|
|
||||||
|
### After v1.1.3
|
||||||
|
- Quantity inputs consistently hidden/disabled across all cart views
|
||||||
|
- Clear read-only quantity display
|
||||||
|
- No cart update errors
|
||||||
|
- Consistent user experience
|
||||||
|
- Works reliably with all themes and plugins
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
- **Documentation:** See README.md and CHANGELOG.md
|
||||||
|
- **Previous Release:** See RELEASE-INFO-1.1.2.md
|
||||||
|
- **Issues:** https://src.bundespruefstelle.ch/wc-tier-package-prices/issues
|
||||||
|
- **Author:** Marco Graetsch
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
GPL v2 or later - https://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Production Ready:** This package includes optimized autoloader and no development dependencies.
|
||||||
|
|
||||||
|
**Critical Update:** Version 1.1.3 is a critical bug fix for users experiencing cart quantity visibility issues with restricted products. Update recommended for all users using package quantity restrictions.
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.3.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.3.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.3.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.3.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dfec91be7e375b09613ba81cfebbe013 wc-tier-and-package-prices-1.1.3.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.3.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.3.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7938542680b71a7b73269c96a4dff78f2222ac8409092011c5e40e97a5e465aa wc-tier-and-package-prices-1.1.3.zip
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
* Plugin Name: WooCommerce Tier and Package Prices
|
* Plugin Name: WooCommerce Tier and Package Prices
|
||||||
* Plugin URI: https://src.bundespruefstelle.ch/wc-tier-package-prices
|
* Plugin URI: https://src.bundespruefstelle.ch/wc-tier-package-prices
|
||||||
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
|
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
|
||||||
* Version: 1.1.3
|
* Version: 1.1.4
|
||||||
* Author: Marco Graetsch
|
* Author: Marco Graetsch
|
||||||
* Author URI: https://src.bundespruefstelle.ch/magdev
|
* Author URI: https://src.bundespruefstelle.ch/magdev
|
||||||
* Text Domain: wc-tier-package-prices
|
* Text Domain: wc-tier-package-prices
|
||||||
@@ -22,7 +22,7 @@ if (!defined('ABSPATH')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Define plugin constants
|
// Define plugin constants
|
||||||
define('WC_TPP_VERSION', '1.1.3');
|
define('WC_TPP_VERSION', '1.1.4');
|
||||||
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||||
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||||
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
||||||
|
|||||||
Reference in New Issue
Block a user