Release version 1.1.7 - Enhanced user experience features

Added three new customer-facing features to improve product page interaction
and tier pricing functionality.

Features:
- Optional text labels for tier pricing (similar to package labels)
- Clickable tier pricing table rows to auto-populate quantity field
- Add to Cart button auto-disables when quantity is 0 or less

Enhanced User Experience:
- Tier pricing rows now clickable with cursor pointer and hover animation
- Clicking tier row sets quantity and smoothly scrolls to quantity field
- Add to Cart button shows disabled state with reduced opacity
- Tier labels display below quantity in italic gray text

Technical Changes:
- Added optional 'label' field to tier pricing admin meta box
- Updated tier save logic to include label field (sanitized)
- Enhanced tier pricing frontend template to display labels
- Added click handler for tier pricing rows in frontend.js
- Added updateAddToCartButton() function to manage button state
- CSS: .wc-tpp-tier-label styling for tier labels
- CSS: Clickable cursor and hover transform for tier rows
- CSS: Disabled button styling (.single_add_to_cart_button:disabled)

Updated Files:
- templates/admin/tier-row.twig (added label field)
- includes/class-wc-tpp-product-meta.php (save label, template update)
- templates/frontend/tier-pricing-table.twig (display labels)
- assets/js/frontend.js (tier row clicks, button disable logic)
- assets/css/frontend.css (tier label style, clickable rows, disabled button)
- wc-tier-and-package-prices.php (version 1.1.7)
- composer.json (version 1.1.7)
- CHANGELOG.md (v1.1.7 section)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-22 00:15:48 +01:00
parent e2a11de80a
commit af532b56eb
13 changed files with 454 additions and 8 deletions

View File

@@ -19,7 +19,8 @@
"Bash(do msgfmt -o \"$po%.po.mo\" \"$po\")",
"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:*)"
"Bash(git commit:*)",
"Bash(node -c:*)"
]
}
}

View File

@@ -5,6 +5,33 @@ 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/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.1.7] - 2025-12-22
### Added
- Optional text labels for tier pricing (similar to package labels)
- Clickable tier pricing rows that auto-populate quantity field
- Add to Cart button auto-disable when quantity is 0 or less
### Enhanced
- Tier pricing table rows now clickable with visual hover feedback
- Clicking a tier row sets quantity to that tier's minimum quantity
- Smooth scroll animation to quantity field when tier is clicked
- Add to Cart button disabled state with visual feedback (opacity, cursor)
- Tier labels display below quantity in frontend table (italic, gray text)
### Technical Details
- Added optional `label` field to tier pricing meta box (admin/tier-row.twig)
- Updated tier save logic to store label field (class-wc-tpp-product-meta.php)
- Enhanced tier pricing template to display labels (frontend/tier-pricing-table.twig)
- Added click handler for tier rows (assets/js/frontend.js)
- Added `updateAddToCartButton()` function to manage button state
- CSS: `.wc-tpp-tier-label` styling for tier labels
- CSS: Clickable cursor and hover animation for tier rows
- CSS: Disabled button styling (`.single_add_to_cart_button:disabled`)
## [1.1.6] - 2025-12-21
### Fixed

View File

