You've already forked wc-tier-and-package-prices
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 959229b9d8 | |||
| f0ab2ff755 | |||
| 4dd9b3cd62 | |||
| 9dab123209 | |||
| 3f117ae519 | |||
| 58bbd5164f | |||
| cfdbfe1504 | |||
| e4e4de82cb | |||
| af532b56eb | |||
| e2a11de80a | |||
| e40830b69b | |||
| 9765c5f119 | |||
| 5cfabedb94 | |||
| 88e30d028c | |||
| d55ada7924 | |||
| 4ece4dd69e | |||
| 3e06137559 | |||
| e0a32821ee | |||
| dea2c5f0b3 |
@@ -5,7 +5,22 @@
|
||||
"Bash(msgfmt:*)",
|
||||
"Bash(ls:*)",
|
||||
"Bash(mkdir:*)",
|
||||
"Bash(composer init:*)"
|
||||
"Bash(composer init:*)",
|
||||
"Bash(composer install:*)",
|
||||
"Bash(composer update:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nRelease version 1.1.0 - Package quantity restriction feature\n\nAdded comprehensive package quantity restriction functionality that allows\nlimiting product purchases to predefined package sizes only.\n\nFeatures:\n- Global setting to enable package quantity restrictions\n- Per-product override for quantity restrictions\n- Automatic hiding of quantity input field when restricted\n- Frontend validation with package selection UI\n- Server-side cart validation\n- User-friendly error messages\n- Complete translations for all supported languages\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 tag:*)",
|
||||
"Bash(rsync:*)",
|
||||
"Bash(zip -r:*)",
|
||||
"Bash(cat:*)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nRelease version 1.1.2 - Catalog button modification\n\nEnhanced package quantity restriction enforcement by replacing \"Add to Cart\"\nbuttons with \"View Options\" links on catalog pages for products with\nquantity restrictions. This prevents customers from attempting to add\nrestricted products directly from shop/category pages.\n\nChanges:\n- Added catalog button modification for restricted products\n- Implemented \"View Options\" button with eye icon styling\n- Created has_quantity_restriction\\(\\) helper method\n- Extended CSS loading to all WooCommerce pages\n- Added modify_catalog_add_to_cart_button\\(\\) filter method\n- Updated translations with 2 new strings \\(en_US, de_DE, de_CH_informal\\)\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(for po in *.po)",
|
||||
"Bash(do msgfmt -o \"$po%.po.mo\" \"$po\")",
|
||||
"Bash(done)",
|
||||
"Bash(git commit -m \"$\\(cat <<''EOF''\nRelease version 1.1.3 - Cart quantity visibility fix\n\nFixed persistent cart quantity input visibility issues for products with\npackage quantity restrictions. Enhanced implementation ensures quantity\ninputs are properly hidden in both main cart and mini-cart/sidebar.\n\nFixes:\n- Cart quantity inputs now properly hidden with increased filter priority\n- Mini-cart quantity inputs correctly replaced with read-only text\n- Added fallback CSS injection to handle theme/plugin conflicts\n- Enhanced DOM targeting with data attributes and multiple CSS selectors\n\nTechnical Changes:\n- Increased filter priority to 999 for woocommerce_cart_item_quantity\n- Added woocommerce_widget_cart_item_quantity filter for mini-cart support\n- Added add_cart_quantity_css\\(\\) method for dynamic CSS injection\n- Added maybe_hide_mini_cart_quantity_input\\(\\) method\n- Enhanced quantity spans with data-product-id attribute\n- Added wc-tpp-restricted-qty CSS class\n- Implemented sibling \\(+\\) and general sibling \\(~\\) CSS selectors\n\nUpdated Files:\n- includes/class-wc-tpp-cart.php \\(enhanced with mini-cart support\\)\n- wc-tier-and-package-prices.php \\(version 1.1.3\\)\n- composer.json \\(version 1.1.3\\)\n- CHANGELOG.md \\(v1.1.3 section\\)\n- All translation files \\(.pot, .po, .mo\\) updated to version 1.1.3\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(node -c:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -21,6 +21,10 @@ npm-debug.log
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
/logs
|
||||
|
||||
# Notes
|
||||
notes.*
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
|
||||
328
CHANGELOG.md
328
CHANGELOG.md
@@ -5,6 +5,334 @@ 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.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
|
||||
|
||||
### Added
|
||||
- WooCommerce Blocks support for quantity restrictions
|
||||
- `woocommerce_store_api_product_quantity_editable` filter for block-based carts
|
||||
- `block_quantity_editable()` method in WC_TPP_Cart class
|
||||
- CSS targeting for `.wc-block-components-quantity-selector` elements
|
||||
|
||||
### Enhanced
|
||||
- "View Options" button styling to match standard WooCommerce "Add to Cart" buttons
|
||||
- Button padding, font weight, and border radius for better visual consistency
|
||||
- Hover effects with smooth transitions
|
||||
|
||||
### Fixed
|
||||
- WooCommerce blocks cart quantity selector visibility for restricted products
|
||||
- WooCommerce blocks mini-cart quantity selector visibility
|
||||
|
||||
### Technical
|
||||
- Added Store API integration for block-based cart/mini-cart
|
||||
- Enhanced CSS for block cart items with product-specific selectors
|
||||
- Improved button styling with WooCommerce standard values (0.618em × 1em padding)
|
||||
- Added transition effects for better UX
|
||||
|
||||
## [1.1.3] - 2025-12-21
|
||||
|
||||
### Fixed
|
||||
- Cart quantity input visibility issue in cart and cart sidebar for restricted products
|
||||
- Enhanced filter priority (999) to ensure quantity hiding runs after other plugins
|
||||
- Mini-cart quantity input now properly hidden for restricted products
|
||||
|
||||
### Added
|
||||
- `woocommerce_widget_cart_item_quantity` filter support for mini-cart
|
||||
- `add_cart_quantity_css()` method for dynamic CSS injection
|
||||
- `data-product-id` attribute to quantity spans for targeted CSS selectors
|
||||
- CSS class `wc-tpp-restricted-qty` for improved targeting
|
||||
|
||||
### Technical
|
||||
- Increased filter priority from 10 to 999 for `woocommerce_cart_item_quantity`
|
||||
- Added `maybe_hide_mini_cart_quantity_input()` method in WC_TPP_Cart class
|
||||
- Dynamic CSS injection via `wp_head` action as fallback
|
||||
- Used both sibling (+) and general sibling (~) CSS selectors for DOM variations
|
||||
|
||||
## [1.1.2] - 2025-12-21
|
||||
|
||||
### Added
|
||||
- Catalog "View Options" button for products with quantity restrictions
|
||||
- Automatic button replacement in shop/category/archive pages
|
||||
- Eye icon (Dashicons) for "View Options" button styling
|
||||
|
||||
### Changed
|
||||
- "Add to Cart" button replaced with "View Options" link on catalog pages for restricted products
|
||||
- CSS now loads on all WooCommerce pages (shop, cart, checkout, product)
|
||||
- Catalog buttons now direct to product page instead of adding to cart
|
||||
|
||||
### Technical
|
||||
- Added `has_quantity_restriction()` static method in WC_TPP_Frontend class
|
||||
- Added `modify_catalog_add_to_cart_button()` method in WC_TPP_Frontend class
|
||||
- Extended `woocommerce_loop_add_to_cart_link` filter hook
|
||||
- CSS classes: `wc-tpp-view-options`, `wc-tpp-cart-quantity`, `wc-tpp-restriction-notice`
|
||||
- Updated `enqueue_scripts()` to load CSS on all WooCommerce pages
|
||||
|
||||
### Translations
|
||||
- Added 2 new translatable strings
|
||||
- Updated all translations (en_US, de_DE, de_CH_informal)
|
||||
- Compiled all .mo files with new strings
|
||||
|
||||
## [1.1.1] - 2025-12-21
|
||||
|
||||
### Added
|
||||
- Cart quantity field hiding when package restriction is enabled
|
||||
- Automatic read-only quantity display in cart for restricted products
|
||||
|
||||
### Changed
|
||||
- Cart quantity input replaced with plain text when restrictions apply
|
||||
- Enhanced cart display to prevent quantity modification for restricted products
|
||||
|
||||
### Fixed
|
||||
- Cart quantity bypass vulnerability for package-restricted products
|
||||
|
||||
### Technical
|
||||
- Added `maybe_hide_cart_quantity_input()` method in WC_TPP_Cart class
|
||||
- Extended `woocommerce_cart_item_quantity` filter hook
|
||||
- CSS class `wc-tpp-cart-quantity` for styled quantity display
|
||||
|
||||
## [1.1.0] - 2025-12-21
|
||||
|
||||
### Added
|
||||
- Package quantity restriction feature
|
||||
- Global setting to restrict quantities to defined package sizes
|
||||
- Per-product setting to restrict quantities to defined package sizes
|
||||
- Frontend validation preventing non-package quantities
|
||||
- Server-side cart validation for package quantities
|
||||
- User-friendly error messages showing available package sizes
|
||||
- Automatic quantity field hiding when restriction is enabled
|
||||
- Package selection UI with highlighted states
|
||||
|
||||
### Changed
|
||||
- Enhanced package pricing display template with restriction mode support
|
||||
- Improved JavaScript to handle restricted mode package selection
|
||||
- Updated frontend to show "Choose a package size below" notice in restricted mode
|
||||
|
||||
### Technical
|
||||
- Added `validate_package_quantity()` method in WC_TPP_Cart class
|
||||
- Added `maybe_hide_quantity_input()` method in WC_TPP_Frontend class
|
||||
- Extended `woocommerce_add_to_cart_validation` filter hook
|
||||
- Added `wc-tpp-restricted-mode` CSS class for styling
|
||||
- New product meta: `_wc_tpp_restrict_to_packages`
|
||||
- New global option: `wc_tpp_restrict_package_quantities`
|
||||
|
||||
### Translations
|
||||
- Added 7 new translatable strings
|
||||
- Updated all translations (en_US, de_DE, de_CH_informal)
|
||||
- Compiled all .mo files with new strings
|
||||
|
||||
## [1.0.2] - 2025-12-21
|
||||
|
||||
### Changed
|
||||
- Migrated settings to WooCommerce Settings page as dedicated tab
|
||||
- Settings now appear under WooCommerce > Settings > Tier & Package Prices
|
||||
- Improved integration with WooCommerce native settings API
|
||||
|
||||
### Added
|
||||
- WC_TPP_Settings class extending WC_Settings_Page
|
||||
- Better integration with WooCommerce settings system
|
||||
- Consistent UI with other WooCommerce settings tabs
|
||||
|
||||
### Removed
|
||||
- Standalone settings submenu (WooCommerce > Tier & Package Prices)
|
||||
- Custom settings template (templates/admin/settings-page.twig)
|
||||
|
||||
### Technical
|
||||
- Implemented WooCommerce settings filter hook (woocommerce_get_settings_pages)
|
||||
- Uses WC_Admin_Settings for rendering and saving
|
||||
- Automatic settings persistence via WooCommerce API
|
||||
|
||||
## [1.0.1] - 2025-12-21
|
||||
|
||||
### Added
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# WooCommerce Tier and Package Prices
|
||||
|
||||
__THIS PROJECT IS 100% VIBE-CODED USING CLAUDE.AI__
|
||||
|
||||
A powerful WooCommerce plugin that adds tier pricing and package pricing functionality to your products with configurable quantities at fixed prices.
|
||||
|
||||
## Features
|
||||
|
||||
@@ -50,11 +50,13 @@
|
||||
|
||||
.wc-tpp-table tbody tr {
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
transition: background-color 0.2s;
|
||||
transition: all 0.2s;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.wc-tpp-table tbody tr:hover {
|
||||
background: #f5f5f5;
|
||||
transform: translateX(2px);
|
||||
}
|
||||
|
||||
.wc-tpp-table tbody tr.wc-tpp-active-tier {
|
||||
@@ -67,6 +69,14 @@
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
.wc-tpp-tier-label {
|
||||
display: inline-block;
|
||||
margin-top: 4px;
|
||||
color: #666;
|
||||
font-style: italic;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* Package pricing */
|
||||
.wc-tpp-packages {
|
||||
display: grid;
|
||||
@@ -156,6 +166,67 @@
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Catalog "View Options" button */
|
||||
a.wc-tpp-view-options {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
position: relative;
|
||||
/* Match WooCommerce button styling */
|
||||
font-size: 1em;
|
||||
font-weight: 700;
|
||||
padding: 0.618em 1em;
|
||||
line-height: 1.5;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
a.wc-tpp-view-options::before {
|
||||
content: "\f06e";
|
||||
font-family: "dashicons";
|
||||
margin-right: 5px;
|
||||
display: inline-block;
|
||||
font-size: 1em;
|
||||
vertical-align: middle;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
/* Hover state for View Options button */
|
||||
a.wc-tpp-view-options:hover {
|
||||
opacity: 0.85;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Cart quantity display for restricted products */
|
||||
.wc-tpp-cart-quantity {
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
background: #f5f5f5;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Restriction notice */
|
||||
.wc-tpp-restriction-notice {
|
||||
padding: 10px 15px;
|
||||
background: #fff3cd;
|
||||
border: 1px solid #ffc107;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 15px;
|
||||
color: #856404;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
|
||||
/* Disabled add to cart button */
|
||||
.single_add_to_cart_button.disabled,
|
||||
.single_add_to_cart_button:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 768px) {
|
||||
.wc-tpp-packages {
|
||||
|
||||
@@ -8,8 +8,10 @@
|
||||
$(document).ready(function() {
|
||||
const $quantityInput = $('input.qty');
|
||||
const $priceDisplay = $('.woocommerce-Price-amount.amount').first();
|
||||
const $addToCartButton = $('.single_add_to_cart_button');
|
||||
const isRestrictedMode = $('.wc-tpp-package-pricing-table').hasClass('wc-tpp-restricted-mode');
|
||||
|
||||
if ($quantityInput.length === 0) {
|
||||
if ($quantityInput.length === 0 && !isRestrictedMode) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -153,9 +155,35 @@
|
||||
$('.wc-tpp-price-message').remove();
|
||||
}
|
||||
|
||||
// Toggle add to cart button state based on quantity
|
||||
function updateAddToCartButton() {
|
||||
const quantity = parseInt($quantityInput.val()) || 0;
|
||||
|
||||
if (quantity <= 0) {
|
||||
$addToCartButton.prop('disabled', true).addClass('disabled');
|
||||
} else {
|
||||
$addToCartButton.prop('disabled', false).removeClass('disabled');
|
||||
}
|
||||
}
|
||||
|
||||
// Handle quantity input changes
|
||||
$quantityInput.on('input change', function() {
|
||||
updatePriceDisplay();
|
||||
updateAddToCartButton();
|
||||
});
|
||||
|
||||
// Handle tier pricing row clicks
|
||||
$('.wc-tpp-tier-pricing-table tbody tr').on('click', function() {
|
||||
const minQty = parseInt($(this).data('min-qty'));
|
||||
|
||||
if ($quantityInput.length > 0 && !isRestrictedMode) {
|
||||
$quantityInput.val(minQty).trigger('change');
|
||||
|
||||
// Scroll to quantity input for better UX
|
||||
$('html, body').animate({
|
||||
scrollTop: $quantityInput.offset().top - 100
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
|
||||
// Handle package selection
|
||||
@@ -164,7 +192,30 @@
|
||||
const $package = $(this).closest('.wc-tpp-package');
|
||||
const qty = parseInt($package.data('qty'));
|
||||
|
||||
$quantityInput.val(qty).trigger('change');
|
||||
if (isRestrictedMode) {
|
||||
// In restricted mode, we need to set a hidden input or use data attribute
|
||||
// since the quantity field is hidden
|
||||
if ($quantityInput.length === 0) {
|
||||
// Create a hidden quantity input if it doesn't exist
|
||||
if ($('.qty-hidden-input').length === 0) {
|
||||
$('.single_add_to_cart_button').before('<input type="hidden" name="quantity" class="qty qty-hidden-input" value="1" />');
|
||||
}
|
||||
$('.qty-hidden-input').val(qty);
|
||||
} else {
|
||||
$quantityInput.val(qty);
|
||||
}
|
||||
|
||||
// Highlight selected package
|
||||
$('.wc-tpp-package').removeClass('wc-tpp-selected');
|
||||
$package.addClass('wc-tpp-selected');
|
||||
|
||||
// Update price display
|
||||
const price = parseFloat($package.data('price'));
|
||||
const unitPrice = price / qty;
|
||||
updatePrice(unitPrice, 'Package price: ' + formatPrice(price) + ' total');
|
||||
} else {
|
||||
$quantityInput.val(qty).trigger('change');
|
||||
}
|
||||
|
||||
// Scroll to add to cart button
|
||||
$('html, body').animate({
|
||||
@@ -172,8 +223,27 @@
|
||||
}, 500);
|
||||
});
|
||||
|
||||
// In restricted mode, prevent form submission if no package is selected
|
||||
if (isRestrictedMode) {
|
||||
$('form.cart').on('submit', function(e) {
|
||||
const hasSelection = $('.wc-tpp-package.wc-tpp-selected').length > 0;
|
||||
if (!hasSelection) {
|
||||
e.preventDefault();
|
||||
alert('Please select a package size before adding to cart.');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Initial update
|
||||
updatePriceDisplay();
|
||||
if (!isRestrictedMode) {
|
||||
updatePriceDisplay();
|
||||
}
|
||||
|
||||
// Initial button state check
|
||||
if ($quantityInput.length > 0 && $addToCartButton.length > 0) {
|
||||
updateAddToCartButton();
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "magdev/wc-tier-package-prices",
|
||||
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
||||
"version": "1.0.1",
|
||||
"version": "1.1.15",
|
||||
"type": "wordpress-plugin",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"authors": [
|
||||
|
||||
@@ -7,42 +7,29 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
class WC_TPP_Admin {
|
||||
if (!class_exists('WC_TPP_Admin')) {
|
||||
class WC_TPP_Admin {
|
||||
|
||||
public function __construct() {
|
||||
add_action('admin_menu', array($this, 'add_admin_menu'));
|
||||
add_action('admin_init', array($this, 'register_settings'));
|
||||
add_filter('woocommerce_get_settings_pages', array($this, 'add_settings_page'));
|
||||
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
||||
}
|
||||
|
||||
public function add_admin_menu() {
|
||||
add_submenu_page(
|
||||
'woocommerce',
|
||||
__('Tier & Package Prices', 'wc-tier-package-prices'),
|
||||
__('Tier & Package Prices', 'wc-tier-package-prices'),
|
||||
'manage_woocommerce',
|
||||
'wc-tier-package-prices',
|
||||
array($this, 'settings_page')
|
||||
);
|
||||
}
|
||||
|
||||
public function register_settings() {
|
||||
register_setting('wc_tpp_settings', 'wc_tpp_enable_tier_pricing');
|
||||
register_setting('wc_tpp_settings', 'wc_tpp_enable_package_pricing');
|
||||
register_setting('wc_tpp_settings', 'wc_tpp_display_table');
|
||||
register_setting('wc_tpp_settings', 'wc_tpp_display_position');
|
||||
/**
|
||||
* Add settings page to WooCommerce settings
|
||||
*/
|
||||
public function add_settings_page($settings) {
|
||||
$settings[] = include WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php';
|
||||
return $settings;
|
||||
}
|
||||
|
||||
public function enqueue_admin_scripts($hook) {
|
||||
if ('woocommerce_page_wc-tier-package-prices' === $hook || 'post.php' === $hook || 'post-new.php' === $hook) {
|
||||
if ('woocommerce_page_wc-settings' === $hook || 'post.php' === $hook || 'post-new.php' === $hook) {
|
||||
wp_enqueue_style('wc-tpp-admin', WC_TPP_PLUGIN_URL . 'assets/css/admin.css', array(), WC_TPP_VERSION);
|
||||
wp_enqueue_script('wc-tpp-admin', WC_TPP_PLUGIN_URL . 'assets/js/admin.js', array('jquery'), WC_TPP_VERSION, true);
|
||||
}
|
||||
}
|
||||
|
||||
public function settings_page() {
|
||||
WC_TPP_Template_Loader::get_instance()->display('admin/settings-page.twig');
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Admin();
|
||||
}
|
||||
|
||||
@@ -7,12 +7,20 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
class WC_TPP_Cart {
|
||||
if (!class_exists('WC_TPP_Cart')) {
|
||||
class WC_TPP_Cart {
|
||||
|
||||
public function __construct() {
|
||||
add_action('woocommerce_before_calculate_totals', array($this, 'apply_tier_package_pricing'), 10, 1);
|
||||
add_filter('woocommerce_cart_item_price', array($this, 'display_cart_item_price'), 10, 3);
|
||||
add_filter('woocommerce_cart_item_subtotal', array($this, 'display_cart_item_subtotal'), 10, 3);
|
||||
add_filter('woocommerce_add_to_cart_validation', array($this, 'validate_package_quantity'), 10, 3);
|
||||
add_filter('woocommerce_cart_item_quantity', array($this, 'maybe_hide_cart_quantity_input'), 999, 3);
|
||||
add_filter('woocommerce_widget_cart_item_quantity', array($this, 'maybe_hide_mini_cart_quantity_input'), 999, 3);
|
||||
add_action('wp_head', array($this, 'add_cart_quantity_css'));
|
||||
|
||||
// WooCommerce Blocks support
|
||||
add_filter('woocommerce_store_api_product_quantity_editable', array($this, 'block_quantity_editable'), 10, 2);
|
||||
}
|
||||
|
||||
public function apply_tier_package_pricing($cart) {
|
||||
@@ -89,6 +97,157 @@ class WC_TPP_Cart {
|
||||
}
|
||||
return $subtotal;
|
||||
}
|
||||
|
||||
public function validate_package_quantity($passed, $product_id, $quantity) {
|
||||
// Check if restriction is enabled globally or for this product
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
|
||||
if (!$global_restrict && !$product_restrict) {
|
||||
return $passed;
|
||||
}
|
||||
|
||||
// Get packages for this product
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
if (empty($packages) || !is_array($packages)) {
|
||||
return $passed;
|
||||
}
|
||||
|
||||
// Check if the quantity matches any package
|
||||
$valid_quantity = false;
|
||||
$available_quantities = array();
|
||||
|
||||
foreach ($packages as $package) {
|
||||
$available_quantities[] = $package['qty'];
|
||||
if ($quantity == $package['qty']) {
|
||||
$valid_quantity = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$valid_quantity) {
|
||||
$product = wc_get_product($product_id);
|
||||
$product_name = $product ? $product->get_name() : __('this product', 'wc-tier-package-prices');
|
||||
|
||||
wc_add_notice(
|
||||
sprintf(
|
||||
__('The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s', 'wc-tier-package-prices'),
|
||||
$quantity,
|
||||
$product_name,
|
||||
implode(', ', $available_quantities)
|
||||
),
|
||||
'error'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
return $passed;
|
||||
}
|
||||
|
||||
public function maybe_hide_cart_quantity_input($product_quantity, $cart_item_key, $cart_item) {
|
||||
$product_id = $cart_item['product_id'];
|
||||
|
||||
// Check if restriction is enabled globally or for this product
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
|
||||
// Get packages for this product
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
// If restriction is enabled and packages exist, show quantity as text only
|
||||
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||
return sprintf('<span class="wc-tpp-cart-quantity wc-tpp-restricted-qty" data-product-id="%d">%s</span>',
|
||||
$product_id,
|
||||
$cart_item['quantity']
|
||||
);
|
||||
}
|
||||
|
||||
return $product_quantity;
|
||||
}
|
||||
|
||||
public function maybe_hide_mini_cart_quantity_input($product_quantity, $cart_item, $cart_item_key) {
|
||||
$product_id = $cart_item['product_id'];
|
||||
|
||||
// Check if restriction is enabled globally or for this product
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
|
||||
// Get packages for this product
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
// If restriction is enabled and packages exist, show quantity as text only
|
||||
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||
return sprintf('<span class="wc-tpp-cart-quantity wc-tpp-restricted-qty" data-product-id="%d">%s ×</span>',
|
||||
$product_id,
|
||||
$cart_item['quantity']
|
||||
);
|
||||
}
|
||||
|
||||
return $product_quantity;
|
||||
}
|
||||
|
||||
public function add_cart_quantity_css() {
|
||||
// Get all cart items and check which products have restrictions
|
||||
if (!function_exists('WC') || !WC()->cart || is_admin()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$restricted_products = array();
|
||||
foreach (WC()->cart->get_cart() as $cart_item) {
|
||||
$product_id = $cart_item['product_id'];
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||
$restricted_products[] = $product_id;
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($restricted_products)) {
|
||||
echo '<style type="text/css">';
|
||||
foreach ($restricted_products as $product_id) {
|
||||
// Hide quantity inputs for restricted products in cart (classic cart)
|
||||
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
||||
echo '.cart_item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity,';
|
||||
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] + .quantity,';
|
||||
echo '.woocommerce-mini-cart-item .wc-tpp-restricted-qty[data-product-id="' . esc_attr($product_id) . '"] ~ .quantity { display: none !important; }';
|
||||
|
||||
// Hide WooCommerce blocks quantity selector for restricted products
|
||||
echo '.wc-block-cart-item[data-product-id="' . esc_attr($product_id) . '"] .wc-block-components-quantity-selector,';
|
||||
echo '.wc-block-mini-cart__items .wc-block-cart-item[data-product-id="' . esc_attr($product_id) . '"] .wc-block-components-quantity-selector { display: none !important; }';
|
||||
}
|
||||
echo '</style>';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make quantity non-editable for restricted products in WooCommerce blocks
|
||||
*
|
||||
* @param bool $editable Whether the quantity is editable
|
||||
* @param array $cart_item Cart item data
|
||||
* @return bool
|
||||
*/
|
||||
public function block_quantity_editable($editable, $cart_item) {
|
||||
$product_id = $cart_item['id'] ?? ($cart_item['product_id'] ?? 0);
|
||||
|
||||
if (!$product_id) {
|
||||
return $editable;
|
||||
}
|
||||
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
// If restriction is enabled and packages exist, make quantity non-editable
|
||||
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $editable;
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Cart();
|
||||
}
|
||||
|
||||
@@ -7,18 +7,28 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
class WC_TPP_Frontend {
|
||||
if (!class_exists('WC_TPP_Frontend')) {
|
||||
class WC_TPP_Frontend {
|
||||
|
||||
public function __construct() {
|
||||
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
|
||||
add_action('woocommerce_before_add_to_cart_button', array($this, 'display_pricing_table_before'), 20);
|
||||
add_action('woocommerce_after_add_to_cart_button', array($this, 'display_pricing_table_after'), 10);
|
||||
add_action('woocommerce_single_product_summary', array($this, 'display_pricing_table_after_price'), 15);
|
||||
add_action('woocommerce_before_add_to_cart_quantity', array($this, 'maybe_hide_quantity_input'));
|
||||
|
||||
// Modify catalog add to cart button for restricted products
|
||||
add_filter('woocommerce_loop_add_to_cart_link', array($this, 'modify_catalog_add_to_cart_button'), 10, 2);
|
||||
}
|
||||
|
||||
public function enqueue_scripts() {
|
||||
if (is_product()) {
|
||||
// Enqueue CSS on all WooCommerce pages (for catalog buttons and cart)
|
||||
if (is_woocommerce() || is_cart() || is_checkout() || is_product()) {
|
||||
wp_enqueue_style('wc-tpp-frontend', WC_TPP_PLUGIN_URL . 'assets/css/frontend.css', array(), WC_TPP_VERSION);
|
||||
}
|
||||
|
||||
// Enqueue JS only on product pages
|
||||
if (is_product()) {
|
||||
wp_enqueue_script('wc-tpp-frontend', WC_TPP_PLUGIN_URL . 'assets/js/frontend.js', array('jquery'), WC_TPP_VERSION, true);
|
||||
|
||||
// Localize script with currency settings
|
||||
@@ -50,6 +60,24 @@ class WC_TPP_Frontend {
|
||||
}
|
||||
}
|
||||
|
||||
public function maybe_hide_quantity_input() {
|
||||
global $product;
|
||||
|
||||
if (!$product || !is_a($product, 'WC_Product')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$product_id = $product->get_id();
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
// Hide quantity input if restriction is enabled and packages exist
|
||||
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||
echo '<style>.quantity { display: none !important; }</style>';
|
||||
}
|
||||
}
|
||||
|
||||
public function display_pricing_table() {
|
||||
global $product;
|
||||
|
||||
@@ -60,6 +88,8 @@ class WC_TPP_Frontend {
|
||||
$product_id = $product->get_id();
|
||||
$tiers = get_post_meta($product_id, '_wc_tpp_tiers', true);
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
|
||||
if (empty($tiers) && empty($packages)) {
|
||||
return;
|
||||
@@ -68,7 +98,8 @@ class WC_TPP_Frontend {
|
||||
WC_TPP_Template_Loader::get_instance()->display('frontend/pricing-table.twig', array(
|
||||
'product' => $product,
|
||||
'tiers' => $tiers,
|
||||
'packages' => $packages
|
||||
'packages' => $packages,
|
||||
'restrict_to_packages' => $global_restrict || $product_restrict
|
||||
));
|
||||
}
|
||||
|
||||
@@ -104,6 +135,54 @@ class WC_TPP_Frontend {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a product has quantity restrictions enabled
|
||||
*
|
||||
* @param int $product_id Product ID
|
||||
* @return bool
|
||||
*/
|
||||
public static function has_quantity_restriction($product_id) {
|
||||
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||
|
||||
return ($global_restrict || $product_restrict) && !empty($packages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify catalog add to cart button for products with quantity restrictions
|
||||
*
|
||||
* @param string $html Add to cart button HTML
|
||||
* @param WC_Product $product Product object
|
||||
* @return string Modified HTML
|
||||
*/
|
||||
public function modify_catalog_add_to_cart_button($html, $product) {
|
||||
if (!$product || !is_a($product, 'WC_Product')) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
$product_id = $product->get_id();
|
||||
|
||||
// Check if product has quantity restrictions
|
||||
if (!self::has_quantity_restriction($product_id)) {
|
||||
return $html;
|
||||
}
|
||||
|
||||
// Replace add to cart button with "View Options" link
|
||||
$product_url = esc_url($product->get_permalink());
|
||||
$button_text = esc_html__('View Options', 'wc-tier-package-prices');
|
||||
|
||||
$new_html = sprintf(
|
||||
'<a href="%s" class="button wc-tpp-view-options product_type_simple" aria-label="%s">%s</a>',
|
||||
$product_url,
|
||||
esc_attr(sprintf(__('View options for %s', 'wc-tier-package-prices'), $product->get_name())),
|
||||
$button_text
|
||||
);
|
||||
|
||||
return $new_html;
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Frontend();
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
class WC_TPP_Product_Meta {
|
||||
if (!class_exists('WC_TPP_Product_Meta')) {
|
||||
class WC_TPP_Product_Meta {
|
||||
|
||||
public function __construct() {
|
||||
add_action('woocommerce_product_options_pricing', array($this, 'add_tier_pricing_fields'));
|
||||
@@ -69,10 +70,19 @@ class WC_TPP_Product_Meta {
|
||||
<p class="form-field">
|
||||
<button type="button" class="button wc-tpp-add-package"><?php _e('Add Package', 'wc-tier-package-prices'); ?></button>
|
||||
</p>
|
||||
|
||||
<?php
|
||||
woocommerce_wp_checkbox(array(
|
||||
'id' => '_wc_tpp_restrict_to_packages',
|
||||
'label' => __('Restrict to Package Quantities', 'wc-tier-package-prices'),
|
||||
'description' => __('Only allow quantities defined in packages above', 'wc-tier-package-prices'),
|
||||
'desc_tip' => true,
|
||||
));
|
||||
?>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="wc-tpp-tier-row-template">
|
||||
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '')); ?>
|
||||
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '', 'label' => '')); ?>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="wc-tpp-package-row-template">
|
||||
@@ -118,7 +128,8 @@ class WC_TPP_Product_Meta {
|
||||
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
|
||||
$tiers[] = array(
|
||||
'min_qty' => absint($tier['min_qty']),
|
||||
'price' => wc_format_decimal($tier['price'])
|
||||
'price' => wc_format_decimal($tier['price']),
|
||||
'label' => sanitize_text_field($tier['label'] ?? '')
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -151,7 +162,12 @@ class WC_TPP_Product_Meta {
|
||||
} else {
|
||||
delete_post_meta($post_id, '_wc_tpp_packages');
|
||||
}
|
||||
|
||||
// Save package quantity restriction setting
|
||||
$restrict_to_packages = isset($_POST['_wc_tpp_restrict_to_packages']) ? 'yes' : 'no';
|
||||
update_post_meta($post_id, '_wc_tpp_restrict_to_packages', $restrict_to_packages);
|
||||
}
|
||||
}
|
||||
|
||||
new WC_TPP_Product_Meta();
|
||||
}
|
||||
|
||||
145
includes/class-wc-tpp-settings.php
Normal file
145
includes/class-wc-tpp-settings.php
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Settings Integration
|
||||
*
|
||||
* Adds Tier & Package Prices settings to WooCommerce Settings > Advanced tab
|
||||
*
|
||||
* @package WC_Tier_Package_Prices
|
||||
*/
|
||||
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!class_exists('WC_Settings_Page')) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC_TPP_Settings class
|
||||
*/
|
||||
if (!class_exists('WC_TPP_Settings')) {
|
||||
class WC_TPP_Settings extends WC_Settings_Page {
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->id = 'tier_package_prices';
|
||||
$this->label = __('Tier & Package Prices', 'wc-tier-package-prices');
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sections
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_sections() {
|
||||
$sections = array(
|
||||
'' => __('General', 'wc-tier-package-prices'),
|
||||
);
|
||||
|
||||
return apply_filters('woocommerce_get_sections_' . $this->id, $sections);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get settings array
|
||||
*
|
||||
* @param string $current_section Current section name.
|
||||
* @return array
|
||||
*/
|
||||
public function get_settings($current_section = '') {
|
||||
$settings = array();
|
||||
|
||||
if ('' === $current_section) {
|
||||
$settings = array(
|
||||
array(
|
||||
'title' => __('Tier & Package Prices Settings', 'wc-tier-package-prices'),
|
||||
'type' => 'title',
|
||||
'desc' => __('Configure tier pricing and package pricing options for your WooCommerce products.', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_settings',
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Enable Tier Pricing', 'wc-tier-package-prices'),
|
||||
'desc' => __('Enable tier pricing for products', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_enable_tier_pricing',
|
||||
'default' => 'yes',
|
||||
'type' => 'checkbox',
|
||||
'desc_tip' => __('Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities.', 'wc-tier-package-prices'),
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Enable Package Pricing', 'wc-tier-package-prices'),
|
||||
'desc' => __('Enable fixed-price packages for products', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_enable_package_pricing',
|
||||
'default' => 'yes',
|
||||
'type' => 'checkbox',
|
||||
'desc_tip' => __('Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100.', 'wc-tier-package-prices'),
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Display Pricing Table', 'wc-tier-package-prices'),
|
||||
'desc' => __('Show tier and package pricing table on product pages', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_display_table',
|
||||
'default' => 'yes',
|
||||
'type' => 'checkbox',
|
||||
'desc_tip' => __('Display the pricing table to customers on product pages.', 'wc-tier-package-prices'),
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Display Position', 'wc-tier-package-prices'),
|
||||
'desc' => __('Choose where to display the pricing table on product pages.', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_display_position',
|
||||
'default' => 'after_add_to_cart',
|
||||
'type' => 'select',
|
||||
'class' => 'wc-enhanced-select',
|
||||
'css' => 'min-width:300px;',
|
||||
'desc_tip' => true,
|
||||
'options' => array(
|
||||
'before_add_to_cart' => __('Before Add to Cart Button', 'wc-tier-package-prices'),
|
||||
'after_add_to_cart' => __('After Add to Cart Button', 'wc-tier-package-prices'),
|
||||
'after_price' => __('After Price', 'wc-tier-package-prices'),
|
||||
),
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Restrict to Package Quantities', 'wc-tier-package-prices'),
|
||||
'desc' => __('Limit quantities to defined package sizes only', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_restrict_package_quantities',
|
||||
'default' => 'no',
|
||||
'type' => 'checkbox',
|
||||
'desc_tip' => __('When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons.', 'wc-tier-package-prices'),
|
||||
),
|
||||
|
||||
array(
|
||||
'type' => 'sectionend',
|
||||
'id' => 'wc_tpp_settings',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return apply_filters('woocommerce_get_settings_' . $this->id, $settings, $current_section);
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the settings
|
||||
*/
|
||||
public function output() {
|
||||
$settings = $this->get_settings();
|
||||
WC_Admin_Settings::output_fields($settings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save settings
|
||||
*/
|
||||
public function save() {
|
||||
$settings = $this->get_settings();
|
||||
WC_Admin_Settings::save_fields($settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new WC_TPP_Settings();
|
||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
||||
# This file is distributed under the GPL v2 or later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.0.0\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"
|
||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||
@@ -23,37 +23,81 @@ msgstr "WooCommerce Staffel- und Paketpreise benötigt eine installierte und akt
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:21
|
||||
#: includes/class-wc-tpp-admin.php:22
|
||||
#: includes/class-wc-tpp-settings.php:28
|
||||
msgid "Tier & Package Prices"
|
||||
msgstr "Staffel- & Paketpreise"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:40
|
||||
msgid "General"
|
||||
msgstr "Allgemein"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:58
|
||||
msgid "Tier & Package Prices Settings"
|
||||
msgstr "Staffel- & Paketpreise Einstellungen"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:60
|
||||
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||
msgstr "Konfiguriere Staffelpreise und Paketpreise für deine WooCommerce-Produkte."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:54
|
||||
#: includes/class-wc-tpp-settings.php:65
|
||||
msgid "Enable Tier Pricing"
|
||||
msgstr "Staffelpreise aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:58
|
||||
#: includes/class-wc-tpp-settings.php:66
|
||||
msgid "Enable tier pricing for products"
|
||||
msgstr "Staffelpreise für Produkte aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:70
|
||||
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||
msgstr "Ermöglicht mengenbasierte Preisstaffeln. Kunden erhalten reduzierte Preise beim Kauf grösserer Mengen."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:63
|
||||
#: includes/class-wc-tpp-settings.php:74
|
||||
msgid "Enable Package Pricing"
|
||||
msgstr "Paketpreise aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:67
|
||||
#: includes/class-wc-tpp-settings.php:75
|
||||
msgid "Enable fixed-price packages for products"
|
||||
msgstr "Festpreis-Pakete für Produkte aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:79
|
||||
msgid "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||
msgstr "Ermöglicht Festpreis-Pakete mit bestimmten Mengen. Zum Beispiel: 10 Stück für CHF 50.-, 25 Stück für CHF 100.-."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:72
|
||||
#: includes/class-wc-tpp-settings.php:83
|
||||
msgid "Display Pricing Table"
|
||||
msgstr "Preistabelle anzeigen"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:76
|
||||
#: includes/class-wc-tpp-settings.php:84
|
||||
msgid "Show tier and package pricing table on product pages"
|
||||
msgstr "Staffel- und Paketpreis-Tabelle auf Produktseiten anzeigen"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:88
|
||||
msgid "Display the pricing table to customers on product pages."
|
||||
msgstr "Zeigt die Preistabelle den Kunden auf Produktseiten an."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:81
|
||||
#: includes/class-wc-tpp-settings.php:92
|
||||
msgid "Display Position"
|
||||
msgstr "Anzeigeposition"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:93
|
||||
msgid "Choose where to display the pricing table on product pages."
|
||||
msgstr "Wähle, wo die Preistabelle auf Produktseiten angezeigt werden soll."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:101
|
||||
msgid "Before Add to Cart Button"
|
||||
msgstr "Vor \"In den Warenkorb\"-Button"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:102
|
||||
msgid "After Add to Cart Button"
|
||||
msgstr "Nach \"In den Warenkorb\"-Button"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:85
|
||||
msgid "Before Add to Cart"
|
||||
msgstr "Vor \"In den Warenkorb\""
|
||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
||||
msgstr "Nach \"In den Warenkorb\""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:87
|
||||
#: includes/class-wc-tpp-settings.php:103
|
||||
msgid "After Price"
|
||||
msgstr "Nach dem Preis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:108
|
||||
#: includes/class-wc-tpp-product-meta.php:76
|
||||
msgid "Restrict to Package Quantities"
|
||||
msgstr "Auf Paketmengen beschränken"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:109
|
||||
msgid "Limit quantities to defined package sizes only"
|
||||
msgstr "Mengen nur auf definierte Paketgrössen beschränken"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:113
|
||||
msgid "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons."
|
||||
msgstr "Wenn aktiviert, kannst du Produkte nur in den genau definierten Paketmengen kaufen. Das Mengeneingabefeld wird ausgeblendet und durch Paketauswahl-Buttons ersetzt."
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:23
|
||||
msgid "Tier Pricing"
|
||||
msgstr "Staffelpreise"
|
||||
@@ -90,6 +148,10 @@ msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stüc
|
||||
msgid "Add Package"
|
||||
msgstr "Paket hinzufügen"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:77
|
||||
msgid "Only allow quantities defined in packages above"
|
||||
msgstr "Nur oben definierte Paketmengen zulassen"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:90
|
||||
msgid "Minimum Quantity"
|
||||
msgstr "Mindestmenge"
|
||||
@@ -142,6 +204,10 @@ msgstr "Du sparst"
|
||||
msgid "Package Deals"
|
||||
msgstr "Paketangebote"
|
||||
|
||||
#: templates/frontend/package-pricing-display.twig:11
|
||||
msgid "Choose a package size below"
|
||||
msgstr "Wähle unten eine Paketgrösse"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:123
|
||||
msgid "pieces"
|
||||
msgstr "Stück"
|
||||
@@ -161,3 +227,19 @@ msgstr "Paketpreis"
|
||||
#: includes/class-wc-tpp-cart.php:66
|
||||
msgid "Volume discount"
|
||||
msgstr "Mengenrabatt"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:124
|
||||
msgid "this product"
|
||||
msgstr "dieses Produkt"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:128
|
||||
msgid "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s"
|
||||
msgstr "Die Menge %1$d ist für %2$s nicht verfügbar. Bitte wähle aus den verfügbaren Paketgrössen: %3$s"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:173
|
||||
msgid "View Options"
|
||||
msgstr "Optionen ansehen"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:178
|
||||
msgid "View options for %s"
|
||||
msgstr "Optionen für %s ansehen"
|
||||
|
||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
||||
# This file is distributed under the GPL v2 or later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.0.0\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"
|
||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||
@@ -23,37 +23,81 @@ msgstr "WooCommerce Staffel- und Paketpreise erfordert, dass WooCommerce install
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:21
|
||||
#: includes/class-wc-tpp-admin.php:22
|
||||
#: includes/class-wc-tpp-settings.php:28
|
||||
msgid "Tier & Package Prices"
|
||||
msgstr "Staffel- & Paketpreise"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:40
|
||||
msgid "General"
|
||||
msgstr "Allgemein"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:58
|
||||
msgid "Tier & Package Prices Settings"
|
||||
msgstr "Staffel- & Paketpreise Einstellungen"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:60
|
||||
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||
msgstr "Konfigurieren Sie Staffelpreise und Paketpreise für Ihre WooCommerce-Produkte."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:54
|
||||
#: includes/class-wc-tpp-settings.php:65
|
||||
msgid "Enable Tier Pricing"
|
||||
msgstr "Staffelpreise aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:58
|
||||
#: includes/class-wc-tpp-settings.php:66
|
||||
msgid "Enable tier pricing for products"
|
||||
msgstr "Staffelpreise für Produkte aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:70
|
||||
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||
msgstr "Ermöglicht mengenbasierte Preisstaffeln. Kunden erhalten reduzierte Preise beim Kauf größerer Mengen."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:63
|
||||
#: includes/class-wc-tpp-settings.php:74
|
||||
msgid "Enable Package Pricing"
|
||||
msgstr "Paketpreise aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:67
|
||||
#: includes/class-wc-tpp-settings.php:75
|
||||
msgid "Enable fixed-price packages for products"
|
||||
msgstr "Festpreis-Pakete für Produkte aktivieren"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:79
|
||||
msgid "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||
msgstr "Ermöglicht Festpreis-Pakete mit bestimmten Mengen. Zum Beispiel: 10 Stück für 50€, 25 Stück für 100€."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:72
|
||||
#: includes/class-wc-tpp-settings.php:83
|
||||
msgid "Display Pricing Table"
|
||||
msgstr "Preistabelle anzeigen"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:76
|
||||
#: includes/class-wc-tpp-settings.php:84
|
||||
msgid "Show tier and package pricing table on product pages"
|
||||
msgstr "Staffel- und Paketpreis-Tabelle auf Produktseiten anzeigen"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:88
|
||||
msgid "Display the pricing table to customers on product pages."
|
||||
msgstr "Zeigt die Preistabelle den Kunden auf Produktseiten an."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:81
|
||||
#: includes/class-wc-tpp-settings.php:92
|
||||
msgid "Display Position"
|
||||
msgstr "Anzeigeposition"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:93
|
||||
msgid "Choose where to display the pricing table on product pages."
|
||||
msgstr "Wählen Sie, wo die Preistabelle auf Produktseiten angezeigt werden soll."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:101
|
||||
msgid "Before Add to Cart Button"
|
||||
msgstr "Vor \"In den Warenkorb\"-Button"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:102
|
||||
msgid "After Add to Cart Button"
|
||||
msgstr "Nach \"In den Warenkorb\"-Button"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:85
|
||||
msgid "Before Add to Cart"
|
||||
msgstr "Vor \"In den Warenkorb\""
|
||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
||||
msgstr "Nach \"In den Warenkorb\""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:87
|
||||
#: includes/class-wc-tpp-settings.php:103
|
||||
msgid "After Price"
|
||||
msgstr "Nach dem Preis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:108
|
||||
#: includes/class-wc-tpp-product-meta.php:76
|
||||
msgid "Restrict to Package Quantities"
|
||||
msgstr "Auf Paketmengen beschränken"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:109
|
||||
msgid "Limit quantities to defined package sizes only"
|
||||
msgstr "Mengen nur auf definierte Paketgrößen beschränken"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:113
|
||||
msgid "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons."
|
||||
msgstr "Wenn aktiviert, können Kunden Produkte nur in den genau definierten Paketmengen kaufen. Das Mengeneingabefeld wird ausgeblendet und durch Paketauswahl-Buttons ersetzt."
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:23
|
||||
msgid "Tier Pricing"
|
||||
msgstr "Staffelpreise"
|
||||
@@ -90,6 +148,10 @@ msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stüc
|
||||
msgid "Add Package"
|
||||
msgstr "Paket hinzufügen"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:77
|
||||
msgid "Only allow quantities defined in packages above"
|
||||
msgstr "Nur oben definierte Paketmengen zulassen"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:90
|
||||
msgid "Minimum Quantity"
|
||||
msgstr "Mindestmenge"
|
||||
@@ -142,6 +204,10 @@ msgstr "Sie sparen"
|
||||
msgid "Package Deals"
|
||||
msgstr "Paketangebote"
|
||||
|
||||
#: templates/frontend/package-pricing-display.twig:11
|
||||
msgid "Choose a package size below"
|
||||
msgstr "Wählen Sie unten eine Paketgröße"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:123
|
||||
msgid "pieces"
|
||||
msgstr "Stück"
|
||||
@@ -161,3 +227,19 @@ msgstr "Paketpreis"
|
||||
#: includes/class-wc-tpp-cart.php:66
|
||||
msgid "Volume discount"
|
||||
msgstr "Mengenrabatt"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:124
|
||||
msgid "this product"
|
||||
msgstr "dieses Produkt"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:128
|
||||
msgid "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s"
|
||||
msgstr "Die Menge %1$d ist für %2$s nicht verfügbar. Bitte wählen Sie aus den verfügbaren Paketgrößen: %3$s"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:173
|
||||
msgid "View Options"
|
||||
msgstr "Optionen ansehen"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:178
|
||||
msgid "View options for %s"
|
||||
msgstr "Optionen für %s ansehen"
|
||||
|
||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
||||
# This file is distributed under the GPL v2 or later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.0.0\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"
|
||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||
@@ -23,37 +23,81 @@ msgstr "WooCommerce Tier and Package Prices requires WooCommerce to be installed
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:21
|
||||
#: includes/class-wc-tpp-admin.php:22
|
||||
#: includes/class-wc-tpp-settings.php:28
|
||||
msgid "Tier & Package Prices"
|
||||
msgstr "Tier & Package Prices"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:40
|
||||
msgid "General"
|
||||
msgstr "General"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:58
|
||||
msgid "Tier & Package Prices Settings"
|
||||
msgstr "Tier & Package Prices Settings"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:60
|
||||
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||
msgstr "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:54
|
||||
#: includes/class-wc-tpp-settings.php:65
|
||||
msgid "Enable Tier Pricing"
|
||||
msgstr "Enable Tier Pricing"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:58
|
||||
#: includes/class-wc-tpp-settings.php:66
|
||||
msgid "Enable tier pricing for products"
|
||||
msgstr "Enable tier pricing for products"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:70
|
||||
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||
msgstr "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:63
|
||||
#: includes/class-wc-tpp-settings.php:74
|
||||
msgid "Enable Package Pricing"
|
||||
msgstr "Enable Package Pricing"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:67
|
||||
#: includes/class-wc-tpp-settings.php:75
|
||||
msgid "Enable fixed-price packages for products"
|
||||
msgstr "Enable fixed-price packages for products"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:79
|
||||
msgid "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||
msgstr "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:72
|
||||
#: includes/class-wc-tpp-settings.php:83
|
||||
msgid "Display Pricing Table"
|
||||
msgstr "Display Pricing Table"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:76
|
||||
#: includes/class-wc-tpp-settings.php:84
|
||||
msgid "Show tier and package pricing table on product pages"
|
||||
msgstr "Show tier and package pricing table on product pages"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:88
|
||||
msgid "Display the pricing table to customers on product pages."
|
||||
msgstr "Display the pricing table to customers on product pages."
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:81
|
||||
#: includes/class-wc-tpp-settings.php:92
|
||||
msgid "Display Position"
|
||||
msgstr "Display Position"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:93
|
||||
msgid "Choose where to display the pricing table on product pages."
|
||||
msgstr "Choose where to display the pricing table on product pages."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:101
|
||||
msgid "Before Add to Cart Button"
|
||||
msgstr "Before Add to Cart Button"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:102
|
||||
msgid "After Add to Cart Button"
|
||||
msgstr "After Add to Cart Button"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:85
|
||||
msgid "Before Add to Cart"
|
||||
msgstr "Before Add to Cart"
|
||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
||||
msgstr "After Add to Cart"
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:87
|
||||
#: includes/class-wc-tpp-settings.php:103
|
||||
msgid "After Price"
|
||||
msgstr "After Price"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:108
|
||||
#: includes/class-wc-tpp-product-meta.php:76
|
||||
msgid "Restrict to Package Quantities"
|
||||
msgstr "Restrict to Package Quantities"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:109
|
||||
msgid "Limit quantities to defined package sizes only"
|
||||
msgstr "Limit quantities to defined package sizes only"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:113
|
||||
msgid "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons."
|
||||
msgstr "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons."
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:23
|
||||
msgid "Tier Pricing"
|
||||
msgstr "Tier Pricing"
|
||||
@@ -90,6 +148,10 @@ msgstr "Set fixed-price packages with specific quantities. For example: 10 piece
|
||||
msgid "Add Package"
|
||||
msgstr "Add Package"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:77
|
||||
msgid "Only allow quantities defined in packages above"
|
||||
msgstr "Only allow quantities defined in packages above"
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:90
|
||||
msgid "Minimum Quantity"
|
||||
msgstr "Minimum Quantity"
|
||||
@@ -142,6 +204,10 @@ msgstr "You Save"
|
||||
msgid "Package Deals"
|
||||
msgstr "Package Deals"
|
||||
|
||||
#: templates/frontend/package-pricing-display.twig:11
|
||||
msgid "Choose a package size below"
|
||||
msgstr "Choose a package size below"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:123
|
||||
msgid "pieces"
|
||||
msgstr "pieces"
|
||||
@@ -161,3 +227,19 @@ msgstr "Package price"
|
||||
#: includes/class-wc-tpp-cart.php:66
|
||||
msgid "Volume discount"
|
||||
msgstr "Volume discount"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:124
|
||||
msgid "this product"
|
||||
msgstr "this product"
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:128
|
||||
msgid "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s"
|
||||
msgstr "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:173
|
||||
msgid "View Options"
|
||||
msgstr "View Options"
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:178
|
||||
msgid "View options for %s"
|
||||
msgstr "View options for %s"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# This file is distributed under the GPL v2 or later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.0.0\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"
|
||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -14,55 +14,96 @@ msgstr ""
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
"X-Domain: wc-tier-package-prices\n"
|
||||
|
||||
#: wc-tier-and-package-prices.php:41
|
||||
#: wc-tier-and-package-prices.php:44
|
||||
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:21
|
||||
#: includes/class-wc-tpp-admin.php:22
|
||||
#: includes/class-wc-tpp-settings.php:28
|
||||
#: includes/class-wc-tpp-settings.php:58
|
||||
msgid "Tier & Package Prices"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:54
|
||||
#: includes/class-wc-tpp-settings.php:40
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:58
|
||||
msgid "Tier & Package Prices Settings"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:60
|
||||
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:65
|
||||
msgid "Enable Tier Pricing"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:58
|
||||
#: includes/class-wc-tpp-settings.php:66
|
||||
msgid "Enable tier pricing for products"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:63
|
||||
#: includes/class-wc-tpp-settings.php:70
|
||||
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:74
|
||||
msgid "Enable Package Pricing"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:67
|
||||
#: includes/class-wc-tpp-settings.php:75
|
||||
msgid "Enable fixed-price packages for products"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:72
|
||||
#: includes/class-wc-tpp-settings.php:79
|
||||
msgid "Allow fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:83
|
||||
msgid "Display Pricing Table"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:76
|
||||
#: includes/class-wc-tpp-settings.php:84
|
||||
msgid "Show tier and package pricing table on product pages"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:81
|
||||
#: includes/class-wc-tpp-settings.php:88
|
||||
msgid "Display the pricing table to customers on product pages."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:92
|
||||
msgid "Display Position"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:85
|
||||
msgid "Before Add to Cart"
|
||||
#: includes/class-wc-tpp-settings.php:93
|
||||
msgid "Choose where to display the pricing table on product pages."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:86
|
||||
msgid "After Add to Cart"
|
||||
#: includes/class-wc-tpp-settings.php:101
|
||||
msgid "Before Add to Cart Button"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-admin.php:87
|
||||
#: includes/class-wc-tpp-settings.php:102
|
||||
msgid "After Add to Cart Button"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:103
|
||||
msgid "After Price"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:108
|
||||
#: includes/class-wc-tpp-product-meta.php:76
|
||||
msgid "Restrict to Package Quantities"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:109
|
||||
msgid "Limit quantities to defined package sizes only"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php:113
|
||||
msgid "When enabled, customers can only purchase products in the exact quantities defined in packages. The quantity input field will be hidden and replaced with package selection buttons."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:23
|
||||
msgid "Tier Pricing"
|
||||
msgstr ""
|
||||
@@ -87,80 +128,105 @@ msgstr ""
|
||||
msgid "Add Package"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:90
|
||||
#: includes/class-wc-tpp-product-meta.php:77
|
||||
msgid "Only allow quantities defined in packages above"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/tier-row.twig:9
|
||||
msgid "Minimum Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:91
|
||||
#: templates/admin/tier-row.twig:13
|
||||
#: templates/admin/package-row.twig:13
|
||||
msgid "e.g., 10"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:94
|
||||
#: templates/admin/tier-row.twig:16
|
||||
msgid "Price per Unit"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:95
|
||||
#: includes/class-wc-tpp-product-meta.php:114
|
||||
#: templates/admin/tier-row.twig:21
|
||||
msgid "e.g., 9.99"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:97
|
||||
#: includes/class-wc-tpp-product-meta.php:120
|
||||
#: templates/admin/tier-row.twig:25
|
||||
#: templates/admin/package-row.twig:30
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:109
|
||||
#: templates/admin/package-row.twig:9
|
||||
#: templates/frontend/tier-pricing-table.twig:13
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:113
|
||||
#: templates/admin/package-row.twig:20
|
||||
msgid "Fixed Price"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:117
|
||||
#: templates/admin/package-row.twig:18
|
||||
msgid "e.g., 99.99"
|
||||
msgstr ""
|
||||
|
||||
#: templates/admin/package-row.twig:24
|
||||
msgid "Label (Optional)"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-product-meta.php:118
|
||||
#: templates/admin/package-row.twig:29
|
||||
msgid "e.g., Starter Pack"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:71
|
||||
#: templates/frontend/tier-pricing-table.twig:9
|
||||
msgid "Volume Discounts"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:75
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:76
|
||||
#: templates/frontend/tier-pricing-table.twig:14
|
||||
msgid "Price per Unit"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:77
|
||||
#: templates/frontend/tier-pricing-table.twig:15
|
||||
msgid "You Save"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:110
|
||||
#: templates/frontend/package-pricing-display.twig:8
|
||||
msgid "Package Deals"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:123
|
||||
#: templates/frontend/package-pricing-display.twig:11
|
||||
msgid "Choose a package size below"
|
||||
msgstr ""
|
||||
|
||||
#: templates/frontend/package-pricing-display.twig:20
|
||||
msgid "pieces"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:129
|
||||
#: templates/frontend/package-pricing-display.twig:24
|
||||
msgid "per unit"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:133
|
||||
#: templates/frontend/package-pricing-display.twig:28
|
||||
msgid "Select Package"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:63
|
||||
#: includes/class-wc-tpp-cart.php:76
|
||||
msgid "Package price"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:66
|
||||
#: includes/class-wc-tpp-cart.php:79
|
||||
msgid "Volume discount"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:124
|
||||
msgid "this product"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-cart.php:128
|
||||
msgid "The quantity %1$d is not available for %2$s. Please choose from the available package sizes: %3$s"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:173
|
||||
msgid "View Options"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-frontend.php:178
|
||||
msgid "View options for %s"
|
||||
msgstr ""
|
||||
|
||||
174
releases/README.md
Normal file
174
releases/README.md
Normal file
@@ -0,0 +1,174 @@
|
||||
# WooCommerce Tier and Package Prices - Releases
|
||||
|
||||
This directory contains production-ready releases of the WooCommerce Tier and Package Prices plugin.
|
||||
|
||||
## Latest Release
|
||||
|
||||
**Version 1.0.1** - December 21, 2025
|
||||
|
||||
### Quick Install
|
||||
|
||||
```bash
|
||||
# Download the package
|
||||
wget https://your-domain.com/releases/wc-tier-and-package-prices-1.0.1.zip
|
||||
|
||||
# Verify checksum (optional but recommended)
|
||||
sha256sum wc-tier-and-package-prices-1.0.1.zip
|
||||
# Should match: 92c1385d92527e77646e37f23c1bd1555a4290a5ec9314c0ee6ed896ded55e88
|
||||
|
||||
# Install via WordPress admin or WP-CLI
|
||||
wp plugin install wc-tier-and-package-prices-1.0.1.zip --activate
|
||||
```
|
||||
|
||||
## Files in This Directory
|
||||
|
||||
### Release Packages
|
||||
|
||||
| File | Description | Size |
|
||||
|------|-------------|------|
|
||||
| `wc-tier-and-package-prices-1.0.1.zip` | Production plugin package | 395 KB |
|
||||
| `wc-tier-and-package-prices-1.0.1.zip.sha256` | SHA-256 checksum | - |
|
||||
| `wc-tier-and-package-prices-1.0.1.zip.md5` | MD5 checksum | - |
|
||||
| `RELEASE-INFO-1.0.1.md` | Detailed release information | - |
|
||||
|
||||
## Verification
|
||||
|
||||
### Verify Package Integrity
|
||||
|
||||
**Using SHA-256:**
|
||||
```bash
|
||||
sha256sum -c wc-tier-and-package-prices-1.0.1.zip.sha256
|
||||
```
|
||||
|
||||
**Using MD5:**
|
||||
```bash
|
||||
md5sum -c wc-tier-and-package-prices-1.0.1.zip.md5
|
||||
```
|
||||
|
||||
### Expected Checksums
|
||||
|
||||
**SHA-256:**
|
||||
```
|
||||
92c1385d92527e77646e37f23c1bd1555a4290a5ec9314c0ee6ed896ded55e88
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
e6cfc9b88df9e7763be0cd56517ce8ab
|
||||
```
|
||||
|
||||
## Installation Methods
|
||||
|
||||
### Method 1: WordPress Admin (Recommended for most users)
|
||||
|
||||
1. Download `wc-tier-and-package-prices-1.0.1.zip`
|
||||
2. Go to **WordPress Admin > Plugins > Add New**
|
||||
3. Click **Upload Plugin**
|
||||
4. Choose the downloaded ZIP file
|
||||
5. Click **Install Now**
|
||||
6. Click **Activate Plugin**
|
||||
|
||||
### Method 2: WP-CLI (For developers)
|
||||
|
||||
```bash
|
||||
wp plugin install /path/to/wc-tier-and-package-prices-1.0.1.zip --activate
|
||||
```
|
||||
|
||||
### Method 3: Manual Installation (Advanced)
|
||||
|
||||
```bash
|
||||
# Extract to wp-content/plugins/
|
||||
unzip wc-tier-and-package-prices-1.0.1.zip -d /path/to/wordpress/wp-content/plugins/
|
||||
|
||||
# Set correct permissions
|
||||
chmod -R 755 /path/to/wordpress/wp-content/plugins/wc-tier-and-package-prices
|
||||
|
||||
# Activate via WordPress admin or WP-CLI
|
||||
wp plugin activate wc-tier-and-package-prices
|
||||
```
|
||||
|
||||
## What's Included
|
||||
|
||||
### Core Features
|
||||
- ✅ Tier pricing (quantity-based discounts)
|
||||
- ✅ Package pricing (fixed-price bundles)
|
||||
- ✅ Twig template engine
|
||||
- ✅ WooCommerce HPOS compatible
|
||||
- ✅ Multilingual support
|
||||
|
||||
### Translations
|
||||
- 🇺🇸 English (US)
|
||||
- 🇩🇪 German (Germany)
|
||||
- 🇨🇭 German (Switzerland, Informal)
|
||||
|
||||
### Production Ready
|
||||
- ✅ Optimized autoloader
|
||||
- ✅ No development dependencies
|
||||
- ✅ Compiled Twig templates support
|
||||
- ✅ Tested with WooCommerce 8.0 - 10.0
|
||||
|
||||
## Package Contents
|
||||
|
||||
```
|
||||
wc-tier-and-package-prices/
|
||||
├── assets/ # CSS and JavaScript
|
||||
│ ├── css/
|
||||
│ └── js/
|
||||
├── includes/ # PHP classes
|
||||
│ ├── class-wc-tpp-admin.php
|
||||
│ ├── class-wc-tpp-cart.php
|
||||
│ ├── class-wc-tpp-frontend.php
|
||||
│ ├── class-wc-tpp-product-meta.php
|
||||
│ └── class-wc-tpp-template-loader.php
|
||||
├── languages/ # Translation files
|
||||
│ ├── wc-tier-package-prices-de_CH_informal.*
|
||||
│ ├── wc-tier-package-prices-de_DE.*
|
||||
│ ├── wc-tier-package-prices-en_US.*
|
||||
│ └── wc-tier-package-prices.pot
|
||||
├── templates/ # Twig templates
|
||||
│ ├── admin/
|
||||
│ └── frontend/
|
||||
├── vendor/ # Composer dependencies
|
||||
│ └── twig/twig/
|
||||
├── CHANGELOG.md
|
||||
├── README.md
|
||||
├── composer.json
|
||||
└── wc-tier-and-package-prices.php
|
||||
```
|
||||
|
||||
## System Requirements
|
||||
|
||||
| Requirement | Minimum Version |
|
||||
|-------------|----------------|
|
||||
| WordPress | 6.0+ |
|
||||
| PHP | 7.4+ |
|
||||
| WooCommerce | 8.0+ |
|
||||
| MySQL | 5.6+ |
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See main README.md
|
||||
- **Issues:** https://src.bundespruefstelle.ch/wc-tier-package-prices/issues
|
||||
- **Author:** Marco Graetsch
|
||||
|
||||
## Version History
|
||||
|
||||
### 1.0.1 (2025-12-21)
|
||||
- Added Twig template engine
|
||||
- Added Swiss German translation
|
||||
- Improved template organization
|
||||
- Enhanced security with auto-escaping
|
||||
|
||||
### 1.0.0 (2025-12-21)
|
||||
- Initial release
|
||||
- Tier pricing functionality
|
||||
- Package pricing functionality
|
||||
- German and English translations
|
||||
|
||||
## License
|
||||
|
||||
GPL v2 or later - https://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
---
|
||||
|
||||
**Note:** All packages are production-ready with optimized autoloaders and no development dependencies included.
|
||||
127
releases/RELEASE-INFO-1.0.1.md
Normal file
127
releases/RELEASE-INFO-1.0.1.md
Normal file
@@ -0,0 +1,127 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.0.1
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.0.1
|
||||
**Package Size:** 395 KB
|
||||
**Git Tag:** v1.0.1
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.0.1.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
92c1385d92527e77646e37f23c1bd1555a4290a5ec9314c0ee6ed896ded55e88
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
e6cfc9b88df9e7763be0cd56517ce8ab
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.0.1.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**
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## What's New in 1.0.1
|
||||
|
||||
### New Features
|
||||
- ✅ **Twig Template Engine** - Modern template system with automatic escaping
|
||||
- ✅ **Swiss German Translation** - Added de_CH_informal translation
|
||||
- ✅ **Template Caching** - Improved performance with compiled templates
|
||||
- ✅ **Composer Integration** - Professional dependency management
|
||||
|
||||
### Improvements
|
||||
- 🔄 Migrated all templates from PHP to Twig format
|
||||
- 🔒 Enhanced security with automatic HTML escaping
|
||||
- 📁 Better template organization (admin/ and frontend/ directories)
|
||||
- 🎨 Cleaner separation of logic and presentation
|
||||
|
||||
### Technical Changes
|
||||
- Added Twig v3.22.2 dependency
|
||||
- Created WC_TPP_Template_Loader class for centralized rendering
|
||||
- Integrated WordPress functions (__(), wc_price(), etc.) into Twig
|
||||
- Optimized autoloader for production
|
||||
- Removed legacy PHP templates
|
||||
|
||||
## Package Contents
|
||||
|
||||
The installation package includes:
|
||||
|
||||
### Core Files
|
||||
- `wc-tier-and-package-prices.php` - Main plugin file
|
||||
- `composer.json` - Dependency configuration
|
||||
- `CHANGELOG.md` - Full version history
|
||||
- `README.md` - Plugin documentation
|
||||
|
||||
### Directories
|
||||
- `includes/` - PHP class files
|
||||
- `class-wc-tpp-admin.php`
|
||||
- `class-wc-tpp-cart.php`
|
||||
- `class-wc-tpp-frontend.php`
|
||||
- `class-wc-tpp-product-meta.php`
|
||||
- `class-wc-tpp-template-loader.php`
|
||||
- `templates/` - Twig template files
|
||||
- `admin/` - Admin interface templates
|
||||
- `frontend/` - Customer-facing templates
|
||||
- `languages/` - Translation files
|
||||
- de_CH_informal (Swiss German, Informal)
|
||||
- de_DE (German, Germany)
|
||||
- en_US (English, US)
|
||||
- `assets/` - CSS and JavaScript files
|
||||
- `vendor/` - Composer dependencies (Twig)
|
||||
|
||||
## Translations Included
|
||||
|
||||
1. **English (US)** - en_US ✅
|
||||
2. **German (Germany)** - de_DE ✅
|
||||
3. **German (Switzerland, Informal)** - de_CH_informal ✅ NEW!
|
||||
|
||||
## Features
|
||||
|
||||
### 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
|
||||
|
||||
### Admin Features
|
||||
- Easy-to-use product meta boxes
|
||||
- Configurable display positions
|
||||
- Settings page for global options
|
||||
|
||||
### Frontend Features
|
||||
- Beautiful pricing tables
|
||||
- Real-time cart updates
|
||||
- Responsive design
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and USAGE_EXAMPLES.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
|
||||
|
||||
---
|
||||
|
||||
**Note:** This is a production-ready package with optimized autoloader and no development dependencies.
|
||||
198
releases/RELEASE-INFO-1.0.2.md
Normal file
198
releases/RELEASE-INFO-1.0.2.md
Normal file
@@ -0,0 +1,198 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.0.2
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.0.2
|
||||
**Package Size:** 396 KB
|
||||
**Git Tag:** v1.0.2
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.0.2.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
c1a5339da10b3625156b8fff4ec848e4a1318d6edc497bd5026cfe0a3ef39daa
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
830f443ce4b65e2ca9cfede3257bc4f5
|
||||
```
|
||||
|
||||
## What's New in 1.0.2
|
||||
|
||||
### Major Changes
|
||||
- ✅ **Settings Migrated to WooCommerce Settings Page**
|
||||
- Settings now appear as a dedicated tab: **WooCommerce > Settings > Tier & Package Prices**
|
||||
- Removed standalone submenu for better integration
|
||||
- Consistent UI with native WooCommerce settings
|
||||
|
||||
### Improvements
|
||||
- 🔄 Uses WooCommerce's native settings API (WC_Settings_Page)
|
||||
- 🎨 Better integration with WooCommerce admin interface
|
||||
- 💾 Automatic settings persistence via WooCommerce
|
||||
- 🌍 Updated all translations with new settings strings
|
||||
|
||||
### New Features
|
||||
- ✨ WC_TPP_Settings class for proper WooCommerce integration
|
||||
- 📝 9 new translatable strings in all languages
|
||||
- 🔧 Enhanced tooltips and descriptions for better UX
|
||||
|
||||
### Technical Changes
|
||||
- Implemented `woocommerce_get_settings_pages` filter hook
|
||||
- Uses `WC_Admin_Settings` for rendering and saving
|
||||
- Removed custom Twig settings template
|
||||
- Updated all translation files to version 1.0.2
|
||||
|
||||
### Removed
|
||||
- ❌ Standalone settings submenu (WooCommerce > Tier & Package Prices)
|
||||
- ❌ Custom settings template (templates/admin/settings-page.twig)
|
||||
|
||||
## Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.0.2.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.0.1
|
||||
|
||||
This is a **minor update** with improved settings integration. No data migration needed.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate the current version
|
||||
2. Upload and activate version 1.0.2
|
||||
3. Your existing settings will be automatically preserved
|
||||
4. Settings location changed: Now under **WooCommerce > Settings** tab
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## Translation Updates
|
||||
|
||||
All translation files updated with new strings:
|
||||
|
||||
### New Translations (9 new strings)
|
||||
1. "General" - Settings section
|
||||
2. "Tier & Package Prices Settings" - Section title
|
||||
3. "Configure tier pricing and package pricing options..." - Description
|
||||
4. "Allow quantity-based pricing tiers..." - Tooltip
|
||||
5. "Allow fixed-price packages..." - Tooltip
|
||||
6. "Display the pricing table to customers..." - Tooltip
|
||||
7. "Choose where to display the pricing table..." - Description
|
||||
8. "Before Add to Cart Button" - Option
|
||||
9. "After Add to Cart Button" - Option
|
||||
|
||||
### Languages Included
|
||||
- 🇺🇸 **English (US)** - en_US - Fully updated
|
||||
- 🇩🇪 **German (Germany)** - de_DE - Fully updated (formal "Sie")
|
||||
- 🇨🇭 **German (Switzerland, Informal)** - de_CH_informal - Fully updated (informal "du")
|
||||
|
||||
## Package Contents
|
||||
|
||||
The installation package includes:
|
||||
|
||||
### Core Files
|
||||
- `wc-tier-and-package-prices.php` (v1.0.2)
|
||||
- `composer.json` - Updated to 1.0.2
|
||||
- `CHANGELOG.md` - Full version history
|
||||
|
||||
### New/Modified Files
|
||||
- `includes/class-wc-tpp-settings.php` ✨ NEW
|
||||
- `includes/class-wc-tpp-admin.php` - Updated
|
||||
- All translation files (.po/.mo) - Updated
|
||||
|
||||
### Complete Directory Structure
|
||||
```
|
||||
wc-tier-and-package-prices/
|
||||
├── assets/ # CSS and JavaScript
|
||||
│ ├── css/
|
||||
│ └── js/
|
||||
├── includes/ # PHP classes
|
||||
│ ├── class-wc-tpp-admin.php
|
||||
│ ├── class-wc-tpp-cart.php
|
||||
│ ├── class-wc-tpp-frontend.php
|
||||
│ ├── class-wc-tpp-product-meta.php
|
||||
│ ├── class-wc-tpp-settings.php ✨ NEW
|
||||
│ └── class-wc-tpp-template-loader.php
|
||||
├── languages/ # Translation files (all updated)
|
||||
│ ├── wc-tier-package-prices-de_CH_informal.po/mo
|
||||
│ ├── wc-tier-package-prices-de_DE.po/mo
|
||||
│ ├── wc-tier-package-prices-en_US.po/mo
|
||||
│ └── wc-tier-package-prices.pot
|
||||
├── templates/ # Twig templates
|
||||
│ ├── admin/
|
||||
│ │ ├── package-row.twig
|
||||
│ │ └── tier-row.twig
|
||||
│ └── frontend/
|
||||
│ ├── package-pricing-display.twig
|
||||
│ ├── pricing-table.twig
|
||||
│ └── tier-pricing-table.twig
|
||||
├── vendor/ # Composer dependencies
|
||||
│ └── twig/twig/ (v3.22.2)
|
||||
├── CHANGELOG.md
|
||||
├── README.md
|
||||
└── composer.json
|
||||
```
|
||||
|
||||
## Features (Complete List)
|
||||
|
||||
### 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
|
||||
|
||||
### Admin Features
|
||||
- ✅ **WooCommerce Settings integration** (NEW in 1.0.2)
|
||||
- ✅ Easy-to-use product meta boxes
|
||||
- ✅ Configurable display positions
|
||||
- ✅ Native WooCommerce UI
|
||||
|
||||
### Frontend Features
|
||||
- ✅ Beautiful pricing tables (Twig templates)
|
||||
- ✅ Real-time cart updates
|
||||
- ✅ Responsive design
|
||||
- ✅ 3 languages supported
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### Settings Location Changed
|
||||
**Old Location:** WooCommerce > Tier & Package Prices
|
||||
**New Location:** WooCommerce > Settings > Tier & Package Prices
|
||||
|
||||
All your existing settings are automatically preserved and will appear in the new location.
|
||||
|
||||
### Benefits of New Location
|
||||
1. ✅ Better discoverability - users expect settings under Settings
|
||||
2. ✅ Consistent with WooCommerce patterns
|
||||
3. ✅ Native WooCommerce UI/UX
|
||||
4. ✅ Better mobile support
|
||||
5. ✅ Follows WordPress/WooCommerce best practices
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and USAGE_EXAMPLES.md
|
||||
- **Changelog:** See CHANGELOG.md for detailed changes
|
||||
- **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.
|
||||
345
releases/RELEASE-INFO-1.1.0.md
Normal file
345
releases/RELEASE-INFO-1.1.0.md
Normal file
@@ -0,0 +1,345 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.1.0
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.1.0
|
||||
**Package Size:** 387 KB
|
||||
**Git Tag:** v1.1.0
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.1.0.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
da6b462f3dc297b282ed0da258b78fd9f2f82f3e76289c4c8fadd1ac9e02c55b
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
ef68125c54b0c10f04ba82d48a98b4aa
|
||||
```
|
||||
|
||||
## What's New in 1.1.0
|
||||
|
||||
### Major Features
|
||||
- ✨ **Package Quantity Restriction** - NEW
|
||||
- Limit product purchases to predefined package sizes only
|
||||
- Perfect for bulk-only sales, sample packs, or fixed bundle quantities
|
||||
- Global and per-product configuration options
|
||||
|
||||
### New Settings
|
||||
- 🌍 **Global Restriction Setting**
|
||||
- Enable quantity restrictions site-wide
|
||||
- Located in: WooCommerce > Settings > Tier & Package Prices
|
||||
- Description: "Limit quantities to defined package sizes only"
|
||||
|
||||
- 📦 **Per-Product Restriction Setting**
|
||||
- Override global setting on individual products
|
||||
- Located in: Product Edit > Package Pricing section
|
||||
- Checkbox: "Restrict to Package Quantities"
|
||||
|
||||
### Frontend Enhancements
|
||||
- 🎨 **Enhanced Package Selection UI**
|
||||
- Automatic quantity field hiding when restriction is enabled
|
||||
- Clear notice: "Choose a package size below"
|
||||
- Visual package selection with highlighted states
|
||||
- Responsive package selection buttons
|
||||
|
||||
- ✅ **Client-Side Validation**
|
||||
- JavaScript prevents form submission without package selection
|
||||
- Alert message guides users to select a package
|
||||
- Real-time visual feedback on selection
|
||||
|
||||
### Backend Validation
|
||||
- 🛡️ **Server-Side Cart Validation**
|
||||
- Validates quantity matches defined packages
|
||||
- Prevents manual quantity manipulation
|
||||
- User-friendly error messages
|
||||
- Example: "The quantity 15 is not available for Product Name. Please choose from the available package sizes: 10, 20, 50"
|
||||
|
||||
### Technical Improvements
|
||||
- New method: `WC_TPP_Cart::validate_package_quantity()`
|
||||
- New method: `WC_TPP_Frontend::maybe_hide_quantity_input()`
|
||||
- Enhanced `woocommerce_add_to_cart_validation` filter integration
|
||||
- Added `wc-tpp-restricted-mode` CSS class
|
||||
- Added `wc-tpp-package-selectable` CSS class for styling
|
||||
- New product meta key: `_wc_tpp_restrict_to_packages`
|
||||
- New global option: `wc_tpp_restrict_package_quantities`
|
||||
|
||||
### Translations
|
||||
- Added 7 new translatable strings
|
||||
- Updated all language files (en_US, de_DE, de_CH_informal)
|
||||
- All .mo files recompiled with new strings
|
||||
|
||||
## Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.0.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.0.x
|
||||
|
||||
This is a **minor version** update with new features. No data migration needed.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate the current version
|
||||
2. Upload and activate version 1.1.0
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. Review new restriction settings if desired
|
||||
|
||||
### Upgrade from 1.0.2
|
||||
|
||||
No breaking changes. Safe to upgrade directly. New restriction feature is disabled by default.
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## New Strings Translation Reference
|
||||
|
||||
All new strings in this release:
|
||||
|
||||
### Settings Page
|
||||
1. "Restrict to Package Quantities" - Checkbox label
|
||||
2. "Limit quantities to defined package sizes only" - Checkbox description
|
||||
3. "When enabled, customers can only purchase..." - Tooltip text
|
||||
|
||||
### Product Meta Box
|
||||
4. "Restrict to Package Quantities" - Checkbox label (same as above)
|
||||
5. "Only allow quantities defined in packages above" - Tooltip text
|
||||
|
||||
### Frontend Display
|
||||
6. "Choose a package size below" - User notice in restricted mode
|
||||
|
||||
### Cart Validation
|
||||
7. "this product" - Fallback product name
|
||||
8. "The quantity %1$d is not available for %2$s..." - Error message template
|
||||
|
||||
## Use Cases
|
||||
|
||||
### Bulk-Only Sales
|
||||
Enable restriction globally to sell products only in bulk quantities.
|
||||
|
||||
**Example:**
|
||||
- Package 1: 100 units at $500
|
||||
- Package 2: 250 units at $1,100
|
||||
- Package 3: 500 units at $2,000
|
||||
|
||||
Customers can only purchase these exact quantities.
|
||||
|
||||
### Sample Packs
|
||||
Create fixed sample packs with no custom quantities.
|
||||
|
||||
**Example:**
|
||||
- Starter Pack: 10 items
|
||||
- Trial Pack: 25 items
|
||||
- Full Pack: 50 items
|
||||
|
||||
### Promotional Bundles
|
||||
Offer promotional pricing only for specific bundle sizes.
|
||||
|
||||
**Example:**
|
||||
- Holiday Bundle: 12 units (seasonal pricing)
|
||||
- Party Pack: 24 units (bulk discount)
|
||||
- Wholesale Bundle: 100 units (wholesale pricing)
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
### Example 1: Site-Wide Restriction
|
||||
|
||||
**Scenario:** All products should only be sold in packages
|
||||
|
||||
**Configuration:**
|
||||
1. Go to WooCommerce > Settings > Tier & Package Prices
|
||||
2. Check "Restrict to Package Quantities"
|
||||
3. Save changes
|
||||
4. Configure package sizes for each product
|
||||
|
||||
**Result:** All products with packages defined will enforce quantity restrictions
|
||||
|
||||
### Example 2: Per-Product Restriction
|
||||
|
||||
**Scenario:** Only specific products need quantity restrictions
|
||||
|
||||
**Configuration:**
|
||||
1. Leave global setting unchecked
|
||||
2. Edit the specific product
|
||||
3. Scroll to Package Pricing section
|
||||
4. Check "Restrict to Package Quantities"
|
||||
5. Update product
|
||||
|
||||
**Result:** Only that product enforces restrictions
|
||||
|
||||
### Example 3: Mixed Approach
|
||||
|
||||
**Scenario:** Most products are restricted, but some allow custom quantities
|
||||
|
||||
**Configuration:**
|
||||
1. Enable global restriction
|
||||
2. For products that should allow custom quantities, simply don't define any packages
|
||||
3. Products without packages defined won't show restrictions
|
||||
|
||||
## Feature Compatibility
|
||||
|
||||
### Works With
|
||||
- ✅ WooCommerce 8.0 - 10.0
|
||||
- ✅ WordPress 6.0+
|
||||
- ✅ HPOS (High-Performance Order Storage)
|
||||
- ✅ All WooCommerce themes
|
||||
- ✅ Tier pricing (can use both features together)
|
||||
- ✅ Package pricing (required for restriction)
|
||||
- ✅ All pricing table display positions
|
||||
|
||||
### Requirements for Restriction Feature
|
||||
- Product must have at least one package defined
|
||||
- Either global or per-product restriction must be enabled
|
||||
- Package pricing must be enabled in settings
|
||||
|
||||
## Package Contents
|
||||
|
||||
The installation package includes all files from version 1.0.2 plus:
|
||||
|
||||
### Modified Files
|
||||
- `wc-tier-and-package-prices.php` - Version updated to 1.1.0
|
||||
- `composer.json` - Version updated to 1.1.0
|
||||
- `CHANGELOG.md` - Added v1.1.0 section
|
||||
- `includes/class-wc-tpp-settings.php` - Added restriction setting
|
||||
- `includes/class-wc-tpp-product-meta.php` - Added per-product checkbox
|
||||
- `includes/class-wc-tpp-frontend.php` - Added quantity hiding logic
|
||||
- `includes/class-wc-tpp-cart.php` - Added validation method
|
||||
- `assets/js/frontend.js` - Added restricted mode handling
|
||||
- `templates/frontend/package-pricing-display.twig` - Added restriction notice
|
||||
- `templates/frontend/pricing-table.twig` - Pass restriction flag
|
||||
- All translation files (.po/.mo) - Updated with new strings
|
||||
|
||||
### Complete Directory Structure
|
||||
```
|
||||
wc-tier-and-package-prices/
|
||||
├── assets/
|
||||
│ ├── css/
|
||||
│ │ ├── admin.css
|
||||
│ │ └── frontend.css
|
||||
│ └── js/
|
||||
│ ├── admin.js
|
||||
│ └── frontend.js (UPDATED)
|
||||
├── includes/
|
||||
│ ├── class-wc-tpp-admin.php
|
||||
│ ├── class-wc-tpp-cart.php (UPDATED)
|
||||
│ ├── class-wc-tpp-frontend.php (UPDATED)
|
||||
│ ├── class-wc-tpp-product-meta.php (UPDATED)
|
||||
│ ├── class-wc-tpp-settings.php (UPDATED)
|
||||
│ └── class-wc-tpp-template-loader.php
|
||||
├── languages/ (ALL UPDATED)
|
||||
│ ├── wc-tier-package-prices-de_CH_informal.po/mo
|
||||
│ ├── wc-tier-package-prices-de_DE.po/mo
|
||||
│ ├── wc-tier-package-prices-en_US.po/mo
|
||||
│ └── wc-tier-package-prices.pot
|
||||
├── templates/
|
||||
│ ├── admin/
|
||||
│ │ ├── package-row.twig
|
||||
│ │ └── tier-row.twig
|
||||
│ └── frontend/
|
||||
│ ├── package-pricing-display.twig (UPDATED)
|
||||
│ ├── pricing-table.twig (UPDATED)
|
||||
│ └── tier-pricing-table.twig
|
||||
├── vendor/ (Twig v3.22.2)
|
||||
├── CHANGELOG.md (UPDATED)
|
||||
├── composer.json (UPDATED)
|
||||
└── wc-tier-and-package-prices.php (UPDATED)
|
||||
```
|
||||
|
||||
## Features (Complete List)
|
||||
|
||||
### 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
|
||||
- ✅ **NEW:** Quantity restriction to packages only
|
||||
|
||||
### Admin Features
|
||||
- ✅ WooCommerce Settings integration
|
||||
- ✅ Easy-to-use product meta boxes
|
||||
- ✅ Configurable display positions
|
||||
- ✅ Native WooCommerce UI
|
||||
- ✅ **NEW:** Global restriction setting
|
||||
- ✅ **NEW:** Per-product restriction override
|
||||
|
||||
### Frontend Features
|
||||
- ✅ Beautiful pricing tables (Twig templates)
|
||||
- ✅ Real-time cart updates
|
||||
- ✅ Responsive design
|
||||
- ✅ 3 languages supported
|
||||
- ✅ **NEW:** Package-only selection mode
|
||||
- ✅ **NEW:** Automatic quantity field hiding
|
||||
- ✅ **NEW:** Visual package selection
|
||||
|
||||
### Validation & Security
|
||||
- ✅ **NEW:** Client-side JavaScript validation
|
||||
- ✅ **NEW:** Server-side cart validation
|
||||
- ✅ **NEW:** User-friendly error messages
|
||||
- ✅ WooCommerce HPOS compatible
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
**None.** This release is fully backward compatible.
|
||||
|
||||
The new restriction feature is disabled by default and must be explicitly enabled.
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From 1.0.2
|
||||
- No migration needed
|
||||
- New settings appear automatically in admin
|
||||
- Feature is disabled by default
|
||||
|
||||
### 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)
|
||||
|
||||
### Future Enhancements
|
||||
These features may be added in future versions:
|
||||
- Variation-level restriction control
|
||||
- Restrict to tier quantities option
|
||||
- Minimum/maximum package selection limits
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and CHANGELOG.md
|
||||
- **Previous Release:** See RELEASE-INFO-1.0.2.md
|
||||
- **Issues:** https://src.bundespruefstelle.ch/wc-tier-package-prices/issues
|
||||
- **Author:** Marco Graetsch
|
||||
|
||||
## License
|
||||
|
||||
GPL v2 or later - https://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
---
|
||||
|
||||
**Production Ready:** This package includes optimized autoloader and no development dependencies.
|
||||
|
||||
**What's Next:** Version 1.1.0 completes the package restriction feature set. Future versions may add variation-level controls and tier quantity restrictions.
|
||||
272
releases/RELEASE-INFO-1.1.1.md
Normal file
272
releases/RELEASE-INFO-1.1.1.md
Normal file
@@ -0,0 +1,272 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.1.1
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.1.1
|
||||
**Package Size:** 403 KB
|
||||
**Git Tag:** v1.1.1
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.1.1.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
b951f8b7ddd2bad6b3415d4583709fdf88f66aea4eae70110c903757ff53e045
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
51c4f8a7c3ccede2d2005f2fe3ebe44e
|
||||
```
|
||||
|
||||
## What's New in 1.1.1
|
||||
|
||||
This is a **patch release** that enhances the package quantity restriction feature introduced in v1.1.0 by preventing cart quantity bypass.
|
||||
|
||||
### Security Enhancement
|
||||
- **Fixed:** Cart quantity bypass vulnerability for package-restricted products
|
||||
- Customers could previously modify quantities in the cart to bypass package restrictions
|
||||
- This patch ensures restrictions are enforced throughout the entire purchase flow
|
||||
|
||||
### New Features
|
||||
- **Cart Quantity Field Hiding** - NEW
|
||||
- Automatic hiding of quantity input field in cart when restrictions are enabled
|
||||
- Cart displays quantity as read-only text for restricted products
|
||||
- Prevents manual quantity modification in shopping cart
|
||||
- Seamless integration with existing restriction settings
|
||||
|
||||
### Technical Improvements
|
||||
- Added `maybe_hide_cart_quantity_input()` method in WC_TPP_Cart class
|
||||
- Extended `woocommerce_cart_item_quantity` filter hook
|
||||
- New CSS class: `wc-tpp-cart-quantity` for styled quantity display
|
||||
- Enhanced cart validation and display consistency
|
||||
|
||||
## What's Changed
|
||||
|
||||
### Added
|
||||
- Cart quantity field hiding when package restriction is enabled
|
||||
- Automatic read-only quantity display in cart for restricted products
|
||||
|
||||
### Changed
|
||||
- Cart quantity input replaced with plain text when restrictions apply
|
||||
- Enhanced cart display to prevent quantity modification for restricted products
|
||||
|
||||
### Fixed
|
||||
- Cart quantity bypass vulnerability for package-restricted products
|
||||
|
||||
## Installation
|
||||
|
||||
### New Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.1.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.0
|
||||
|
||||
This is a **patch release** with a security fix. No configuration changes needed.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate version 1.1.0
|
||||
2. Upload and activate version 1.1.1
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. No additional configuration required
|
||||
|
||||
### Upgrade from 1.0.x
|
||||
|
||||
Safe to upgrade directly. This version includes all features from v1.1.0 plus the cart quantity hiding enhancement.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate the current version
|
||||
2. Upload and activate version 1.1.1
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. Review the new package restriction features if desired
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## Complete Package Restriction Feature (v1.1.0 + v1.1.1)
|
||||
|
||||
The package quantity restriction feature now provides complete enforcement across all touchpoints:
|
||||
|
||||
### Product Page (v1.1.0)
|
||||
- ✅ Quantity field automatically hidden when restriction enabled
|
||||
- ✅ "Choose a package size below" notice displayed
|
||||
- ✅ Visual package selection with highlighted states
|
||||
- ✅ JavaScript validation prevents form submission without package selection
|
||||
|
||||
### Add to Cart Validation (v1.1.0)
|
||||
- ✅ Server-side validation on add-to-cart
|
||||
- ✅ User-friendly error messages showing available package sizes
|
||||
- ✅ Prevents manual quantity manipulation via form fields
|
||||
|
||||
### Cart Page (v1.1.1 - NEW)
|
||||
- ✅ Quantity field hidden/replaced with read-only text
|
||||
- ✅ Prevents cart quantity modification
|
||||
- ✅ Consistent restriction enforcement
|
||||
- ✅ No bypass via cart updates
|
||||
|
||||
### Settings
|
||||
- ✅ Global setting to enable restrictions site-wide
|
||||
- ✅ Per-product override for individual products
|
||||
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
|
||||
|
||||
## Use Cases
|
||||
|
||||
### Scenario 1: Bulk-Only Sales
|
||||
Enable restriction globally to sell products only in bulk quantities.
|
||||
|
||||
**Example:**
|
||||
- Package 1: 100 units at $500
|
||||
- Package 2: 250 units at $1,100
|
||||
- Package 3: 500 units at $2,000
|
||||
|
||||
Customers can only purchase these exact quantities on both product page and in cart.
|
||||
|
||||
### Scenario 2: Sample Packs
|
||||
Create fixed sample packs with no custom quantities.
|
||||
|
||||
**Example:**
|
||||
- Starter Pack: 10 items
|
||||
- Trial Pack: 25 items
|
||||
- Full Pack: 50 items
|
||||
|
||||
Quantity cannot be changed in cart - customers must return to product page to select a different package.
|
||||
|
||||
### Scenario 3: Promotional Bundles
|
||||
Offer promotional pricing only for specific bundle sizes with no modifications allowed.
|
||||
|
||||
**Example:**
|
||||
- Holiday Bundle: 12 units (seasonal pricing)
|
||||
- Party Pack: 24 units (bulk discount)
|
||||
- Wholesale Bundle: 100 units (wholesale pricing)
|
||||
|
||||
## Modified Files in 1.1.1
|
||||
|
||||
### Core Files Updated
|
||||
- `wc-tier-and-package-prices.php` - Version updated to 1.1.1
|
||||
- `composer.json` - Version updated to 1.1.1
|
||||
- `CHANGELOG.md` - Added v1.1.1 section
|
||||
|
||||
### PHP Classes Modified
|
||||
- `includes/class-wc-tpp-cart.php` - Added `maybe_hide_cart_quantity_input()` method
|
||||
|
||||
### Translation Files Updated
|
||||
- `languages/wc-tier-package-prices.pot` - Version updated to 1.1.1
|
||||
- `languages/wc-tier-package-prices-en_US.po` - Version updated to 1.1.1
|
||||
- `languages/wc-tier-package-prices-de_DE.po` - Version updated to 1.1.1
|
||||
- `languages/wc-tier-package-prices-de_CH_informal.po` - Version updated to 1.1.1
|
||||
|
||||
## 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 - 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 (NEW)
|
||||
|
||||
### Validation & Security
|
||||
- ✅ Client-side JavaScript validation
|
||||
- ✅ Server-side cart validation
|
||||
- ✅ Cart quantity bypass prevention (NEW)
|
||||
- ✅ User-friendly error messages
|
||||
- ✅ WooCommerce HPOS compatible
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
**None.** This release is fully backward compatible with v1.1.0 and v1.0.x.
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From 1.1.0
|
||||
- No migration needed
|
||||
- Cart quantity hiding is automatic when restrictions are enabled
|
||||
- No new settings or configuration required
|
||||
|
||||
### From 1.0.x
|
||||
- All v1.1.0 features included plus cart enhancement
|
||||
- New restriction features are 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)
|
||||
|
||||
### Future Enhancements
|
||||
These features may be added in future versions:
|
||||
- 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.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
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and CHANGELOG.md
|
||||
- **Previous Release:** See RELEASE-INFO-1.1.0.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.1 is recommended for all users of v1.1.0 to ensure complete package restriction enforcement. Users on v1.0.x can safely upgrade to gain both the restriction feature and this security enhancement.
|
||||
304
releases/RELEASE-INFO-1.1.2.md
Normal file
304
releases/RELEASE-INFO-1.1.2.md
Normal file
@@ -0,0 +1,304 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.1.2
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.1.2
|
||||
**Package Size:** 405 KB
|
||||
**Git Tag:** v1.1.2
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.1.2.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
40ffd29ebc6af635f689472040acd220ae1c8df2f0d852fab4b43ce0fb5fe739
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
eee69fcf391b3f3df9380306ffb31b1b
|
||||
```
|
||||
|
||||
## What's New in 1.1.2
|
||||
|
||||
This is a **patch release** that completes the package quantity restriction feature by preventing catalog page add-to-cart attempts for restricted products.
|
||||
|
||||
### New Features
|
||||
- **Catalog "View Options" Button** - NEW
|
||||
- "Add to Cart" buttons replaced with "View Options" links on shop/category/archive pages
|
||||
- Eye icon (Dashicons) styling for visual distinction
|
||||
- Direct link to product page for package selection
|
||||
- Prevents customer confusion from attempting invalid cart additions
|
||||
|
||||
### Enhanced User Experience
|
||||
- Products with quantity restrictions now clearly indicate "View Options" instead of "Add to Cart"
|
||||
- Customers are guided to product page where they must select a valid package
|
||||
- No more failed add-to-cart attempts from catalog pages
|
||||
- Consistent restriction enforcement across all touchpoints
|
||||
|
||||
### Technical Improvements
|
||||
- Added `has_quantity_restriction()` static helper method in WC_TPP_Frontend class
|
||||
- Added `modify_catalog_add_to_cart_button()` method in WC_TPP_Frontend class
|
||||
- Extended `woocommerce_loop_add_to_cart_link` filter hook
|
||||
- Updated CSS loading to all WooCommerce pages (shop, cart, checkout, product)
|
||||
- New CSS classes: `wc-tpp-view-options`, `wc-tpp-cart-quantity`, `wc-tpp-restriction-notice`
|
||||
|
||||
## What's Changed
|
||||
|
||||
### Added
|
||||
- Catalog "View Options" button for products with quantity restrictions
|
||||
- Automatic button replacement in shop/category/archive pages
|
||||
- Eye icon (Dashicons) for "View Options" button styling
|
||||
|
||||
### Changed
|
||||
- "Add to Cart" button replaced with "View Options" link on catalog pages for restricted products
|
||||
- CSS now loads on all WooCommerce pages (shop, cart, checkout, product)
|
||||
- Catalog buttons now direct to product page instead of adding to cart
|
||||
|
||||
### Translations
|
||||
- Added 2 new translatable strings:
|
||||
- "View Options" → "Optionen ansehen" (German)
|
||||
- "View options for %s" → "Optionen für %s ansehen" (German)
|
||||
- Updated all translations (en_US, de_DE, de_CH_informal)
|
||||
- Compiled all .mo files with new strings
|
||||
|
||||
## Installation
|
||||
|
||||
### New Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.2.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.1
|
||||
|
||||
This is a **patch release** with improved user experience. No configuration changes needed.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate version 1.1.1
|
||||
2. Upload and activate version 1.1.2
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. No additional configuration required
|
||||
|
||||
### Upgrade from 1.1.0 or Earlier
|
||||
|
||||
Safe to upgrade directly. This version includes all features from v1.1.0 and v1.1.1 plus catalog button enhancements.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate the current version
|
||||
2. Upload and activate version 1.1.2
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. Review the package restriction features if desired
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## Complete Package Restriction Feature (v1.1.0 + v1.1.1 + v1.1.2)
|
||||
|
||||
The package quantity restriction feature now provides complete enforcement across all customer touchpoints:
|
||||
|
||||
### Catalog Pages (v1.1.2 - NEW)
|
||||
- ✅ "View Options" button instead of "Add to Cart" for restricted products
|
||||
- ✅ Eye icon for visual distinction
|
||||
- ✅ Direct link to product page
|
||||
- ✅ Prevents invalid add-to-cart attempts from shop/category pages
|
||||
|
||||
### Product Page (v1.1.0)
|
||||
- ✅ Quantity field automatically hidden when restriction enabled
|
||||
- ✅ "Choose a package size below" notice displayed
|
||||
- ✅ Visual package selection with highlighted states
|
||||
- ✅ JavaScript validation prevents form submission without package selection
|
||||
|
||||
### Add to Cart Validation (v1.1.0)
|
||||
- ✅ Server-side validation on add-to-cart
|
||||
- ✅ User-friendly error messages showing available package sizes
|
||||
- ✅ Prevents manual quantity manipulation via form fields
|
||||
|
||||
### Cart Page (v1.1.1)
|
||||
- ✅ Quantity field hidden/replaced with read-only text
|
||||
- ✅ Prevents cart quantity modification
|
||||
- ✅ Consistent restriction enforcement
|
||||
- ✅ No bypass via cart updates
|
||||
|
||||
### Settings
|
||||
- ✅ Global setting to enable restrictions site-wide
|
||||
- ✅ Per-product override for individual products
|
||||
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
|
||||
|
||||
## User Flow Comparison
|
||||
|
||||
### Before v1.1.2
|
||||
**Shop Page:** "Add to Cart" button → **Result:** Ajax add fails with error OR quantity validation error
|
||||
|
||||
### After v1.1.2
|
||||
**Shop Page:** "View Options" button → **Product Page:** Select package → **Add to Cart:** Success
|
||||
|
||||
The improved flow eliminates customer confusion and failed add-to-cart attempts.
|
||||
|
||||
## Use Cases
|
||||
|
||||
### Scenario 1: Bulk-Only Product Catalog
|
||||
Enable restriction globally. Shop pages show "View Options" for all products.
|
||||
|
||||
**Customer Experience:**
|
||||
- Browse shop → See "View Options" on bulk products
|
||||
- Click "View Options" → Product page opens
|
||||
- Select from available packages (e.g., 100, 250, 500 units)
|
||||
- Add to cart → Success with no errors
|
||||
|
||||
### Scenario 2: Mixed Catalog
|
||||
Some products restricted, others not. Shop page shows appropriate buttons.
|
||||
|
||||
**Customer Experience:**
|
||||
- Browse shop → See mix of "Add to Cart" and "View Options"
|
||||
- Regular products: "Add to Cart" works normally
|
||||
- Restricted products: "View Options" → Product page → Package selection
|
||||
|
||||
### Scenario 3: Sample Pack Products
|
||||
Products sold only in fixed sample packs.
|
||||
|
||||
**Customer Experience:**
|
||||
- Browse samples → All show "View Options"
|
||||
- Click button → Product page shows package choices
|
||||
- Select "Starter Pack (10)", "Trial Pack (25)", or "Full Pack (50)"
|
||||
- Quantity cannot be modified in cart
|
||||
|
||||
## Modified Files in 1.1.2
|
||||
|
||||
### Core Files Updated
|
||||
- `wc-tier-and-package-prices.php` - Version updated to 1.1.2
|
||||
- `composer.json` - Version updated to 1.1.2
|
||||
- `CHANGELOG.md` - Added v1.1.2 section
|
||||
|
||||
### PHP Classes Modified
|
||||
- `includes/class-wc-tpp-frontend.php` - Added catalog button modification methods
|
||||
|
||||
### CSS Files Modified
|
||||
- `assets/css/frontend.css` - Added `.wc-tpp-view-options` button styling, eye icon
|
||||
|
||||
### Translation Files Updated
|
||||
- `languages/wc-tier-package-prices.pot` - Version updated to 1.1.2, 2 new strings
|
||||
- `languages/wc-tier-package-prices-en_US.po` - Version updated, 2 new strings
|
||||
- `languages/wc-tier-package-prices-de_DE.po` - Version updated, 2 new strings
|
||||
- `languages/wc-tier-package-prices-de_CH_informal.po` - Version updated, 2 new strings
|
||||
- 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)
|
||||
- ✅ Catalog button modification (v1.1.2 - 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
|
||||
- ✅ Catalog "View Options" button (NEW)
|
||||
|
||||
### Validation & Security
|
||||
- ✅ Client-side JavaScript validation
|
||||
- ✅ Server-side cart validation
|
||||
- ✅ Cart quantity bypass prevention
|
||||
- ✅ Catalog add-to-cart prevention (NEW)
|
||||
- ✅ User-friendly error messages
|
||||
- ✅ WooCommerce HPOS compatible
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
**None.** This release is fully backward compatible with v1.1.1, v1.1.0 and v1.0.x.
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From 1.1.1
|
||||
- No migration needed
|
||||
- Catalog button changes are automatic when restrictions are enabled
|
||||
- No new settings or configuration required
|
||||
|
||||
### From 1.1.0 or Earlier
|
||||
- All v1.1.1 and v1.1.2 features included automatically
|
||||
- New restriction features are disabled by default
|
||||
- Must be explicitly enabled in settings
|
||||
|
||||
### Settings Location
|
||||
All settings remain in: **WooCommerce > Settings > Tier & Package Prices**
|
||||
|
||||
### Data Preservation
|
||||
- All existing tier pricing data preserved
|
||||
- All existing package pricing data preserved
|
||||
- All product meta data preserved
|
||||
- No database changes required
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### Current Version
|
||||
1. Restriction only works when packages are defined
|
||||
2. Cannot restrict to tier quantities (only packages)
|
||||
3. Restriction applies to entire product (no variation-level control)
|
||||
4. Cart quantity is read-only text (not a dropdown of package options)
|
||||
5. "View Options" button uses standard WooCommerce button styling
|
||||
|
||||
### Future Enhancements
|
||||
These features may be added in future versions:
|
||||
- Customizable "View Options" button text
|
||||
- Cart package quantity dropdown selector
|
||||
- Variation-level restriction control
|
||||
- Restrict to tier quantities option
|
||||
- Minimum/maximum package selection limits
|
||||
|
||||
## Changelog Summary
|
||||
|
||||
### Version History
|
||||
- **v1.1.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
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and CHANGELOG.md
|
||||
- **Previous Release:** See RELEASE-INFO-1.1.1.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.2 is recommended for all users to provide the best customer experience when using package quantity restrictions. The catalog button modification eliminates customer confusion and failed add-to-cart attempts.
|
||||
339
releases/RELEASE-INFO-1.1.3.md
Normal file
339
releases/RELEASE-INFO-1.1.3.md
Normal file
@@ -0,0 +1,339 @@
|
||||
# WooCommerce Tier and Package Prices - Release 1.1.3
|
||||
|
||||
**Release Date:** December 21, 2025
|
||||
**Version:** 1.1.3
|
||||
**Package Size:** 394 KB
|
||||
**Git Tag:** v1.1.3
|
||||
|
||||
## Download
|
||||
|
||||
**File:** `wc-tier-and-package-prices-1.1.3.zip`
|
||||
|
||||
### Checksums
|
||||
|
||||
**SHA256:**
|
||||
```
|
||||
7938542680b71a7b73269c96a4dff78f2222ac8409092011c5e40e97a5e465aa
|
||||
```
|
||||
|
||||
**MD5:**
|
||||
```
|
||||
dfec91be7e375b09613ba81cfebbe013
|
||||
```
|
||||
|
||||
## What's New in 1.1.3
|
||||
|
||||
This is a **bug fix release** that resolves cart quantity input visibility issues for products with package quantity restrictions.
|
||||
|
||||
### Bug Fixes
|
||||
- **Cart Quantity Input Visibility** - FIXED
|
||||
- Cart quantity inputs now properly hidden with increased filter priority (999)
|
||||
- Mini-cart/sidebar quantity inputs correctly replaced with read-only text
|
||||
- Added fallback CSS injection to handle theme/plugin conflicts
|
||||
- Enhanced DOM targeting with data attributes and multiple CSS selectors
|
||||
|
||||
### Technical Enhancements
|
||||
- Increased filter priority from 10 to 999 for `woocommerce_cart_item_quantity`
|
||||
- Added `woocommerce_widget_cart_item_quantity` filter for mini-cart support
|
||||
- Added `add_cart_quantity_css()` method for dynamic CSS injection
|
||||
- Added `maybe_hide_mini_cart_quantity_input()` method in WC_TPP_Cart class
|
||||
- Enhanced quantity spans with `data-product-id` attribute for targeted CSS
|
||||
- Added `wc-tpp-restricted-qty` CSS class for improved targeting
|
||||
- Implemented both sibling (+) and general sibling (~) CSS selectors for various DOM structures
|
||||
|
||||
## Problem Solved
|
||||
|
||||
**Issue:** In version 1.1.1 and 1.1.2, cart quantity inputs were still visible in the main cart and mini-cart/sidebar for products with package quantity restrictions, despite the feature being implemented.
|
||||
|
||||
**Root Cause:**
|
||||
1. Filter priority was too low (10), allowing other plugins to override
|
||||
2. Mini-cart used different filter hook (`woocommerce_widget_cart_item_quantity`)
|
||||
3. Some themes/plugins had DOM structures that prevented proper hiding
|
||||
4. No fallback mechanism for edge cases
|
||||
|
||||
**Solution:**
|
||||
1. Increased filter priority to 999 to ensure execution after other plugins
|
||||
2. Added separate filter for mini-cart quantity display
|
||||
3. Implemented dynamic CSS injection as fallback for all edge cases
|
||||
4. Used data attributes for product-specific CSS targeting
|
||||
5. Applied multiple CSS selectors (sibling + general sibling) to handle DOM variations
|
||||
|
||||
## What's Changed
|
||||
|
||||
### Fixed
|
||||
- Cart quantity input visibility issue in cart and cart sidebar for restricted products
|
||||
- Enhanced filter priority (999) to ensure quantity hiding runs after other plugins
|
||||
- Mini-cart quantity input now properly hidden for restricted products
|
||||
|
||||
### Added
|
||||
- `woocommerce_widget_cart_item_quantity` filter support for mini-cart
|
||||
- `add_cart_quantity_css()` method for dynamic CSS injection
|
||||
- `data-product-id` attribute to quantity spans for targeted CSS selectors
|
||||
- CSS class `wc-tpp-restricted-qty` for improved targeting
|
||||
|
||||
### Technical
|
||||
- Increased filter priority from 10 to 999 for `woocommerce_cart_item_quantity`
|
||||
- Added `maybe_hide_mini_cart_quantity_input()` method in WC_TPP_Cart class
|
||||
- Dynamic CSS injection via `wp_head` action as fallback
|
||||
- Used both sibling (+) and general sibling (~) CSS selectors for DOM variations
|
||||
|
||||
## Installation
|
||||
|
||||
### New Installation
|
||||
|
||||
1. Download the ZIP file: `wc-tier-and-package-prices-1.1.3.zip`
|
||||
2. Log in to your WordPress admin panel
|
||||
3. Navigate to **Plugins > Add New > Upload Plugin**
|
||||
4. Choose the downloaded ZIP file
|
||||
5. Click **Install Now**
|
||||
6. After installation, click **Activate Plugin**
|
||||
7. Go to **WooCommerce > Settings > Tier & Package Prices** to configure
|
||||
|
||||
### Upgrade from 1.1.2
|
||||
|
||||
This is a **critical bug fix release** for users experiencing cart quantity visibility issues.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate version 1.1.2
|
||||
2. Upload and activate version 1.1.3
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. Cart quantity inputs will now be properly hidden for restricted products
|
||||
5. No additional configuration required
|
||||
|
||||
### Upgrade from 1.1.1 or Earlier
|
||||
|
||||
Safe to upgrade directly. This version includes all features from v1.1.0, v1.1.1, and v1.1.2 plus the cart quantity visibility fix.
|
||||
|
||||
**Steps:**
|
||||
1. Deactivate the current version
|
||||
2. Upload and activate version 1.1.3
|
||||
3. All existing settings and data will be automatically preserved
|
||||
4. Cart quantity restriction feature now works correctly across all touchpoints
|
||||
|
||||
### Requirements
|
||||
|
||||
- **WordPress:** 6.0 or higher
|
||||
- **PHP:** 7.4 or higher
|
||||
- **WooCommerce:** 8.0 or higher
|
||||
|
||||
## Complete Package Restriction Feature (v1.1.0 + v1.1.1 + v1.1.2 + v1.1.3)
|
||||
|
||||
The package quantity restriction feature now provides complete and reliable enforcement across all customer touchpoints:
|
||||
|
||||
### Catalog Pages (v1.1.2)
|
||||
- ✅ "View Options" button instead of "Add to Cart" for restricted products
|
||||
- ✅ Eye icon for visual distinction
|
||||
- ✅ Direct link to product page
|
||||
- ✅ Prevents invalid add-to-cart attempts from shop/category pages
|
||||
|
||||
### Product Page (v1.1.0)
|
||||
- ✅ Quantity field automatically hidden when restriction enabled
|
||||
- ✅ "Choose a package size below" notice displayed
|
||||
- ✅ Visual package selection with highlighted states
|
||||
- ✅ JavaScript validation prevents form submission without package selection
|
||||
|
||||
### Add to Cart Validation (v1.1.0)
|
||||
- ✅ Server-side validation on add-to-cart
|
||||
- ✅ User-friendly error messages showing available package sizes
|
||||
- ✅ Prevents manual quantity manipulation via form fields
|
||||
|
||||
### Cart Page (v1.1.1 + v1.1.3 - FIXED)
|
||||
- ✅ Quantity field hidden/replaced with read-only text
|
||||
- ✅ Prevents cart quantity modification
|
||||
- ✅ Consistent restriction enforcement
|
||||
- ✅ No bypass via cart updates
|
||||
- ✅ Works with all themes and plugins (high priority filters + CSS fallback)
|
||||
- ✅ Mini-cart/sidebar properly handled
|
||||
|
||||
### Settings
|
||||
- ✅ Global setting to enable restrictions site-wide
|
||||
- ✅ Per-product override for individual products
|
||||
- ✅ Located in: WooCommerce > Settings > Tier & Package Prices
|
||||
|
||||
## Technical Implementation Details
|
||||
|
||||
### Cart Quantity Hiding Strategy (v1.1.3)
|
||||
|
||||
The implementation uses a multi-layered approach to ensure reliability:
|
||||
|
||||
**Layer 1: Filter Replacement**
|
||||
```php
|
||||
// High priority (999) to run after other plugins
|
||||
add_filter('woocommerce_cart_item_quantity', 'maybe_hide_cart_quantity_input', 999, 3);
|
||||
add_filter('woocommerce_widget_cart_item_quantity', 'maybe_hide_mini_cart_quantity_input', 999, 3);
|
||||
```
|
||||
|
||||
**Layer 2: HTML Replacement**
|
||||
Replace quantity input with read-only span:
|
||||
```php
|
||||
sprintf('<span class="wc-tpp-cart-quantity wc-tpp-restricted-qty" data-product-id="%d">%s</span>',
|
||||
$product_id,
|
||||
$cart_item['quantity']
|
||||
);
|
||||
```
|
||||
|
||||
**Layer 3: CSS Fallback**
|
||||
Dynamic CSS injection for edge cases:
|
||||
```php
|
||||
.cart_item .wc-tpp-restricted-qty[data-product-id="123"] + .quantity,
|
||||
.cart_item .wc-tpp-restricted-qty[data-product-id="123"] ~ .quantity {
|
||||
display: none !important;
|
||||
}
|
||||
```
|
||||
|
||||
This three-layer approach ensures cart quantity inputs are hidden regardless of theme, plugin conflicts, or DOM structure variations.
|
||||
|
||||
## Modified Files in 1.1.3
|
||||
|
||||
### Core Files Updated
|
||||
- `wc-tier-and-package-prices.php` - Version updated to 1.1.3
|
||||
- `composer.json` - Version updated to 1.1.3
|
||||
- `CHANGELOG.md` - Added v1.1.3 section
|
||||
|
||||
### PHP Classes Modified
|
||||
- `includes/class-wc-tpp-cart.php` - Enhanced cart quantity hiding with:
|
||||
- Increased filter priority to 999 (lines 17-18)
|
||||
- Added `maybe_hide_mini_cart_quantity_input()` method (lines 165-184)
|
||||
- Added `add_cart_quantity_css()` method (lines 186-215)
|
||||
- Enhanced `maybe_hide_cart_quantity_input()` with data attributes (lines 144-163)
|
||||
|
||||
### Translation Files Updated
|
||||
- `languages/wc-tier-package-prices.pot` - Version updated to 1.1.3
|
||||
- `languages/wc-tier-package-prices-en_US.po` - Version updated to 1.1.3
|
||||
- `languages/wc-tier-package-prices-de_DE.po` - Version updated to 1.1.3
|
||||
- `languages/wc-tier-package-prices-de_CH_informal.po` - Version updated to 1.1.3
|
||||
- All `.mo` files recompiled
|
||||
|
||||
## Complete Feature Set
|
||||
|
||||
### Tier Pricing
|
||||
- ✅ Quantity-based discount tiers
|
||||
- ✅ Automatic price calculation
|
||||
- ✅ Volume discount display
|
||||
|
||||
### Package Pricing
|
||||
- ✅ Fixed-price bundles
|
||||
- ✅ Custom package labels
|
||||
- ✅ Multiple package options per product
|
||||
- ✅ Quantity restriction to packages only (v1.1.0)
|
||||
- ✅ Cart quantity enforcement (v1.1.1 + v1.1.3 - FIXED)
|
||||
- ✅ Catalog button modification (v1.1.2)
|
||||
|
||||
### Admin Features
|
||||
- ✅ WooCommerce Settings integration
|
||||
- ✅ Easy-to-use product meta boxes
|
||||
- ✅ Configurable display positions
|
||||
- ✅ Native WooCommerce UI
|
||||
- ✅ Global restriction setting
|
||||
- ✅ Per-product restriction override
|
||||
|
||||
### Frontend Features
|
||||
- ✅ Beautiful pricing tables (Twig templates)
|
||||
- ✅ Real-time cart updates
|
||||
- ✅ Responsive design
|
||||
- ✅ 3 languages supported
|
||||
- ✅ Package-only selection mode
|
||||
- ✅ Automatic quantity field hiding (product page & cart)
|
||||
- ✅ Visual package selection
|
||||
- ✅ Read-only cart quantity display (FIXED in v1.1.3)
|
||||
- ✅ Catalog "View Options" button
|
||||
|
||||
### Validation & Security
|
||||
- ✅ Client-side JavaScript validation
|
||||
- ✅ Server-side cart validation
|
||||
- ✅ Cart quantity bypass prevention (FIXED in v1.1.3)
|
||||
- ✅ Catalog add-to-cart prevention
|
||||
- ✅ User-friendly error messages
|
||||
- ✅ WooCommerce HPOS compatible
|
||||
- ✅ Theme/plugin conflict resistant (v1.1.3)
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
**None.** This release is fully backward compatible with v1.1.2, v1.1.1, v1.1.0 and v1.0.x.
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From 1.1.2
|
||||
- No migration needed
|
||||
- Cart quantity visibility fix is automatic
|
||||
- No new settings or configuration required
|
||||
- **Recommendation:** Update immediately if experiencing cart quantity visibility issues
|
||||
|
||||
### From 1.1.1
|
||||
- All v1.1.2 and v1.1.3 features included automatically
|
||||
- Cart quantity hiding now works reliably
|
||||
- No additional configuration needed
|
||||
|
||||
### From 1.1.0 or Earlier
|
||||
- All v1.1.1, v1.1.2, and v1.1.3 features included automatically
|
||||
- Restriction features remain disabled by default
|
||||
- Must be explicitly enabled in settings
|
||||
|
||||
### Settings Location
|
||||
All settings remain in: **WooCommerce > Settings > Tier & Package Prices**
|
||||
|
||||
### Data Preservation
|
||||
- All existing tier pricing data preserved
|
||||
- All existing package pricing data preserved
|
||||
- All product meta data preserved
|
||||
- No database changes required
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### Current Version
|
||||
1. Restriction only works when packages are defined
|
||||
2. Cannot restrict to tier quantities (only packages)
|
||||
3. Restriction applies to entire product (no variation-level control)
|
||||
4. Cart quantity is read-only text (not a dropdown of package options)
|
||||
5. "View Options" button uses standard WooCommerce button styling
|
||||
|
||||
### Future Enhancements
|
||||
These features may be added in future versions:
|
||||
- Customizable "View Options" button text
|
||||
- Cart package quantity dropdown selector
|
||||
- Variation-level restriction control
|
||||
- Restrict to tier quantities option
|
||||
- Minimum/maximum package selection limits
|
||||
|
||||
## Changelog Summary
|
||||
|
||||
### Version History
|
||||
- **v1.1.3** (2025-12-21) - Cart quantity visibility bug fix
|
||||
- **v1.1.2** (2025-12-21) - Catalog button modification
|
||||
- **v1.1.1** (2025-12-21) - Cart quantity bypass fix
|
||||
- **v1.1.0** (2025-12-21) - Package quantity restriction feature
|
||||
- **v1.0.2** (2025-12-21) - WooCommerce Settings integration
|
||||
- **v1.0.1** (2025-12-21) - Twig template engine integration
|
||||
- **v1.0.0** (2025-12-21) - Initial release
|
||||
|
||||
## User Impact
|
||||
|
||||
### Before v1.1.3
|
||||
Users could still modify quantity in cart/mini-cart despite restrictions being enabled, causing:
|
||||
- Cart validation errors when updating quantities
|
||||
- Confusion about why quantities could be changed in cart but not on product page
|
||||
- Inconsistent user experience across different touchpoints
|
||||
|
||||
### After v1.1.3
|
||||
- Quantity inputs consistently hidden/disabled across all cart views
|
||||
- Clear read-only quantity display
|
||||
- No cart update errors
|
||||
- Consistent user experience
|
||||
- Works reliably with all themes and plugins
|
||||
|
||||
## Support
|
||||
|
||||
- **Documentation:** See README.md and CHANGELOG.md
|
||||
- **Previous Release:** See RELEASE-INFO-1.1.2.md
|
||||
- **Issues:** https://src.bundespruefstelle.ch/wc-tier-package-prices/issues
|
||||
- **Author:** Marco Graetsch
|
||||
|
||||
## License
|
||||
|
||||
GPL v2 or later - https://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
---
|
||||
|
||||
**Production Ready:** This package includes optimized autoloader and no development dependencies.
|
||||
|
||||
**Critical Update:** Version 1.1.3 is a critical bug fix for users experiencing cart quantity visibility issues with restricted products. Update recommended for all users using package quantity restrictions.
|
||||
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.0.1.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.0.1.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.0.1.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.0.1.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
e6cfc9b88df9e7763be0cd56517ce8ab wc-tier-and-package-prices-1.0.1.zip
|
||||
1
releases/wc-tier-and-package-prices-1.0.1.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.0.1.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
92c1385d92527e77646e37f23c1bd1555a4290a5ec9314c0ee6ed896ded55e88 wc-tier-and-package-prices-1.0.1.zip
|
||||
BIN
releases/wc-tier-and-package-prices-1.0.2.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.0.2.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.0.2.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.0.2.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
830f443ce4b65e2ca9cfede3257bc4f5 wc-tier-and-package-prices-1.0.2.zip
|
||||
1
releases/wc-tier-and-package-prices-1.0.2.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.0.2.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
c1a5339da10b3625156b8fff4ec848e4a1318d6edc497bd5026cfe0a3ef39daa wc-tier-and-package-prices-1.0.2.zip
|
||||
BIN
releases/wc-tier-and-package-prices-1.1.0.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.0.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.0.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.0.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
ef68125c54b0c10f04ba82d48a98b4aa wc-tier-and-package-prices-1.1.0.zip
|
||||
1
releases/wc-tier-and-package-prices-1.1.0.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.0.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
da6b462f3dc297b282ed0da258b78fd9f2f82f3e76289c4c8fadd1ac9e02c55b wc-tier-and-package-prices-1.1.0.zip
|
||||
BIN
releases/wc-tier-and-package-prices-1.1.1.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.1.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.1.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.1.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
51c4f8a7c3ccede2d2005f2fe3ebe44e wc-tier-and-package-prices-1.1.1.zip
|
||||
1
releases/wc-tier-and-package-prices-1.1.1.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.1.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
b951f8b7ddd2bad6b3415d4583709fdf88f66aea4eae70110c903757ff53e045 wc-tier-and-package-prices-1.1.1.zip
|
||||
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.2.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.2.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.2.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.2.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
eee69fcf391b3f3df9380306ffb31b1b wc-tier-and-package-prices-1.1.2.zip
|
||||
1
releases/wc-tier-and-package-prices-1.1.2.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.2.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
40ffd29ebc6af635f689472040acd220ae1c8df2f0d852fab4b43ce0fb5fe739 wc-tier-and-package-prices-1.1.2.zip
|
||||
BIN
releases/wc-tier-and-package-prices-1.1.3.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.3.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.3.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.3.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
dfec91be7e375b09613ba81cfebbe013 wc-tier-and-package-prices-1.1.3.zip
|
||||
1
releases/wc-tier-and-package-prices-1.1.3.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.3.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
7938542680b71a7b73269c96a4dff78f2222ac8409092011c5e40e97a5e465aa wc-tier-and-package-prices-1.1.3.zip
|
||||
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
|
||||
@@ -1,53 +0,0 @@
|
||||
{#
|
||||
# Admin Settings Page Template
|
||||
#
|
||||
# @package WC_Tier_Package_Prices
|
||||
#}
|
||||
<div class="wrap">
|
||||
<h1>{{ get_admin_page_title()|esc_html }}</h1>
|
||||
<form action="options.php" method="post">
|
||||
{{ settings_fields('wc_tpp_settings') }}
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="wc_tpp_enable_tier_pricing">{{ 'Enable Tier Pricing'|__('wc-tier-package-prices') }}</label>
|
||||
</th>
|
||||
<td>
|
||||
<input type="checkbox" id="wc_tpp_enable_tier_pricing" name="wc_tpp_enable_tier_pricing" value="yes" {{ checked(get_option('wc_tpp_enable_tier_pricing'), 'yes')|raw }}>
|
||||
<p class="description">{{ 'Enable tier pricing for products'|__('wc-tier-package-prices') }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="wc_tpp_enable_package_pricing">{{ 'Enable Package Pricing'|__('wc-tier-package-prices') }}</label>
|
||||
</th>
|
||||
<td>
|
||||
<input type="checkbox" id="wc_tpp_enable_package_pricing" name="wc_tpp_enable_package_pricing" value="yes" {{ checked(get_option('wc_tpp_enable_package_pricing'), 'yes')|raw }}>
|
||||
<p class="description">{{ 'Enable fixed-price packages for products'|__('wc-tier-package-prices') }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="wc_tpp_display_table">{{ 'Display Pricing Table'|__('wc-tier-package-prices') }}</label>
|
||||
</th>
|
||||
<td>
|
||||
<input type="checkbox" id="wc_tpp_display_table" name="wc_tpp_display_table" value="yes" {{ checked(get_option('wc_tpp_display_table'), 'yes')|raw }}>
|
||||
<p class="description">{{ 'Show tier and package pricing table on product pages'|__('wc-tier-package-prices') }}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<label for="wc_tpp_display_position">{{ 'Display Position'|__('wc-tier-package-prices') }}</label>
|
||||
</th>
|
||||
<td>
|
||||
<select id="wc_tpp_display_position" name="wc_tpp_display_position">
|
||||
<option value="before_add_to_cart" {{ selected(get_option('wc_tpp_display_position'), 'before_add_to_cart')|raw }}>{{ 'Before Add to Cart'|__('wc-tier-package-prices') }}</option>
|
||||
<option value="after_add_to_cart" {{ selected(get_option('wc_tpp_display_position'), 'after_add_to_cart')|raw }}>{{ 'After Add to Cart'|__('wc-tier-package-prices') }}</option>
|
||||
<option value="after_price" {{ selected(get_option('wc_tpp_display_position'), 'after_price')|raw }}>{{ 'After Price'|__('wc-tier-package-prices') }}</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{ submit_button() }}
|
||||
</form>
|
||||
</div>
|
||||
@@ -24,5 +24,13 @@
|
||||
placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
|
||||
class="short wc_input_price">
|
||||
</p>
|
||||
<p class="form-field">
|
||||
<label>{{ 'Label (Optional)'|__('wc-tier-package-prices') }}</label>
|
||||
<input type="text"
|
||||
name="_wc_tpp_tiers[{{ index|esc_attr }}][label]"
|
||||
value="{{ tier.label|default('')|esc_attr }}"
|
||||
placeholder="{{ 'e.g., Wholesale'|__('wc-tier-package-prices') }}"
|
||||
class="short">
|
||||
</p>
|
||||
<button type="button" class="button wc-tpp-remove-tier">{{ 'Remove'|__('wc-tier-package-prices') }}</button>
|
||||
</div>
|
||||
|
||||
@@ -3,13 +3,17 @@
|
||||
#
|
||||
# @package WC_Tier_Package_Prices
|
||||
# @var array packages
|
||||
# @var bool restrict_to_packages
|
||||
#}
|
||||
<div class="wc-tpp-package-pricing-table">
|
||||
<div class="wc-tpp-package-pricing-table{% if restrict_to_packages %} wc-tpp-restricted-mode{% endif %}">
|
||||
<h3>{{ 'Package Deals'|__('wc-tier-package-prices') }}</h3>
|
||||
{% if restrict_to_packages %}
|
||||
<p class="wc-tpp-restriction-notice">{{ 'Choose a package size below'|__('wc-tier-package-prices') }}</p>
|
||||
{% endif %}
|
||||
<div class="wc-tpp-packages">
|
||||
{% for index, package in packages %}
|
||||
{% set price_per_unit = package.qty > 0 ? package.price / package.qty : 0 %}
|
||||
<div class="wc-tpp-package" data-qty="{{ package.qty|esc_attr }}" data-price="{{ package.price|esc_attr }}">
|
||||
<div class="wc-tpp-package{% if restrict_to_packages %} wc-tpp-package-selectable{% endif %}" data-qty="{{ package.qty|esc_attr }}" data-price="{{ package.price|esc_attr }}">
|
||||
<div class="wc-tpp-package-header">
|
||||
{% if package.label is not empty %}
|
||||
<h4>{{ package.label|esc_html }}</h4>
|
||||
|
||||
@@ -12,6 +12,6 @@
|
||||
{% endif %}
|
||||
|
||||
{% if packages is not empty and get_option('wc_tpp_enable_package_pricing') == 'yes' %}
|
||||
{% include 'frontend/package-pricing-display.twig' with {'packages': packages} %}
|
||||
{% include 'frontend/package-pricing-display.twig' with {'packages': packages, 'restrict_to_packages': restrict_to_packages|default(false)} %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@@ -25,7 +25,12 @@
|
||||
{% set savings_percent = (savings / regular_price) * 100 %}
|
||||
{% endif %}
|
||||
<tr data-min-qty="{{ tier.min_qty|esc_attr }}" data-price="{{ tier.price|esc_attr }}">
|
||||
<td>{{ tier.min_qty|esc_html }}+</td>
|
||||
<td>
|
||||
{{ tier.min_qty|esc_html }}+
|
||||
{% if tier.label is defined and tier.label is not empty %}
|
||||
<br><small class="wc-tpp-tier-label">{{ tier.label|esc_html }}</small>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ wc_price(tier.price)|raw }}</td>
|
||||
<td>
|
||||
{% if savings > 0 %}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
/**
|
||||
* 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
|
||||
* Version: 1.0.1
|
||||
* Version: 1.1.15
|
||||
* 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.0.1');
|
||||
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
|
||||
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
|
||||
if (!defined('WC_TPP_VERSION')) {
|
||||
define('WC_TPP_VERSION', '1.1.15');
|
||||
}
|
||||
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,74 +59,70 @@ 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
|
||||
*/
|
||||
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() {
|
||||
if (null === self::$instance) {
|
||||
self::$instance = new self();
|
||||
public static function get_instance() {
|
||||
if (null === self::$instance) {
|
||||
self::$instance = new self();
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
private function __construct() {
|
||||
$this->init_hooks();
|
||||
$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);
|
||||
private function __construct() {
|
||||
$this->init_hooks();
|
||||
$this->includes();
|
||||
}
|
||||
}
|
||||
|
||||
public function load_textdomain() {
|
||||
load_plugin_textdomain('wc-tier-package-prices', false, dirname(WC_TPP_PLUGIN_BASENAME) . '/languages');
|
||||
}
|
||||
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'));
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
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 deactivate() {
|
||||
flush_rewrite_rules();
|
||||
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() {
|
||||
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
|
||||
function wc_tpp_init() {
|
||||
return WC_Tier_Package_Prices::get_instance();
|
||||
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