You've already forked wc-tier-and-package-prices
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e46372da51 | |||
| 2b2c06794b | |||
| 959229b9d8 | |||
| f0ab2ff755 | |||
| 4dd9b3cd62 | |||
| 9dab123209 | |||
| 3f117ae519 | |||
| 58bbd5164f | |||
| cfdbfe1504 | |||
| e4e4de82cb |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -21,6 +21,7 @@ npm-debug.log
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
/logs
|
||||
|
||||
# Notes
|
||||
notes.*
|
||||
|
||||
183
CHANGELOG.md
183
CHANGELOG.md
@@ -5,6 +5,189 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.1.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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "magdev/wc-tier-package-prices",
|
||||
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
||||
"version": "1.1.7",
|
||||
"version": "1.1.17",
|
||||
"type": "wordpress-plugin",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"authors": [
|
||||
|
||||
@@ -7,9 +7,20 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
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_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
||||
}
|
||||
@@ -18,7 +29,18 @@ class WC_TPP_Admin {
|
||||
* Add settings page to WooCommerce 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;
|
||||
}
|
||||
|
||||
@@ -30,4 +52,5 @@ class WC_TPP_Admin {
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Admin();
|
||||
WC_TPP_Admin::get_instance();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!class_exists('WC_TPP_Cart')) {
|
||||
class WC_TPP_Cart {
|
||||
|
||||
public function __construct() {
|
||||
@@ -247,3 +248,6 @@ class WC_TPP_Cart {
|
||||
return $editable;
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Cart();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!class_exists('WC_TPP_Frontend')) {
|
||||
class WC_TPP_Frontend {
|
||||
|
||||
public function __construct() {
|
||||
@@ -182,3 +183,6 @@ class WC_TPP_Frontend {
|
||||
return $new_html;
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Frontend();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!class_exists('WC_TPP_Product_Meta')) {
|
||||
class WC_TPP_Product_Meta {
|
||||
|
||||
public function __construct() {
|
||||
@@ -169,3 +170,4 @@ class WC_TPP_Product_Meta {
|
||||
}
|
||||
|
||||
new WC_TPP_Product_Meta();
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ if (!class_exists('WC_Settings_Page')) {
|
||||
/**
|
||||
* WC_TPP_Settings class
|
||||
*/
|
||||
if (!class_exists('WC_TPP_Settings')) {
|
||||
class WC_TPP_Settings extends WC_Settings_Page {
|
||||
|
||||
/**
|
||||
@@ -139,5 +140,6 @@ class WC_TPP_Settings extends WC_Settings_Page {
|
||||
WC_Admin_Settings::save_fields($settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new WC_TPP_Settings();
|
||||
|
||||
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.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
|
||||
@@ -4,7 +4,7 @@
|
||||
* Plugin Name: WooCommerce Tier and Package Prices
|
||||
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
|
||||
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
|
||||
* Version: 1.1.7
|
||||
* Version: 1.1.17
|
||||
* Author: Marco Graetsch
|
||||
* Author URI: https://src.bundespruefstelle.ch/magdev
|
||||
* Text Domain: wc-tier-package-prices
|
||||
@@ -22,14 +22,35 @@ if (!defined('ABSPATH')) {
|
||||
}
|
||||
|
||||
// Define plugin constants
|
||||
define('WC_TPP_VERSION', '1.1.7');
|
||||
if (!defined('WC_TPP_VERSION')) {
|
||||
define('WC_TPP_VERSION', '1.1.17');
|
||||
}
|
||||
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
|
||||
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
|
||||
*/
|
||||
@@ -38,17 +59,10 @@ if (!in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get
|
||||
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
|
||||
*/
|
||||
if (!class_exists('WC_Tier_Package_Prices')) {
|
||||
class WC_Tier_Package_Prices {
|
||||
|
||||
private static $instance = null;
|
||||
@@ -78,14 +92,6 @@ class WC_Tier_Package_Prices {
|
||||
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';
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
public function declare_hpos_compatibility() {
|
||||
@@ -110,10 +116,13 @@ class WC_Tier_Package_Prices {
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize the plugin
|
||||
if (!function_exists('wc_tpp_init')) {
|
||||
function wc_tpp_init() {
|
||||
return WC_Tier_Package_Prices::get_instance();
|
||||
}
|
||||
}
|
||||
|
||||
add_action('plugins_loaded', 'wc_tpp_init', 11);
|
||||
|
||||
Reference in New Issue
Block a user