@@ -50,11 +50,13 @@
.wc-tpp-table tbody tr {
border-bottom: 1px solid #e0e0e0;
transition: background-color 0.2s;
transition: all 0.2s;
cursor: pointer;
}
.wc-tpp-table tbody tr:hover {
background: #f5f5f5;
transform: translateX(2px);
}
.wc-tpp-table tbody tr.wc-tpp-active-tier {
@@ -67,6 +69,14 @@
font-size: 0.95em;
}
.wc-tpp-tier-label {
display: inline-block;
margin-top: 4px;
color: #666;
font-style: italic;
font-size: 0.9em;
}
/* Package pricing */
.wc-tpp-packages {
display: grid;
@@ -209,6 +219,14 @@ a.wc-tpp-view-options:hover {
font-size: 0.95em;
}
/* Disabled add to cart button */
.single_add_to_cart_button.disabled,
.single_add_to_cart_button:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
/* Responsive design */
@media (max-width: 768px) {
.wc-tpp-packages {

View File

@@ -8,6 +8,7 @@
$(document).ready(function() {
const $quantityInput = $('input.qty');
const $priceDisplay = $('.woocommerce-Price-amount.amount').first();
const $addToCartButton = $('.single_add_to_cart_button');
const isRestrictedMode = $('.wc-tpp-package-pricing-table').hasClass('wc-tpp-restricted-mode');
if ($quantityInput.length === 0 && !isRestrictedMode) {
@@ -154,9 +155,35 @@
$('.wc-tpp-price-message').remove();
}
// Toggle add to cart button state based on quantity
function updateAddToCartButton() {
const quantity = parseInt($quantityInput.val()) || 0;
if (quantity <= 0) {
$addToCartButton.prop('disabled', true).addClass('disabled');
} else {
$addToCartButton.prop('disabled', false).removeClass('disabled');
}
}
// Handle quantity input changes
$quantityInput.on('input change', function() {
updatePriceDisplay();
updateAddToCartButton();
});
// Handle tier pricing row clicks
$('.wc-tpp-tier-pricing-table tbody tr').on('click', function() {
const minQty = parseInt($(this).data('min-qty'));
if ($quantityInput.length > 0 && !isRestrictedMode) {
$quantityInput.val(minQty).trigger('change');
// Scroll to quantity input for better UX
$('html, body').animate({
scrollTop: $quantityInput.offset().top - 100
}, 300);
}
});
// Handle package selection
@@ -212,6 +239,11 @@
if (!isRestrictedMode) {
updatePriceDisplay();
}
// Initial button state check
if ($quantityInput.length > 0 && $addToCartButton.length > 0) {
updateAddToCartButton();
}
});
})(jQuery);

View File

@@ -1,7 +1,7 @@
{
"name": "magdev/wc-tier-package-prices",
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
"version": "1.1.6",
"version": "1.1.7",
"type": "wordpress-plugin",
"license": "GPL-2.0-or-later",
"authors": [

View File

@@ -81,7 +81,7 @@ class WC_TPP_Product_Meta {
</div>
<script type="text/html" id="wc-tpp-tier-row-template">
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '')); ?>
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '', 'label' => '')); ?>
</script>
<script type="text/html" id="wc-tpp-package-row-template">
@@ -127,7 +127,8 @@ class WC_TPP_Product_Meta {
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
$tiers[] = array(
'min_qty' => absint($tier['min_qty']),
'price' => wc_format_decimal($tier['price'])
'price' => wc_format_decimal($tier['price']),
'label' => sanitize_text_field($tier['label'] ?? '')
);
}
}

View File

