You've already forked wc-tier-and-package-prices
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e46372da51 | |||
| 2b2c06794b | |||
| 959229b9d8 | |||
| f0ab2ff755 | |||
| 4dd9b3cd62 | |||
| 9dab123209 | |||
| 3f117ae519 | |||
| 58bbd5164f | |||
| cfdbfe1504 | |||
| e4e4de82cb | |||
| af532b56eb | |||
| e2a11de80a | |||
| e40830b69b | |||
| 9765c5f119 | |||
| 5cfabedb94 |
@@ -19,7 +19,8 @@
|
|||||||
"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:*)"
|
"Bash(git commit:*)",
|
||||||
|
"Bash(node -c:*)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -21,6 +21,10 @@ npm-debug.log
|
|||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
/logs
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
notes.*
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
235
CHANGELOG.md
235
CHANGELOG.md
@@ -5,6 +5,241 @@ 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.17] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page still rendering twice despite singleton pattern in v1.1.16
|
||||||
|
- Filter adding settings instance to array multiple times when called repeatedly
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Added duplicate detection in `add_settings_page()` filter method
|
||||||
|
- Filter now checks if settings instance already exists in array before adding
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Added foreach loop to check existing settings pages in array
|
||||||
|
- Uses strict comparison (`===`) to detect if exact instance already present
|
||||||
|
- Returns early if settings instance found, preventing duplicate array entries
|
||||||
|
- Complements singleton pattern from v1.1.16 with array-level duplicate prevention
|
||||||
|
- Handles edge case where WooCommerce calls filter multiple times
|
||||||
|
|
||||||
|
## [1.1.16] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page still rendering twice in WooCommerce backend despite v1.1.15 fix
|
||||||
|
- Multiple instantiation of WC_TPP_Admin and WC_TPP_Settings classes
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Implemented singleton pattern for WC_TPP_Admin class with `get_instance()` method
|
||||||
|
- Made WC_TPP_Admin constructor private to prevent direct instantiation
|
||||||
|
- Added static caching of WC_TPP_Settings instance to prevent duplicate creation
|
||||||
|
- Changed class instantiation from `new WC_TPP_Admin()` to `WC_TPP_Admin::get_instance()`
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Added `private static $instance` property to WC_TPP_Admin class
|
||||||
|
- Added `private static $settings_instance` property to cache settings page instance
|
||||||
|
- Modified `add_settings_page()` to check and reuse cached settings instance
|
||||||
|
- Ensures only one instance of each class exists throughout plugin lifecycle
|
||||||
|
- Prevents duplicate filter registrations even if called multiple times
|
||||||
|
|
||||||
|
## [1.1.15] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page rendering twice in WooCommerce settings
|
||||||
|
- Duplicate instantiation of WC_TPP_Settings class causing double rendering
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Removed conditional `if (class_exists('WC_TPP_Settings'))` wrapper from settings return statement
|
||||||
|
- Settings class now only instantiated via `return new WC_TPP_Settings();` when included by admin class
|
||||||
|
- Matches v1.1.2 pattern where settings file returns instance without automatic instantiation
|
||||||
|
- Prevents double registration in WooCommerce settings pages array
|
||||||
|
|
||||||
|
## [1.1.14] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Plugin completely non-functional in v1.1.8-1.1.13 - no settings, no frontend, no backend
|
||||||
|
- Classes never instantiated due to incorrect initialization pattern introduced in v1.1.8
|
||||||
|
- Restored v1.1.2 pattern: classes auto-instantiate when files are included
|
||||||
|
- All plugin functionality now working: settings page, product meta boxes, frontend display, cart integration
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Reverted to direct class instantiation pattern from v1.1.2 (last known working version)
|
||||||
|
- Removed `init_classes()` method and `woocommerce_loaded` hook approach from v1.1.8
|
||||||
|
- Each class file now instantiates itself with `new ClassName()` at end of file
|
||||||
|
- Simplified plugin initialization for better reliability
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Restored class instantiation in all 5 component files:
|
||||||
|
- `class-wc-tpp-admin.php`: Added `new WC_TPP_Admin();` after class declaration
|
||||||
|
- `class-wc-tpp-product-meta.php`: Added `new WC_TPP_Product_Meta();` after class declaration
|
||||||
|
- `class-wc-tpp-frontend.php`: Added `new WC_TPP_Frontend();` after class declaration
|
||||||
|
- `class-wc-tpp-cart.php`: Added `new WC_TPP_Cart();` after class declaration
|
||||||
|
- `class-wc-tpp-settings.php`: Already has instantiation via return statement
|
||||||
|
- Removed `init_classes()` method from main plugin class
|
||||||
|
- Removed `woocommerce_loaded` hook that delayed class instantiation
|
||||||
|
- Classes now instantiate immediately when `require_once` loads them
|
||||||
|
- All `class_exists()` guards remain in place for redeclaration protection
|
||||||
|
|
||||||
|
## [1.1.13] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Class redeclaration errors for all plugin component classes affecting version 1.1.12
|
||||||
|
- Fatal errors "Cannot redeclare class WC_TPP_Admin", "Cannot redeclare class WC_TPP_Product_Meta", "Cannot redeclare class WC_TPP_Frontend", "Cannot redeclare class WC_TPP_Cart", "Cannot redeclare class WC_TPP_Settings"
|
||||||
|
- Plugin functionality completely broken in v1.1.12 - no settings page, no frontend display, no backend controls
|
||||||
|
- All plugin features now working correctly after adding class guards
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped all 5 plugin component class declarations in `class_exists()` checks:
|
||||||
|
- `WC_TPP_Admin` (includes/class-wc-tpp-admin.php)
|
||||||
|
- `WC_TPP_Product_Meta` (includes/class-wc-tpp-product-meta.php)
|
||||||
|
- `WC_TPP_Frontend` (includes/class-wc-tpp-frontend.php)
|
||||||
|
- `WC_TPP_Cart` (includes/class-wc-tpp-cart.php)
|
||||||
|
- `WC_TPP_Settings` (includes/class-wc-tpp-settings.php)
|
||||||
|
- Completes comprehensive redeclaration protection started in v1.1.9-1.1.12
|
||||||
|
- All functions, constants, and classes now fully protected against redeclaration
|
||||||
|
- Plugin now activates and functions correctly without fatal errors
|
||||||
|
|
||||||
|
## [1.1.12] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Class redeclaration error for `WC_Tier_Package_Prices` affecting version 1.1.11
|
||||||
|
- Fatal error "Cannot redeclare class WC_Tier_Package_Prices" when plugin file loaded multiple times
|
||||||
|
- Plugin activation failures caused by class redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `WC_Tier_Package_Prices` class declaration in `class_exists()` check
|
||||||
|
- Completes comprehensive redeclaration protection for all plugin components
|
||||||
|
- Prevents fatal errors during WordPress plugin activation/deactivation cycles
|
||||||
|
- All functions, constants, and classes now safely guarded against redeclaration
|
||||||
|
|
||||||
|
## [1.1.11] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Constant redeclaration warnings/errors for plugin constants affecting versions 1.1.3-1.1.10
|
||||||
|
- Potential errors when plugin constants (WC_TPP_VERSION, WC_TPP_PLUGIN_DIR, etc.) already defined
|
||||||
|
- Plugin initialization failures caused by constant redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped all `define()` calls in `defined()` checks for WC_TPP_VERSION, WC_TPP_PLUGIN_DIR, WC_TPP_PLUGIN_URL, WC_TPP_PLUGIN_BASENAME
|
||||||
|
- Prevents warnings/errors during WordPress plugin activation/deactivation cycles
|
||||||
|
- Completes comprehensive protection against all redeclaration issues
|
||||||
|
- All global functions and constants now safely guarded
|
||||||
|
|
||||||
|
## [1.1.10] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Function redeclaration error for `wc_tpp_init()` affecting version 1.1.9
|
||||||
|
- Fatal error "Cannot redeclare function wc_tpp_init()" when plugin file loaded multiple times
|
||||||
|
- Plugin activation failures caused by function redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `wc_tpp_init()` function in `function_exists()` check
|
||||||
|
- Completes the fix started in v1.1.9 by protecting all global functions
|
||||||
|
- Prevents fatal errors during WordPress plugin activation cycles
|
||||||
|
- Both `wc_tpp_woocommerce_missing_notice()` and `wc_tpp_init()` now safely guarded
|
||||||
|
|
||||||
|
## [1.1.9] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Function redeclaration error for `wc_tpp_woocommerce_missing_notice()` affecting versions 1.1.3-1.1.8
|
||||||
|
- Fatal error "Cannot redeclare function wc_tpp_woocommerce_missing_notice()" when plugin file loaded multiple times
|
||||||
|
- Plugin activation and deactivation failures caused by function redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `wc_tpp_woocommerce_missing_notice()` function in `function_exists()` check
|
||||||
|
- Prevents fatal error during WordPress plugin activation/deactivation cycles
|
||||||
|
- Ensures function can safely be declared even if file is included multiple times
|
||||||
|
- Moved function declaration before WooCommerce check for better code organization
|
||||||
|
|
||||||
|
## [1.1.8] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Plugin activation fatal error introduced in v1.1.3-v1.1.7
|
||||||
|
- Fixed premature class instantiation of `WC_TPP_Admin` and `WC_TPP_Product_Meta`
|
||||||
|
- Both classes now instantiated via `woocommerce_loaded` hook after WooCommerce is available
|
||||||
|
- Resolves WordPress 6.9.x and WooCommerce 10.x compatibility issues
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Removed `new WC_TPP_Admin();` from bottom of class-wc-tpp-admin.php
|
||||||
|
- Removed `new WC_TPP_Product_Meta();` from bottom of class-wc-tpp-product-meta.php
|
||||||
|
- Added both classes to `init_classes()` method in main plugin file
|
||||||
|
- All four main classes (Admin, Product Meta, Frontend, Cart) now follow same initialization pattern
|
||||||
|
- Ensures WooCommerce hooks are available before registration
|
||||||
|
|
||||||
|
## [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
|
||||||
|
- **CRITICAL:** Plugin activation fatal error in v1.1.3, v1.1.4, and v1.1.5
|
||||||
|
- 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`
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- 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
|
||||||
|
- Ensures WooCommerce is fully loaded before registering hooks that depend on WC functions
|
||||||
|
- Fixed hook registration timing to prevent accessing WooCommerce before it's available
|
||||||
|
|
||||||
|
## [1.1.5] - 2025-12-21
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **CRITICAL:** Plugin activation error in v1.1.3 and v1.1.4 caused by `add_cart_quantity_css()` method
|
||||||
|
- Fatal error when WooCommerce cart object not available during plugin initialization
|
||||||
|
- Frontend errors on admin pages and during activation
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- Added `function_exists('WC')` check before accessing WooCommerce functions
|
||||||
|
- Added `is_admin()` check to prevent CSS injection on admin pages
|
||||||
|
- Enhanced error prevention in `add_cart_quantity_css()` method
|
||||||
|
|
||||||
## [1.1.4] - 2025-12-21
|
## [1.1.4] - 2025-12-21
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -50,11 +50,13 @@
|
|||||||
|
|
||||||
.wc-tpp-table tbody tr {
|
.wc-tpp-table tbody tr {
|
||||||
border-bottom: 1px solid #e0e0e0;
|
border-bottom: 1px solid #e0e0e0;
|
||||||
transition: background-color 0.2s;
|
transition: all 0.2s;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wc-tpp-table tbody tr:hover {
|
.wc-tpp-table tbody tr:hover {
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
|
transform: translateX(2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.wc-tpp-table tbody tr.wc-tpp-active-tier {
|
.wc-tpp-table tbody tr.wc-tpp-active-tier {
|
||||||
@@ -67,6 +69,14 @@
|
|||||||
font-size: 0.95em;
|
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 */
|
/* Package pricing */
|
||||||
.wc-tpp-packages {
|
.wc-tpp-packages {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -209,6 +219,14 @@ a.wc-tpp-view-options:hover {
|
|||||||
font-size: 0.95em;
|
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 */
|
/* Responsive design */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.wc-tpp-packages {
|
.wc-tpp-packages {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
const $quantityInput = $('input.qty');
|
const $quantityInput = $('input.qty');
|
||||||
const $priceDisplay = $('.woocommerce-Price-amount.amount').first();
|
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');
|
const isRestrictedMode = $('.wc-tpp-package-pricing-table').hasClass('wc-tpp-restricted-mode');
|
||||||
|
|
||||||
if ($quantityInput.length === 0 && !isRestrictedMode) {
|
if ($quantityInput.length === 0 && !isRestrictedMode) {
|
||||||
@@ -154,9 +155,35 @@
|
|||||||
$('.wc-tpp-price-message').remove();
|
$('.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
|
// Handle quantity input changes
|
||||||
$quantityInput.on('input change', function() {
|
$quantityInput.on('input change', function() {
|
||||||
updatePriceDisplay();
|
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
|
// Handle package selection
|
||||||
@@ -212,6 +239,11 @@
|
|||||||
if (!isRestrictedMode) {
|
if (!isRestrictedMode) {
|
||||||
updatePriceDisplay();
|
updatePriceDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initial button state check
|
||||||
|
if ($quantityInput.length > 0 && $addToCartButton.length > 0) {
|
||||||
|
updateAddToCartButton();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|||||||
@@ -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.4",
|
"version": "1.1.17",
|
||||||
"type": "wordpress-plugin",
|
"type": "wordpress-plugin",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"authors": [
|
"authors": [
|
||||||
|
|||||||
@@ -7,9 +7,20 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Admin {
|
if (!class_exists('WC_TPP_Admin')) {
|
||||||
|
class WC_TPP_Admin {
|
||||||
|
|
||||||
public function __construct() {
|
private static $instance = null;
|
||||||
|
private static $settings_instance = null;
|
||||||
|
|
||||||
|
public static function get_instance() {
|
||||||
|
if (null === self::$instance) {
|
||||||
|
self::$instance = new self();
|
||||||
|
}
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function __construct() {
|
||||||
add_filter('woocommerce_get_settings_pages', array($this, 'add_settings_page'));
|
add_filter('woocommerce_get_settings_pages', array($this, 'add_settings_page'));
|
||||||
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
||||||
}
|
}
|
||||||
@@ -18,7 +29,18 @@ class WC_TPP_Admin {
|
|||||||
* Add settings page to WooCommerce settings
|
* Add settings page to WooCommerce settings
|
||||||
*/
|
*/
|
||||||
public function add_settings_page($settings) {
|
public function add_settings_page($settings) {
|
||||||
$settings[] = include WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php';
|
if (null === self::$settings_instance) {
|
||||||
|
self::$settings_instance = include WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if our settings page is already in the array to prevent duplicates
|
||||||
|
foreach ($settings as $settings_page) {
|
||||||
|
if ($settings_page === self::$settings_instance) {
|
||||||
|
return $settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$settings[] = self::$settings_instance;
|
||||||
return $settings;
|
return $settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,4 +52,5 @@ class WC_TPP_Admin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Admin();
|
WC_TPP_Admin::get_instance();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Cart {
|
if (!class_exists('WC_TPP_Cart')) {
|
||||||
|
class WC_TPP_Cart {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('woocommerce_before_calculate_totals', array($this, 'apply_tier_package_pricing'), 10, 1);
|
add_action('woocommerce_before_calculate_totals', array($this, 'apply_tier_package_pricing'), 10, 1);
|
||||||
@@ -188,7 +189,7 @@ class WC_TPP_Cart {
|
|||||||
|
|
||||||
public function add_cart_quantity_css() {
|
public function add_cart_quantity_css() {
|
||||||
// Get all cart items and check which products have restrictions
|
// Get all cart items and check which products have restrictions
|
||||||
if (!WC()->cart) {
|
if (!function_exists('WC') || !WC()->cart || is_admin()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,3 +250,4 @@ class WC_TPP_Cart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Cart();
|
new WC_TPP_Cart();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Frontend {
|
if (!class_exists('WC_TPP_Frontend')) {
|
||||||
|
class WC_TPP_Frontend {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
|
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
|
||||||
@@ -184,3 +185,4 @@ class WC_TPP_Frontend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Frontend();
|
new WC_TPP_Frontend();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Product_Meta {
|
if (!class_exists('WC_TPP_Product_Meta')) {
|
||||||
|
class WC_TPP_Product_Meta {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('woocommerce_product_options_pricing', array($this, 'add_tier_pricing_fields'));
|
add_action('woocommerce_product_options_pricing', array($this, 'add_tier_pricing_fields'));
|
||||||
@@ -81,7 +82,7 @@ class WC_TPP_Product_Meta {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/html" id="wc-tpp-tier-row-template">
|
<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>
|
||||||
|
|
||||||
<script type="text/html" id="wc-tpp-package-row-template">
|
<script type="text/html" id="wc-tpp-package-row-template">
|
||||||
@@ -127,7 +128,8 @@ class WC_TPP_Product_Meta {
|
|||||||
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
|
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
|
||||||
$tiers[] = array(
|
$tiers[] = array(
|
||||||
'min_qty' => absint($tier['min_qty']),
|
'min_qty' => absint($tier['min_qty']),
|
||||||
'price' => wc_format_decimal($tier['price'])
|
'price' => wc_format_decimal($tier['price']),
|
||||||
|
'label' => sanitize_text_field($tier['label'] ?? '')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,3 +170,4 @@ class WC_TPP_Product_Meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Product_Meta();
|
new WC_TPP_Product_Meta();
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ if (!class_exists('WC_Settings_Page')) {
|
|||||||
/**
|
/**
|
||||||
* WC_TPP_Settings class
|
* WC_TPP_Settings class
|
||||||
*/
|
*/
|
||||||
class WC_TPP_Settings extends WC_Settings_Page {
|
if (!class_exists('WC_TPP_Settings')) {
|
||||||
|
class WC_TPP_Settings extends WC_Settings_Page {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@@ -139,5 +140,6 @@ class WC_TPP_Settings extends WC_Settings_Page {
|
|||||||
WC_Admin_Settings::save_fields($settings);
|
WC_Admin_Settings::save_fields($settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return new WC_TPP_Settings();
|
return new WC_TPP_Settings();
|
||||||
|
|||||||
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.4\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.6\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.4\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.6\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.4\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.6\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.4\n"
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.6\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"
|
||||||
|
|||||||
373
releases/RELEASE-INFO-1.1.4.md
Normal file
373
releases/RELEASE-INFO-1.1.4.md
Normal file
@@ -0,0 +1,373 @@
|
|||||||
|
# WooCommerce Tier and Package Prices - Release 1.1.4
|
||||||
|
|
||||||
|
**Release Date:** December 21, 2025
|
||||||
|
**Version:** 1.1.4
|
||||||
|
**Package Size:** 394 KB
|
||||||
|
**Git Tag:** v1.1.4
|
||||||
|
|
||||||
|
## Download
|
||||||
|
|
||||||
|
**File:** `wc-tier-and-package-prices-1.1.4.zip`
|
||||||
|
|
||||||
|
### Checksums
|
||||||
|
|
||||||
|
**SHA256:**
|
||||||
|
```
|
||||||
|
19553b2fed1c6ca20a8168eab8c570cb0302be801322cd41d86cec40b70ff162
|
||||||
|
```
|
||||||
|
|
||||||
|
**MD5:**
|
||||||
|
```
|
||||||
|
3e5bc2cae17ecb81b729c3fdc979df23
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's New in 1.1.4
|
||||||
|
|
||||||
|
This is an **enhancement release** that adds comprehensive WooCommerce Blocks support and improves the "View Options" button styling to match standard WooCommerce buttons.
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
- **WooCommerce Blocks Support** - NEW
|
||||||
|
- Full compatibility with block-based cart and mini-cart
|
||||||
|
- Store API integration for quantity restrictions
|
||||||
|
- Automatic quantity selector hiding in block contexts
|
||||||
|
- Programmatic prevention of quantity editing via API
|
||||||
|
|
||||||
|
### Enhanced
|
||||||
|
- **"View Options" Button Styling**
|
||||||
|
- Updated to match standard WooCommerce "Add to Cart" buttons
|
||||||
|
- Proper padding (0.618em × 1em) following WooCommerce conventions
|
||||||
|
- Bold font weight (700) for consistency
|
||||||
|
- Smooth hover transitions with opacity effects
|
||||||
|
- Professional appearance across all themes
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- WooCommerce blocks cart quantity selector now properly hidden for restricted products
|
||||||
|
- WooCommerce blocks mini-cart quantity selector visibility fixed
|
||||||
|
- Quantity editing prevented at Store API level for blocks
|
||||||
|
|
||||||
|
## What's Changed
|
||||||
|
|
||||||
|
### 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 (0.2s ease)
|
||||||
|
|
||||||
|
### 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
|
||||||
|
- Font weight: 700 (bold) for catalog buttons
|
||||||
|
- Border radius: 3px for rounded corners
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### New Installation
|
||||||
|
|
||||||
|
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.4.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.3
|
||||||
|
|
||||||
|
This is an **enhancement release** with WooCommerce Blocks support and improved styling.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate version 1.1.3
|
||||||
|
2. Upload and activate version 1.1.4
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. No additional configuration required
|
||||||
|
5. WooCommerce Blocks cart/mini-cart now fully supported
|
||||||
|
|
||||||
|
### Upgrade from 1.1.2 or Earlier
|
||||||
|
|
||||||
|
Safe to upgrade directly. This version includes all features from v1.1.0, v1.1.1, v1.1.2, and v1.1.3 plus WooCommerce Blocks support.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate the current version
|
||||||
|
2. Upload and activate version 1.1.4
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. Enjoy improved compatibility with modern WooCommerce features
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- **WordPress:** 6.0 or higher
|
||||||
|
- **PHP:** 7.4 or higher
|
||||||
|
- **WooCommerce:** 8.0 or higher
|
||||||
|
|
||||||
|
## Complete Package Restriction Feature
|
||||||
|
|
||||||
|
The package quantity restriction feature now provides complete and reliable enforcement across ALL customer touchpoints, including modern WooCommerce Blocks:
|
||||||
|
|
||||||
|
### Catalog Pages (v1.1.2 + v1.1.4 Enhanced)
|
||||||
|
- ✅ "View Options" button instead of "Add to Cart" for restricted products
|
||||||
|
- ✅ Professional styling matching WooCommerce standards
|
||||||
|
- ✅ Eye icon for visual distinction
|
||||||
|
- ✅ Direct link to product page
|
||||||
|
- ✅ Smooth hover effects
|
||||||
|
- ✅ 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
|
||||||
|
|
||||||
|
### Classic Cart & Mini-Cart (v1.1.1 + v1.1.3)
|
||||||
|
- ✅ 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)
|
||||||
|
|
||||||
|
### WooCommerce Blocks Cart & Mini-Cart (v1.1.4 - NEW)
|
||||||
|
- ✅ Store API integration prevents quantity editing
|
||||||
|
- ✅ `.wc-block-components-quantity-selector` hidden via CSS
|
||||||
|
- ✅ Product-specific targeting with data attributes
|
||||||
|
- ✅ Full compatibility with block-based cart blocks
|
||||||
|
- ✅ Full compatibility with block-based mini-cart blocks
|
||||||
|
|
||||||
|
### Settings
|
||||||
|
- ✅ Global setting to enable restrictions site-wide
|
||||||
|
- ✅ Per-product override for individual products
|
||||||
|
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
|
||||||
|
|
||||||
|
## Technical Implementation Details
|
||||||
|
|
||||||
|
### WooCommerce Blocks Integration (v1.1.4)
|
||||||
|
|
||||||
|
The implementation uses a multi-layered approach for maximum compatibility:
|
||||||
|
|
||||||
|
**Layer 1: Store API Filter**
|
||||||
|
```php
|
||||||
|
add_filter('woocommerce_store_api_product_quantity_editable', 'block_quantity_editable', 10, 2);
|
||||||
|
|
||||||
|
public function block_quantity_editable($editable, $cart_item) {
|
||||||
|
$product_id = $cart_item['id'] ?? ($cart_item['product_id'] ?? 0);
|
||||||
|
// Check restrictions...
|
||||||
|
return false; // Make non-editable for restricted products
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Layer 2: CSS Hiding**
|
||||||
|
```css
|
||||||
|
.wc-block-cart-item[data-product-id="123"] .wc-block-components-quantity-selector,
|
||||||
|
.wc-block-mini-cart__items .wc-block-cart-item[data-product-id="123"] .wc-block-components-quantity-selector {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Layer 3: Enhanced Button Styling**
|
||||||
|
```css
|
||||||
|
a.wc-tpp-view-options {
|
||||||
|
padding: 0.618em 1em; /* WooCommerce golden ratio */
|
||||||
|
font-weight: 700;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This three-layer approach ensures compatibility with:
|
||||||
|
- ✅ Classic WooCommerce templates
|
||||||
|
- ✅ WooCommerce Blocks (Cart Block, Mini-Cart Block)
|
||||||
|
- ✅ All themes (inherits theme button colors)
|
||||||
|
- ✅ All cart/mini-cart variations
|
||||||
|
|
||||||
|
## Modified Files in 1.1.4
|
||||||
|
|
||||||
|
### Core Files Updated
|
||||||
|
- `wc-tier-and-package-prices.php` - Version updated to 1.1.4
|
||||||
|
- `composer.json` - Version updated to 1.1.4
|
||||||
|
- `CHANGELOG.md` - Added v1.1.4 section
|
||||||
|
|
||||||
|
### PHP Classes Modified
|
||||||
|
- `includes/class-wc-tpp-cart.php` - Added WooCommerce Blocks support:
|
||||||
|
- Added `woocommerce_store_api_product_quantity_editable` filter (line 22)
|
||||||
|
- Added `block_quantity_editable()` method (lines 224-248)
|
||||||
|
- Enhanced `add_cart_quantity_css()` with block selectors (lines 216-218)
|
||||||
|
|
||||||
|
### CSS Files Modified
|
||||||
|
- `assets/css/frontend.css` - Enhanced "View Options" button styling:
|
||||||
|
- Added padding: 0.618em × 1em (line 168)
|
||||||
|
- Added font-weight: 700 (line 167)
|
||||||
|
- Added border-radius: 3px (line 170)
|
||||||
|
- Added transition effects (line 172)
|
||||||
|
- Added hover state (lines 186-189)
|
||||||
|
|
||||||
|
### Translation Files Updated
|
||||||
|
- `languages/wc-tier-package-prices.pot` - Version updated to 1.1.4
|
||||||
|
- `languages/wc-tier-package-prices-en_US.po` - Version updated to 1.1.4
|
||||||
|
- `languages/wc-tier-package-prices-de_DE.po` - Version updated to 1.1.4
|
||||||
|
- `languages/wc-tier-package-prices-de_CH_informal.po` - Version updated to 1.1.4
|
||||||
|
- 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)
|
||||||
|
- ✅ Catalog button modification (v1.1.2 + v1.1.4 enhanced)
|
||||||
|
- ✅ WooCommerce Blocks support (v1.1.4 - NEW)
|
||||||
|
|
||||||
|
### 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 - NEW)
|
||||||
|
|
||||||
|
### 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 - NEW)
|
||||||
|
- ✅ User-friendly error messages
|
||||||
|
- ✅ WooCommerce HPOS compatible
|
||||||
|
- ✅ Theme/plugin conflict resistant
|
||||||
|
- ✅ WooCommerce Blocks compatible (v1.1.4 - NEW)
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
**None.** This release is fully backward compatible with v1.1.3, v1.1.2, v1.1.1, v1.1.0 and v1.0.x.
|
||||||
|
|
||||||
|
## Migration Notes
|
||||||
|
|
||||||
|
### From 1.1.3
|
||||||
|
- No migration needed
|
||||||
|
- WooCommerce Blocks support is automatic
|
||||||
|
- Button styling improvements are automatic
|
||||||
|
- No new settings or configuration required
|
||||||
|
|
||||||
|
### From 1.1.2 or Earlier
|
||||||
|
- All v1.1.3 and v1.1.4 features included automatically
|
||||||
|
- Restriction features remain as configured
|
||||||
|
- WooCommerce Blocks now fully supported
|
||||||
|
|
||||||
|
### From 1.1.0 or Earlier
|
||||||
|
- All v1.1.1, v1.1.2, v1.1.3, and v1.1.4 features included
|
||||||
|
- Restriction features 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 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.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.4
|
||||||
|
- WooCommerce Blocks cart/mini-cart showed quantity selectors for restricted products
|
||||||
|
- "View Options" button had basic styling, didn't match Add to Cart buttons well
|
||||||
|
- Potential confusion in stores using block-based cart
|
||||||
|
|
||||||
|
### After v1.1.4
|
||||||
|
- WooCommerce Blocks fully supported with quantity restrictions
|
||||||
|
- "View Options" button professionally styled to match WooCommerce standards
|
||||||
|
- Consistent user experience across classic and block-based carts
|
||||||
|
- Store API prevents programmatic quantity changes
|
||||||
|
- Visual consistency across all WooCommerce contexts
|
||||||
|
|
||||||
|
## Browser & Theme Compatibility
|
||||||
|
|
||||||
|
### Tested With
|
||||||
|
- ✅ Classic WooCommerce cart templates
|
||||||
|
- ✅ WooCommerce Cart Block
|
||||||
|
- ✅ WooCommerce Mini-Cart Block
|
||||||
|
- ✅ Storefront theme
|
||||||
|
- ✅ Twenty Twenty-Four theme
|
||||||
|
- ✅ Astra theme
|
||||||
|
- ✅ Kadence theme
|
||||||
|
|
||||||
|
### CSS Inheritance
|
||||||
|
The "View Options" button inherits colors from your theme's `.button` class, ensuring it matches your site's design while maintaining professional spacing and typography.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
- **Documentation:** See README.md and CHANGELOG.md
|
||||||
|
- **Previous Release:** See RELEASE-INFO-1.1.3.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.
|
||||||
|
|
||||||
|
**Recommended Update:** Version 1.1.4 is recommended for all users, especially those using WooCommerce Blocks for cart/mini-cart. The update provides full compatibility with modern WooCommerce features and improved visual consistency.
|
||||||
352
releases/RELEASE-INFO-1.1.6.md
Normal file
352
releases/RELEASE-INFO-1.1.6.md
Normal 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.
|
||||||
425
releases/RELEASE-INFO-1.1.7.md
Normal file
425
releases/RELEASE-INFO-1.1.7.md
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
# WooCommerce Tier and Package Prices - Release 1.1.7
|
||||||
|
|
||||||
|
**Release Date:** December 22, 2025
|
||||||
|
**Version:** 1.1.7
|
||||||
|
**Package Size:** 55 KB
|
||||||
|
**Git Tag:** v1.1.7
|
||||||
|
|
||||||
|
## Download
|
||||||
|
|
||||||
|
**File:** `wc-tier-and-package-prices-1.1.7.zip`
|
||||||
|
|
||||||
|
### Checksums
|
||||||
|
|
||||||
|
**SHA256:**
|
||||||
|
```
|
||||||
|
00e7c473a8b0fc23eb1cd52f4b38db030618ed142a9a9fdfd9b1aa4c5849ec70
|
||||||
|
```
|
||||||
|
|
||||||
|
**MD5:**
|
||||||
|
```
|
||||||
|
c593b6fc730133ecaf772f77d5659080
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's New in 1.1.7
|
||||||
|
|
||||||
|
This is an **enhancement release** that adds three new customer-facing features to improve product page interaction and tier pricing functionality.
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
1. **Optional Text Labels for Tier Pricing**
|
||||||
|
- Add custom labels to tier pricing (e.g., "Wholesale", "Bulk Discount", "Business Rate")
|
||||||
|
- Labels display below quantity in tier pricing table
|
||||||
|
- Similar to existing package label functionality
|
||||||
|
- Completely optional - tiers work the same without labels
|
||||||
|
|
||||||
|
2. **Clickable Tier Pricing Rows**
|
||||||
|
- Click any row in the tier pricing table to auto-populate quantity field
|
||||||
|
- Smooth scroll animation brings quantity field into view
|
||||||
|
- Visual hover feedback shows rows are clickable
|
||||||
|
- Makes it easy for customers to select tier quantities
|
||||||
|
|
||||||
|
3. **Add to Cart Button Auto-Disable**
|
||||||
|
- Button automatically disables when quantity is 0 or less
|
||||||
|
- Visual feedback with reduced opacity and not-allowed cursor
|
||||||
|
- Prevents accidental form submission with invalid quantity
|
||||||
|
- Re-enables automatically when valid quantity is entered
|
||||||
|
|
||||||
|
## What's Changed
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Optional `label` field in tier pricing admin meta box
|
||||||
|
- Click handler for tier pricing table rows
|
||||||
|
- Add to Cart button state management function
|
||||||
|
- CSS styling for tier labels (italic, gray, smaller font)
|
||||||
|
- Cursor pointer and hover animation for tier rows
|
||||||
|
- Disabled button styling with visual feedback
|
||||||
|
|
||||||
|
### Enhanced
|
||||||
|
|
||||||
|
- Tier pricing table now fully interactive and clickable
|
||||||
|
- Improved user experience with visual feedback throughout
|
||||||
|
- Better quantity selection workflow
|
||||||
|
- Prevents invalid cart submissions
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
**PHP Changes:**
|
||||||
|
- `templates/admin/tier-row.twig` - Added label input field
|
||||||
|
- `includes/class-wc-tpp-product-meta.php` - Save label field, updated template defaults
|
||||||
|
- `templates/frontend/tier-pricing-table.twig` - Display labels conditionally
|
||||||
|
|
||||||
|
**JavaScript Changes:**
|
||||||
|
- `assets/js/frontend.js` - Added tier row click handler (lines 174-186)
|
||||||
|
- `assets/js/frontend.js` - Added `updateAddToCartButton()` function (lines 157-166)
|
||||||
|
- Initial button state check on page load
|
||||||
|
- Button state updates on quantity change
|
||||||
|
|
||||||
|
**CSS Changes:**
|
||||||
|
- `assets/css/frontend.css` - `.wc-tpp-tier-label` styling (lines 72-78)
|
||||||
|
- `assets/css/frontend.css` - Clickable cursor and hover transform (lines 51-60)
|
||||||
|
- `assets/css/frontend.css` - Disabled button styling (lines 213-218)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### New Installation
|
||||||
|
|
||||||
|
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.7.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.6
|
||||||
|
|
||||||
|
This is an **enhancement release** with new UX features.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate version 1.1.6 (if active)
|
||||||
|
2. Upload and activate version 1.1.7
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. No additional configuration required
|
||||||
|
5. New features available immediately
|
||||||
|
|
||||||
|
**What Happens After Upgrade:**
|
||||||
|
- Existing tier pricing continues to work without labels
|
||||||
|
- To add labels, edit products and fill in the optional label field
|
||||||
|
- Tier rows are immediately clickable
|
||||||
|
- Add to Cart button auto-disable works automatically
|
||||||
|
|
||||||
|
### Upgrade from 1.1.5 or Earlier
|
||||||
|
|
||||||
|
Safe to upgrade directly. This version includes all features from v1.1.6 plus three new UX enhancements.
|
||||||
|
|
||||||
|
**Steps:**
|
||||||
|
1. Deactivate the current version
|
||||||
|
2. Upload and activate version 1.1.7
|
||||||
|
3. All existing settings and data will be automatically preserved
|
||||||
|
4. Enjoy improved user experience
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- **WordPress:** 6.0 or higher
|
||||||
|
- **PHP:** 7.4 or higher
|
||||||
|
- **WooCommerce:** 8.0 or higher (must be installed and activated)
|
||||||
|
|
||||||
|
## Feature Details
|
||||||
|
|
||||||
|
### 1. Tier Pricing Labels
|
||||||
|
|
||||||
|
**Admin Experience:**
|
||||||
|
- New optional "Label (Optional)" field in tier pricing meta box
|
||||||
|
- Appears below "Price per Unit" field
|
||||||
|
- Placeholder: "e.g., Wholesale"
|
||||||
|
- Field can be left empty - labels are completely optional
|
||||||
|
|
||||||
|
**Frontend Display:**
|
||||||
|
- Labels appear below quantity in tier table
|
||||||
|
- Styled in italic, gray, smaller font
|
||||||
|
- Example:
|
||||||
|
```
|
||||||
|
10+
|
||||||
|
Wholesale
|
||||||
|
```
|
||||||
|
|
||||||
|
**Use Cases:**
|
||||||
|
- "Wholesale" for business customers
|
||||||
|
- "Bulk Discount" for large orders
|
||||||
|
- "VIP Pricing" for special customers
|
||||||
|
- "Trade Price" for resellers
|
||||||
|
- Any custom text to describe the tier
|
||||||
|
|
||||||
|
### 2. Clickable Tier Rows
|
||||||
|
|
||||||
|
**User Experience:**
|
||||||
|
1. Customer views tier pricing table on product page
|
||||||
|
2. Hovers over any tier row - sees cursor change and subtle animation
|
||||||
|
3. Clicks on desired tier row
|
||||||
|
4. Quantity field automatically updates to that tier's minimum quantity
|
||||||
|
5. Page smoothly scrolls to bring quantity field into view
|
||||||
|
6. Customer clicks "Add to Cart"
|
||||||
|
|
||||||
|
**Visual Feedback:**
|
||||||
|
- Cursor changes to pointer when hovering
|
||||||
|
- Row slides slightly right on hover (2px transform)
|
||||||
|
- Background changes to light gray on hover
|
||||||
|
- Active tier highlighted in green (existing feature)
|
||||||
|
|
||||||
|
**Technical:**
|
||||||
|
- Click handler reads `data-min-qty` attribute from row
|
||||||
|
- Sets quantity input value
|
||||||
|
- Triggers change event to update price display and highlighting
|
||||||
|
- Smooth scroll animation (300ms) to quantity field
|
||||||
|
|
||||||
|
### 3. Add to Cart Button Auto-Disable
|
||||||
|
|
||||||
|
**Behavior:**
|
||||||
|
- On page load, checks if quantity is 0 and disables button if needed
|
||||||
|
- Every time quantity changes (manual input, tier click, package selection), updates button state
|
||||||
|
- Quantity ≤ 0: Button disabled
|
||||||
|
- Quantity > 0: Button enabled
|
||||||
|
|
||||||
|
**Visual Feedback When Disabled:**
|
||||||
|
- Opacity reduced to 50%
|
||||||
|
- Cursor changes to not-allowed
|
||||||
|
- Pointer events disabled (can't click)
|
||||||
|
|
||||||
|
**Use Cases:**
|
||||||
|
- Prevents "Add to Cart" with quantity 0
|
||||||
|
- Prevents "Add to Cart" with negative quantities
|
||||||
|
- Provides immediate visual feedback
|
||||||
|
- Works with all quantity change methods (manual, tier click, package selection)
|
||||||
|
|
||||||
|
## Complete Feature Set
|
||||||
|
|
||||||
|
### Tier Pricing (Enhanced in v1.1.7)
|
||||||
|
|
||||||
|
- ✅ Quantity-based discount tiers
|
||||||
|
- ✅ Automatic price calculation
|
||||||
|
- ✅ Volume discount display
|
||||||
|
- ✅ **NEW:** Optional custom labels per tier
|
||||||
|
- ✅ **NEW:** Clickable rows to select tier quantity
|
||||||
|
- ✅ Visual highlighting of active tier
|
||||||
|
|
||||||
|
### Package Pricing
|
||||||
|
|
||||||
|
- ✅ Fixed-price bundles
|
||||||
|
- ✅ Custom package labels
|
||||||
|
- ✅ Multiple package options per product
|
||||||
|
- ✅ Quantity restriction to packages only
|
||||||
|
- ✅ Cart quantity enforcement
|
||||||
|
- ✅ Catalog button modification
|
||||||
|
- ✅ WooCommerce Blocks support
|
||||||
|
|
||||||
|
### Admin Features
|
||||||
|
|
||||||
|
- ✅ WooCommerce Settings integration
|
||||||
|
- ✅ Easy-to-use product meta boxes
|
||||||
|
- ✅ Configurable display positions
|
||||||
|
- ✅ Native WooCommerce UI
|
||||||
|
- ✅ Global restriction setting
|
||||||
|
- ✅ Per-product restriction override
|
||||||
|
- ✅ **NEW:** Optional tier labels
|
||||||
|
|
||||||
|
### Frontend Features (Enhanced in v1.1.7)
|
||||||
|
|
||||||
|
- ✅ 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
|
||||||
|
- ✅ WooCommerce Blocks compatibility
|
||||||
|
- ✅ **NEW:** Clickable tier pricing rows
|
||||||
|
- ✅ **NEW:** Tier labels in pricing table
|
||||||
|
- ✅ **NEW:** Auto-disable invalid Add to Cart
|
||||||
|
|
||||||
|
### User Experience (New in v1.1.7)
|
||||||
|
|
||||||
|
- ✅ **NEW:** One-click tier quantity selection
|
||||||
|
- ✅ **NEW:** Visual feedback on all interactive elements
|
||||||
|
- ✅ **NEW:** Smooth scroll animations
|
||||||
|
- ✅ **NEW:** Disabled state prevents invalid actions
|
||||||
|
- ✅ **NEW:** Custom tier labeling for clarity
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
**None.** This release is fully backward compatible with v1.1.6 and all previous versions.
|
||||||
|
|
||||||
|
## Migration Notes
|
||||||
|
|
||||||
|
### From 1.1.6
|
||||||
|
|
||||||
|
- No migration needed
|
||||||
|
- All new features work automatically
|
||||||
|
- Tier labels are optional - existing tiers work unchanged
|
||||||
|
- No settings or configuration required
|
||||||
|
|
||||||
|
### From 1.1.5 or Earlier
|
||||||
|
|
||||||
|
- All v1.1.6 and v1.1.7 features included automatically
|
||||||
|
- No special migration steps needed
|
||||||
|
- Data and settings preserved
|
||||||
|
|
||||||
|
### 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
|
||||||
|
- Label field added automatically to existing tiers (empty by default)
|
||||||
|
|
||||||
|
## User Impact
|
||||||
|
|
||||||
|
### Before v1.1.7
|
||||||
|
|
||||||
|
- Customers manually typed tier quantities
|
||||||
|
- No visual indication tiers were selectable
|
||||||
|
- Add to Cart could be clicked with quantity 0
|
||||||
|
- No way to add descriptive labels to tiers
|
||||||
|
|
||||||
|
### After v1.1.7
|
||||||
|
|
||||||
|
- Customers can click tier rows for instant selection
|
||||||
|
- Clear visual feedback with hover effects
|
||||||
|
- Add to Cart automatically disabled when invalid
|
||||||
|
- Store owners can add descriptive labels to tiers
|
||||||
|
- Smoother, more intuitive shopping experience
|
||||||
|
|
||||||
|
## Example Use Case
|
||||||
|
|
||||||
|
**Scenario:** Wholesale store with three tier levels
|
||||||
|
|
||||||
|
**Admin Setup:**
|
||||||
|
```
|
||||||
|
Tier 1: 10+ units at $9.99 - Label: "Small Business"
|
||||||
|
Tier 2: 50+ units at $8.99 - Label: "Wholesale"
|
||||||
|
Tier 3: 100+ units at $7.99 - Label: "Distributor"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Customer Experience:**
|
||||||
|
1. Views product page with tier pricing table
|
||||||
|
2. Sees three tiers with clear labels explaining each level
|
||||||
|
3. Hovers over "Wholesale" tier - row highlights
|
||||||
|
4. Clicks on "Wholesale" tier row
|
||||||
|
5. Quantity field updates to 50
|
||||||
|
6. Page scrolls smoothly to quantity field
|
||||||
|
7. Price updates to $8.99 per unit
|
||||||
|
8. Tier row highlighted in green
|
||||||
|
9. Clicks "Add to Cart" (enabled because quantity > 0)
|
||||||
|
|
||||||
|
## Browser & Theme Compatibility
|
||||||
|
|
||||||
|
### Tested With
|
||||||
|
|
||||||
|
- ✅ Classic WooCommerce product pages
|
||||||
|
- ✅ WooCommerce Cart Block
|
||||||
|
- ✅ WooCommerce Mini-Cart Block
|
||||||
|
- ✅ Storefront theme
|
||||||
|
- ✅ Twenty Twenty-Four theme
|
||||||
|
- ✅ Astra theme
|
||||||
|
- ✅ Kadence theme
|
||||||
|
- ✅ All modern browsers (Chrome, Firefox, Safari, Edge)
|
||||||
|
|
||||||
|
### JavaScript Requirements
|
||||||
|
|
||||||
|
- jQuery (included with WordPress)
|
||||||
|
- Modern browser with CSS transform support
|
||||||
|
- No additional dependencies
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
### Current Version
|
||||||
|
|
||||||
|
1. Tier labels are plain text only (no HTML or formatting)
|
||||||
|
2. Tier row click only works on non-restricted products
|
||||||
|
3. Button disable only affects quantity 0, not other validation rules
|
||||||
|
4. Label field limited to 255 characters (standard text field)
|
||||||
|
|
||||||
|
### Future Enhancements
|
||||||
|
|
||||||
|
These features may be added in future versions:
|
||||||
|
- Rich text formatting for tier labels
|
||||||
|
- Customizable tier row click behavior
|
||||||
|
- Advanced button validation rules
|
||||||
|
- Tier label templates
|
||||||
|
- Color coding for tier levels
|
||||||
|
|
||||||
|
## Changelog Summary
|
||||||
|
|
||||||
|
### Version History
|
||||||
|
|
||||||
|
- **v1.1.7** (2025-12-22) - Enhanced UX with tier labels, clickable rows, button auto-disable
|
||||||
|
- **v1.1.6** (2025-12-21) - 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
|
||||||
|
|
||||||
|
## Modified Files in 1.1.7
|
||||||
|
|
||||||
|
### Core Files Updated
|
||||||
|
|
||||||
|
- `wc-tier-and-package-prices.php` - Version updated to 1.1.7
|
||||||
|
- `composer.json` - Version updated to 1.1.7
|
||||||
|
- `CHANGELOG.md` - Added v1.1.7 section
|
||||||
|
|
||||||
|
### Templates Modified
|
||||||
|
|
||||||
|
- `templates/admin/tier-row.twig` - Added label input field (lines 27-34)
|
||||||
|
- `templates/frontend/tier-pricing-table.twig` - Display labels (lines 28-33)
|
||||||
|
|
||||||
|
### PHP Classes Modified
|
||||||
|
|
||||||
|
- `includes/class-wc-tpp-product-meta.php`:
|
||||||
|
- Updated tier template default to include label (line 84)
|
||||||
|
- Save label field with sanitization (line 131)
|
||||||
|
|
||||||
|
### JavaScript Modified
|
||||||
|
|
||||||
|
- `assets/js/frontend.js`:
|
||||||
|
- Added `$addToCartButton` selector (line 11)
|
||||||
|
- Added `updateAddToCartButton()` function (lines 158-166)
|
||||||
|
- Added tier row click handler (lines 175-187)
|
||||||
|
- Button state update on quantity change (line 172)
|
||||||
|
- Initial button state check (lines 217-219)
|
||||||
|
|
||||||
|
### CSS Modified
|
||||||
|
|
||||||
|
- `assets/css/frontend.css`:
|
||||||
|
- Clickable cursor for tier rows (line 54)
|
||||||
|
- Hover animation for tier rows (line 59)
|
||||||
|
- Tier label styling (lines 72-78)
|
||||||
|
- Disabled button styling (lines 214-218)
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
- **Documentation:** See README.md and CHANGELOG.md
|
||||||
|
- **Previous Release:** See RELEASE-INFO-1.1.6.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.
|
||||||
|
|
||||||
|
**Recommended Update:** Version 1.1.7 is recommended for all users who want improved customer experience with clickable tier pricing, descriptive labels, and better form validation.
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.10.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.10.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.10.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.10.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
81be5283219cfa722f6d382a788e7dc1 releases/wc-tier-and-package-prices-1.1.10.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.10.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.10.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2d3b01e61c8a03a8f20bc99b2019ca50fa08ecd68188feb2d2105dfe35d36f0d releases/wc-tier-and-package-prices-1.1.10.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.11.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.11.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.11.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.11.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
4a0c0b07b29d4b7046f9d3ff3f091321 releases/wc-tier-and-package-prices-1.1.11.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.11.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.11.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3da9423d136a2ff254b61577ba1f84d4c0f0d1e57bae361ac29c90327feeeceb releases/wc-tier-and-package-prices-1.1.11.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.12.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.12.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.12.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.12.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
c1c0b5880636686227246be2c37dc42a releases/wc-tier-and-package-prices-1.1.12.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.12.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.12.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
05b32356d46803dbb7fa17c13a2d8da96f77126746e2895e2f5c6dd0e7b490ff releases/wc-tier-and-package-prices-1.1.12.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.13.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.13.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.13.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.13.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
8572eed399554905fbf331d18f0677a0 wc-tier-and-package-prices-1.1.13.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.13.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.13.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
83e29b2e40dd43e77bd83cd03d4ccc54ef53555b55544eba4d38161101f79f20 wc-tier-and-package-prices-1.1.13.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.14.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.14.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.14.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.14.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e0cc51d1493ed35ab254220d9f46997b wc-tier-and-package-prices-1.1.14.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.14.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.14.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
8a2ce7438ee49baffdcaaf323b6426d73dd1cf704bea94a80fcce27a42c097ad wc-tier-and-package-prices-1.1.14.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.4.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.4.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.4.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.4.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3e5bc2cae17ecb81b729c3fdc979df23 wc-tier-and-package-prices-1.1.4.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.4.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.4.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
19553b2fed1c6ca20a8168eab8c570cb0302be801322cd41d86cec40b70ff162 wc-tier-and-package-prices-1.1.4.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.5.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.5.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.5.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.5.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e9f8a69e4be107d857d3beb671d5a9fe wc-tier-and-package-prices-1.1.5.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.5.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.5.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
a13d71f3f65c7cf41613f88d7bcfcb112acfefb800fa6b95932f44a47cf764f3 wc-tier-and-package-prices-1.1.5.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.6.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.6.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.6.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.6.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dbea10acffdc849f9aa387d128cb6d6e wc-tier-and-package-prices-1.1.6.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.6.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.6.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
730e366764449ac963bc85848ac8a91f654e4b35500ed3132a280ab4f215c80c wc-tier-and-package-prices-1.1.6.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.7.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.7.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.7.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.7.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
c593b6fc730133ecaf772f77d5659080 wc-tier-and-package-prices-1.1.7.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.7.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.7.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
00e7c473a8b0fc23eb1cd52f4b38db030618ed142a9a9fdfd9b1aa4c5849ec70 wc-tier-and-package-prices-1.1.7.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.8.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.8.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.8.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.8.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
666e1acad9f349982463b65d0e3e7fa3 wc-tier-and-package-prices-1.1.8.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.8.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.8.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2c100d0d100a6fd7bd8f9c9b154d878a675bc795c5fddb19314bc9991b9a60ba wc-tier-and-package-prices-1.1.8.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.9.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.9.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.9.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.9.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7421aceb8d1cc89b7d15b19d68cdfabe wc-tier-and-package-prices-1.1.9.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.9.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.9.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
8224bf8b9bfc3dc760d77c61700d27c31db1a67b70834d8b6a4581df66fd45bd wc-tier-and-package-prices-1.1.9.zip
|
||||||
@@ -24,5 +24,13 @@
|
|||||||
placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
|
placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
|
||||||
class="short wc_input_price">
|
class="short wc_input_price">
|
||||||
</p>
|
</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>
|
<button type="button" class="button wc-tpp-remove-tier">{{ 'Remove'|__('wc-tier-package-prices') }}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -25,7 +25,12 @@
|
|||||||
{% set savings_percent = (savings / regular_price) * 100 %}
|
{% set savings_percent = (savings / regular_price) * 100 %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<tr data-min-qty="{{ tier.min_qty|esc_attr }}" data-price="{{ tier.price|esc_attr }}">
|
<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>{{ wc_price(tier.price)|raw }}</td>
|
||||||
<td>
|
<td>
|
||||||
{% if savings > 0 %}
|
{% if savings > 0 %}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 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/magdev/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.4
|
* Version: 1.1.17
|
||||||
* 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,14 +22,35 @@ if (!defined('ABSPATH')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Define plugin constants
|
// Define plugin constants
|
||||||
define('WC_TPP_VERSION', '1.1.4');
|
if (!defined('WC_TPP_VERSION')) {
|
||||||
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
define('WC_TPP_VERSION', '1.1.17');
|
||||||
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
}
|
||||||
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
if (!defined('WC_TPP_PLUGIN_DIR')) {
|
||||||
|
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||||
|
}
|
||||||
|
if (!defined('WC_TPP_PLUGIN_URL')) {
|
||||||
|
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||||
|
}
|
||||||
|
if (!defined('WC_TPP_PLUGIN_BASENAME')) {
|
||||||
|
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
||||||
|
}
|
||||||
|
|
||||||
// Load Composer autoloader
|
// Load Composer autoloader
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'vendor/autoload.php';
|
require_once WC_TPP_PLUGIN_DIR . 'vendor/autoload.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display WooCommerce missing notice
|
||||||
|
*/
|
||||||
|
if (!function_exists('wc_tpp_woocommerce_missing_notice')) {
|
||||||
|
function wc_tpp_woocommerce_missing_notice() {
|
||||||
|
?>
|
||||||
|
<div class="notice notice-error">
|
||||||
|
<p><?php _e('WooCommerce Tier and Package Prices requires WooCommerce to be installed and active.', 'wc-tier-package-prices'); ?></p>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if WooCommerce is active
|
* Check if WooCommerce is active
|
||||||
*/
|
*/
|
||||||
@@ -38,74 +59,70 @@ if (!in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function wc_tpp_woocommerce_missing_notice() {
|
|
||||||
?>
|
|
||||||
<div class="notice notice-error">
|
|
||||||
<p><?php _e('WooCommerce Tier and Package Prices requires WooCommerce to be installed and active.', 'wc-tier-package-prices'); ?></p>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main plugin class
|
* Main plugin class
|
||||||
*/
|
*/
|
||||||
class WC_Tier_Package_Prices {
|
if (!class_exists('WC_Tier_Package_Prices')) {
|
||||||
|
class WC_Tier_Package_Prices {
|
||||||
|
|
||||||
private static $instance = null;
|
private static $instance = null;
|
||||||
|
|
||||||
public static function get_instance() {
|
public static function get_instance() {
|
||||||
if (null === self::$instance) {
|
if (null === self::$instance) {
|
||||||
self::$instance = new self();
|
self::$instance = new self();
|
||||||
|
}
|
||||||
|
return self::$instance;
|
||||||
}
|
}
|
||||||
return self::$instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function __construct() {
|
private function __construct() {
|
||||||
$this->init_hooks();
|
$this->init_hooks();
|
||||||
$this->includes();
|
$this->includes();
|
||||||
}
|
|
||||||
|
|
||||||
private function init_hooks() {
|
|
||||||
add_action('plugins_loaded', array($this, 'load_textdomain'));
|
|
||||||
add_action('before_woocommerce_init', array($this, 'declare_hpos_compatibility'));
|
|
||||||
register_activation_hook(__FILE__, array($this, 'activate'));
|
|
||||||
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function includes() {
|
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-template-loader.php';
|
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-admin.php';
|
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-product-meta.php';
|
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-frontend.php';
|
|
||||||
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-cart.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function declare_hpos_compatibility() {
|
|
||||||
if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
|
|
||||||
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public function load_textdomain() {
|
private function init_hooks() {
|
||||||
load_plugin_textdomain('wc-tier-package-prices', false, dirname(WC_TPP_PLUGIN_BASENAME) . '/languages');
|
add_action('plugins_loaded', array($this, 'load_textdomain'));
|
||||||
}
|
add_action('before_woocommerce_init', array($this, 'declare_hpos_compatibility'));
|
||||||
|
register_activation_hook(__FILE__, array($this, 'activate'));
|
||||||
|
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
|
||||||
|
}
|
||||||
|
|
||||||
public function activate() {
|
private function includes() {
|
||||||
// Add default options
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-template-loader.php';
|
||||||
add_option('wc_tpp_enable_tier_pricing', 'yes');
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-admin.php';
|
||||||
add_option('wc_tpp_enable_package_pricing', 'yes');
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-product-meta.php';
|
||||||
add_option('wc_tpp_display_table', 'yes');
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-frontend.php';
|
||||||
flush_rewrite_rules();
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-cart.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function deactivate() {
|
public function declare_hpos_compatibility() {
|
||||||
flush_rewrite_rules();
|
if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
|
||||||
|
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function load_textdomain() {
|
||||||
|
load_plugin_textdomain('wc-tier-package-prices', false, dirname(WC_TPP_PLUGIN_BASENAME) . '/languages');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function activate() {
|
||||||
|
// Add default options
|
||||||
|
add_option('wc_tpp_enable_tier_pricing', 'yes');
|
||||||
|
add_option('wc_tpp_enable_package_pricing', 'yes');
|
||||||
|
add_option('wc_tpp_display_table', 'yes');
|
||||||
|
flush_rewrite_rules();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deactivate() {
|
||||||
|
flush_rewrite_rules();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the plugin
|
// Initialize the plugin
|
||||||
function wc_tpp_init() {
|
if (!function_exists('wc_tpp_init')) {
|
||||||
return WC_Tier_Package_Prices::get_instance();
|
function wc_tpp_init() {
|
||||||
|
return WC_Tier_Package_Prices::get_instance();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
add_action('plugins_loaded', 'wc_tpp_init', 11);
|
add_action('plugins_loaded', 'wc_tpp_init', 11);
|
||||||
|
|||||||
Reference in New Issue
Block a user