@@ -0,0 +1,352 @@
# WooCommerce Tier and Package Prices - Release 1.1.6
**Release Date:** December 22, 2025
**Version:** 1.1.6
**Package Size:** 54 KB
**Git Tag:** v1.1.6
## Download
**File:** `wc-tier-and-package-prices-1.1.6.zip`
### Checksums
**SHA256:**
```
730e366764449ac963bc85848ac8a91f654e4b35500ed3132a280ab4f215c80c
```
**MD5:**
```
dbea10acffdc849f9aa387d128cb6d6e
```
## What's New in 1.1.6
This is a **critical bug fix release** that resolves fatal errors introduced in versions 1.1.3, 1.1.4, and 1.1.5 during plugin activation.
### Critical Fixes
- **Plugin Activation Fatal Error** - FIXED
- Fatal error caused by premature class instantiation before WooCommerce is loaded
- Removed immediate class instantiation from `class-wc-tpp-cart.php` and `class-wc-tpp-frontend.php`
- Ensures WooCommerce is fully loaded before registering hooks that depend on WC functions
### Technical Changes
- Moved `WC_TPP_Cart` and `WC_TPP_Frontend` instantiation to `woocommerce_loaded` hook
- Added `init_classes()` method to main plugin class for controlled class initialization
- Fixed hook registration timing to prevent accessing WooCommerce before it's available
## What Was Fixed
### The Problem (v1.1.3, v1.1.4, v1.1.5)
The previous three versions had a critical bug that caused fatal errors during plugin activation:
**Error Message:**
```
Fatal error: Call to undefined function WC()
Fatal error: Call to undefined function is_cart()
Fatal error: Call to undefined function is_checkout()
```
**Root Cause:**
- Classes `WC_TPP_Cart` and `WC_TPP_Frontend` were instantiated immediately in their files
- These classes register hooks that call WooCommerce functions (`WC()`, `is_cart()`, etc.)
- During plugin activation, these files are included before WooCommerce is loaded
- Hook registration attempts to call undefined WooCommerce functions
- Result: Fatal error and plugin activation failure
**Impact:**
- Plugin could not be activated on fresh installations
- Plugin could not be updated from v1.1.2 or earlier
- Affected all users attempting to install/update in v1.1.3-v1.1.5
### The Solution (v1.1.6)
**Before (v1.1.3-v1.1.5):**
```php
// At bottom of class-wc-tpp-cart.php and class-wc-tpp-frontend.php
new WC_TPP_Cart(); // Instantiated immediately!
new WC_TPP_Frontend(); // Instantiated immediately!
```
**After (v1.1.6):**
```php
// In main plugin file (wc-tier-and-package-prices.php)
private function includes() {
// ... require files ...
// Instantiate classes AFTER WooCommerce is loaded
add_action('woocommerce_loaded', array($this, 'init_classes'));
}
public function init_classes() {
new WC_TPP_Frontend();
new WC_TPP_Cart();
}
```
**Why This Works:**
1. Class files are required but not instantiated during `includes()`
2. Main plugin hooks into `woocommerce_loaded` action
3. WooCommerce fully loads and defines all functions
4. `init_classes()` is called, safely instantiating classes
5. All WooCommerce functions are available when hooks are registered
## Affected Versions
### Broken Versions
-**v1.1.3** - Plugin activation fatal error
-**v1.1.4** - Plugin activation fatal error
-**v1.1.5** - Plugin activation fatal error (attempted fix failed)
### Fixed Versions
-**v1.1.6** - Plugin activation works correctly
-**v1.1.2** - No activation issues (last working version before bug)
## Installation
### New Installation
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.6.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.5, 1.1.4, or 1.1.3
This is a **critical bug fix release**. If you have v1.1.3, v1.1.4, or v1.1.5 installed and working, upgrade to v1.1.6 immediately.
**Important Notes:**
- If your current version is **working**, you likely installed it on a site where WooCommerce was already active
- The bug only manifests during fresh activation or when upgrading with the plugin deactivated
- Upgrade is safe and preserves all settings and data
**Steps:**
1. Deactivate current version (if active)
2. Delete the plugin from WordPress admin
3. Upload and activate version 1.1.6
4. All existing settings and data will be automatically preserved
5. No additional configuration required
### Upgrade from 1.1.2 or Earlier
Safe to upgrade directly. This version includes all features from v1.1.0, v1.1.1, and v1.1.2, plus the critical activation fix.
**Steps:**
1. Deactivate the current version
2. Upload and activate version 1.1.6
3. All existing settings and data will be automatically preserved
4. Enjoy all new features with working activation
### Can't Activate v1.1.3, v1.1.4, or v1.1.5?
If you downloaded v1.1.3, v1.1.4, or v1.1.5 and cannot activate it, **use v1.1.6 instead**.
**Steps:**
1. Delete the broken version from WordPress admin (if present)
2. Download `wc-tier-and-package-prices-1.1.6.zip`
3. Upload and activate version 1.1.6
4. Configuration and setup will work correctly
### Requirements
- **WordPress:** 6.0 or higher
- **PHP:** 7.4 or higher
- **WooCommerce:** 8.0 or higher (must be installed and activated)
## What Features Are Included
Version 1.1.6 includes **all features** from v1.1.0 through v1.1.4, with the critical activation bug fixed:
### Complete Package Restriction Feature
- ✅ Catalog pages: "View Options" button (v1.1.2 + v1.1.4 enhanced styling)
- ✅ Product page: Quantity field hiding and package selection (v1.1.0)
- ✅ Add to cart: Server-side validation (v1.1.0)
- ✅ Classic cart: Quantity field hiding (v1.1.1 + v1.1.3 fixes)
- ✅ WooCommerce Blocks: Cart and mini-cart support (v1.1.4)
- ✅ All features now work with correct activation (v1.1.6)
### Settings
- ✅ Global setting to enable restrictions site-wide
- ✅ Per-product override for individual products
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
## Modified Files in 1.1.6
### Core Files Updated
- `wc-tier-and-package-prices.php`:
- Added `init_classes()` method (lines 86-89)
- Modified `includes()` to defer class instantiation (line 83)
- No version number change (remains 1.1.6)
### PHP Classes Modified
- `includes/class-wc-tpp-cart.php`:
- Removed immediate instantiation (removed `new WC_TPP_Cart();` from bottom)
- `includes/class-wc-tpp-frontend.php`:
- Removed immediate instantiation (removed `new WC_TPP_Frontend();` from bottom)
### No Other Changes
- All functionality remains identical to v1.1.4
- No CSS changes
- No JavaScript changes
- No template changes
- No translation changes
- No feature changes
## 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)
- ✅ Catalog button modification (v1.1.2 + v1.1.4 enhanced)
- ✅ WooCommerce Blocks support (v1.1.4)
- ✅ Working plugin activation (v1.1.6 - FIXED)
### 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
- ✅ Professional "View Options" button (v1.1.4 enhanced)
- ✅ WooCommerce Blocks compatibility (v1.1.4)
### Validation & Security
- ✅ Client-side JavaScript validation
- ✅ Server-side cart validation
- ✅ Cart quantity bypass prevention
- ✅ Catalog add-to-cart prevention
- ✅ Store API integration (v1.1.4)
- ✅ User-friendly error messages
- ✅ WooCommerce HPOS compatible
- ✅ Theme/plugin conflict resistant
- ✅ WooCommerce Blocks compatible (v1.1.4)
- ✅ Proper plugin activation (v1.1.6 - FIXED)
## Breaking Changes
**None.** This release is fully backward compatible with v1.1.2 and all v1.0.x versions.
### About v1.1.3, v1.1.4, v1.1.5
These versions had activation bugs and should not be used. If you have them installed and working, upgrade to v1.1.6 for stability.
## Migration Notes
### From 1.1.5, 1.1.4, or 1.1.3
- Immediate upgrade recommended (critical bug fix)
- No functionality changes, only activation fix
- All settings preserved
- No configuration needed
### From 1.1.2 or Earlier
- All v1.1.0+ features included automatically
- Restriction features remain as configured
- WooCommerce Blocks now fully supported
- Plugin activation now works correctly
### 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 inherits theme colors (not customizable separately)
### Future Enhancements
These features may be added in future versions:
- Customizable "View Options" button text and colors
- 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.6** (2025-12-22) - Critical fix for plugin activation
- **v1.1.5** (2025-12-21) - Critical bug fix attempt (incomplete)
- **v1.1.4** (2025-12-21) - WooCommerce Blocks support + improved button styling
- **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.6
- Unable to activate plugin on fresh installations
- Unable to update from v1.1.2 or earlier with plugin deactivated
- Fatal errors during activation process
- Plugin unusable for new users
### After v1.1.6
- Plugin activates correctly on all WordPress installations
- Safe updates from any previous version
- All features work as intended
- Production ready for all users
## Recommendation
### For New Users
-**Use v1.1.6** - Latest stable version with all features and working activation
### For Users on v1.1.5, v1.1.4, or v1.1.3
- ⚠️ **Upgrade to v1.1.6** - Critical bug fix for stability
### For Users on v1.1.2 or Earlier
-**Upgrade to v1.1.6** - Get all new features plus stable activation
## Support
- **Documentation:** See README.md and CHANGELOG.md
- **Previous Release:** See RELEASE-INFO-1.1.4.md
- **Issues:** https://src.bundespruefstelle.ch/magdev/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.6 is a **critical update** for anyone on v1.1.3, v1.1.4, or v1.1.5. The plugin activation bug is now fixed and all features work correctly.

Binary file not shown.

View File

@@ -0,0 +1 @@
dbea10acffdc849f9aa387d128cb6d6e wc-tier-and-package-prices-1.1.6.zip

View File

@@ -0,0 +1 @@
730e366764449ac963bc85848ac8a91f654e4b35500ed3132a280ab4f215c80c wc-tier-and-package-prices-1.1.6.zip

View File

@@ -24,5 +24,13 @@
placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
class="short wc_input_price">
</p>
<p class="form-field">
<label>{{ 'Label (Optional)'|__('wc-tier-package-prices') }}</label>
<input type="text"
name="_wc_tpp_tiers[{{ index|esc_attr }}][label]"
value="{{ tier.label|default('')|esc_attr }}"
placeholder="{{ 'e.g., Wholesale'|__('wc-tier-package-prices') }}"
class="short">
</p>
<button type="button" class="button wc-tpp-remove-tier">{{ 'Remove'|__('wc-tier-package-prices') }}</button>
</div>

View File

@@ -25,7 +25,12 @@
{% set savings_percent = (savings / regular_price) * 100 %}
{% endif %}
<tr data-min-qty="{{ tier.min_qty|esc_attr }}" data-price="{{ tier.price|esc_attr }}">
<td>{{ tier.min_qty|esc_html }}+</td>
<td>
{{ tier.min_qty|esc_html }}+
{% if tier.label is defined and tier.label is not empty %}
<br><small class="wc-tpp-tier-label">{{ tier.label|esc_html }}</small>
{% endif %}
</td>
<td>{{ wc_price(tier.price)|raw }}</td>
<td>
{% if savings > 0 %}

View File

@@ -4,7 +4,7 @@
* Plugin Name: WooCommerce Tier and Package Prices
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
* Version: 1.1.6
* Version: 1.1.7
* Author: Marco Graetsch
* Author URI: https://src.bundespruefstelle.ch/magdev
* Text Domain: wc-tier-package-prices
@@ -22,7 +22,7 @@ if (!defined('ABSPATH')) {
}
// Define plugin constants
define('WC_TPP_VERSION', '1.1.6');
define('WC_TPP_VERSION', '1.1.7');
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));