You've already forked wc-tier-and-package-prices
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f958c7b640 | |||
| b1d31f4894 | |||
| 0c75234dcb | |||
| 556cba20fa | |||
| d721ab123a | |||
| dfe1a4364a | |||
| 9b7638a7e2 | |||
| db9ba2bacd | |||
| e46372da51 | |||
| 2b2c06794b | |||
| 959229b9d8 | |||
| f0ab2ff755 | |||
| 4dd9b3cd62 | |||
| 9dab123209 | |||
| 3f117ae519 | |||
| 58bbd5164f | |||
| cfdbfe1504 | |||
| e4e4de82cb | |||
| af532b56eb | |||
| e2a11de80a | |||
| e40830b69b | |||
| 9765c5f119 | |||
| 5cfabedb94 | |||
| 88e30d028c | |||
| d55ada7924 | |||
| 4ece4dd69e | |||
| 3e06137559 | |||
| e0a32821ee | |||
| dea2c5f0b3 |
@@ -5,7 +5,21 @@
|
|||||||
"Bash(msgfmt:*)",
|
"Bash(msgfmt:*)",
|
||||||
"Bash(ls:*)",
|
"Bash(ls:*)",
|
||||||
"Bash(mkdir:*)",
|
"Bash(mkdir:*)",
|
||||||
"Bash(composer init:*)"
|
"Bash(composer init:*)",
|
||||||
|
"Bash(composer install:*)",
|
||||||
|
"Bash(composer update:*)",
|
||||||
|
"Bash(git add:*)",
|
||||||
|
"Bash(git tag:*)",
|
||||||
|
"Bash(rsync:*)",
|
||||||
|
"Bash(zip -r:*)",
|
||||||
|
"Bash(cat:*)",
|
||||||
|
"Bash(for po in *.po)",
|
||||||
|
"Bash(do msgfmt -o \"$po%.po.mo\" \"$po\")",
|
||||||
|
"Bash(done)",
|
||||||
|
"Bash(git commit:*)",
|
||||||
|
"Bash(node -c:*)",
|
||||||
|
"Bash(php -l:*)",
|
||||||
|
"Bash(git push:*)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -21,6 +21,10 @@ npm-debug.log
|
|||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
/logs
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
notes.*
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
456
CHANGELOG.md
456
CHANGELOG.md
@@ -5,6 +5,462 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.1.21] - 2025-12-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- New translation for `de_CH` (Swiss German - formal)
|
||||||
|
- New translation for `de_DE_informal` (Informal German)
|
||||||
|
- New translation for `fr_CH` (Swiss French)
|
||||||
|
- New translation for `it_CH` (Swiss Italian)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Updated all translation files (.po) to version 1.1.21
|
||||||
|
- Compiled all translation files to .mo format for runtime use
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Created 4 new locale-specific translation files following WordPress i18n standards
|
||||||
|
- Swiss locales use CHF currency formatting in examples (CHF 50.-, CHF 100.-)
|
||||||
|
- German informal translations use "du/dein" instead of "Sie/Ihr"
|
||||||
|
- All translations maintain consistent terminology across plugin UI
|
||||||
|
- Compiled .mo files included for immediate WordPress language support
|
||||||
|
|
||||||
|
## [1.1.20] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL**: Fatal error in WooCommerce Blocks cart/mini-cart: "Cannot use object of type WC_Product_Simple as array"
|
||||||
|
- Filter `woocommerce_store_api_product_quantity_editable` signature mismatch
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Updated `is_quantity_editable_in_blocks()` method to accept `WC_Product` object instead of cart item array
|
||||||
|
- Changed method signature from `is_quantity_editable_in_blocks($cart_item)` to `is_quantity_editable_in_blocks(WC_Product $product)`
|
||||||
|
- Use `$product->get_id()` instead of `$cart_item['product_id']` for product identification
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- WooCommerce Store API passes product object to this filter, not cart item array
|
||||||
|
- Previous code attempted array access on product object causing fatal error
|
||||||
|
- Error occurred at `includes/class-wc-tpp-cart.php:233`
|
||||||
|
- Affects WooCommerce Blocks-based cart, mini-cart, and checkout
|
||||||
|
- Classic cart/checkout unaffected (uses different hooks)
|
||||||
|
|
||||||
|
## [1.1.19] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page still appearing twice despite instance caching
|
||||||
|
- Duplicate detection using strict instance comparison failing for different object instances
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Enhanced duplicate detection to check by class type and ID instead of instance
|
||||||
|
- Added `instanceof WC_TPP_Settings` check
|
||||||
|
- Added ID-based duplicate detection via `get_id()` method and direct property access
|
||||||
|
- Multiple fallback checks to catch duplicates regardless of instance identity
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Previous strict comparison (`===`) failed when different instances of same class existed
|
||||||
|
- New approach checks: instanceof, get_id() method, and id property
|
||||||
|
- Returns early if any settings page with ID 'tier_package_prices' found
|
||||||
|
- Prevents duplicates even if settings instance recreated or serialized
|
||||||
|
|
||||||
|
## [1.1.18] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **ROOT CAUSE IDENTIFIED**: Settings page rendering twice due to automatic instantiation in settings file
|
||||||
|
- Settings file being included multiple times via Composer autoloader creating duplicate instances
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Removed `return new WC_TPP_Settings();` from bottom of settings file
|
||||||
|
- Changed admin class to explicitly instantiate settings with `new WC_TPP_Settings()`
|
||||||
|
- Changed from `include` to `require_once` for settings file to prevent multiple loads
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Settings file (class-wc-tpp-settings.php) was creating instance automatically on include
|
||||||
|
- File is in Composer's classmap, so when autoloaded it executed instantiation again
|
||||||
|
- Each include/autoload created new instance even with singleton pattern in admin class
|
||||||
|
- Solution: Remove automatic instantiation, use `require_once` + explicit `new` in admin class
|
||||||
|
- Now settings instance only created once, explicitly, when needed by filter
|
||||||
|
- Composer autoload can load class definition without side effects
|
||||||
|
|
||||||
|
## [1.1.17] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page still rendering twice despite singleton pattern in v1.1.16
|
||||||
|
- Filter adding settings instance to array multiple times when called repeatedly
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Added duplicate detection in `add_settings_page()` filter method
|
||||||
|
- Filter now checks if settings instance already exists in array before adding
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Added foreach loop to check existing settings pages in array
|
||||||
|
- Uses strict comparison (`===`) to detect if exact instance already present
|
||||||
|
- Returns early if settings instance found, preventing duplicate array entries
|
||||||
|
- Complements singleton pattern from v1.1.16 with array-level duplicate prevention
|
||||||
|
- Handles edge case where WooCommerce calls filter multiple times
|
||||||
|
|
||||||
|
## [1.1.16] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page still rendering twice in WooCommerce backend despite v1.1.15 fix
|
||||||
|
- Multiple instantiation of WC_TPP_Admin and WC_TPP_Settings classes
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Implemented singleton pattern for WC_TPP_Admin class with `get_instance()` method
|
||||||
|
- Made WC_TPP_Admin constructor private to prevent direct instantiation
|
||||||
|
- Added static caching of WC_TPP_Settings instance to prevent duplicate creation
|
||||||
|
- Changed class instantiation from `new WC_TPP_Admin()` to `WC_TPP_Admin::get_instance()`
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Added `private static $instance` property to WC_TPP_Admin class
|
||||||
|
- Added `private static $settings_instance` property to cache settings page instance
|
||||||
|
- Modified `add_settings_page()` to check and reuse cached settings instance
|
||||||
|
- Ensures only one instance of each class exists throughout plugin lifecycle
|
||||||
|
- Prevents duplicate filter registrations even if called multiple times
|
||||||
|
|
||||||
|
## [1.1.15] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Settings page rendering twice in WooCommerce settings
|
||||||
|
- Duplicate instantiation of WC_TPP_Settings class causing double rendering
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Removed conditional `if (class_exists('WC_TPP_Settings'))` wrapper from settings return statement
|
||||||
|
- Settings class now only instantiated via `return new WC_TPP_Settings();` when included by admin class
|
||||||
|
- Matches v1.1.2 pattern where settings file returns instance without automatic instantiation
|
||||||
|
- Prevents double registration in WooCommerce settings pages array
|
||||||
|
|
||||||
|
## [1.1.14] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Plugin completely non-functional in v1.1.8-1.1.13 - no settings, no frontend, no backend
|
||||||
|
- Classes never instantiated due to incorrect initialization pattern introduced in v1.1.8
|
||||||
|
- Restored v1.1.2 pattern: classes auto-instantiate when files are included
|
||||||
|
- All plugin functionality now working: settings page, product meta boxes, frontend display, cart integration
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Reverted to direct class instantiation pattern from v1.1.2 (last known working version)
|
||||||
|
- Removed `init_classes()` method and `woocommerce_loaded` hook approach from v1.1.8
|
||||||
|
- Each class file now instantiates itself with `new ClassName()` at end of file
|
||||||
|
- Simplified plugin initialization for better reliability
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Restored class instantiation in all 5 component files:
|
||||||
|
- `class-wc-tpp-admin.php`: Added `new WC_TPP_Admin();` after class declaration
|
||||||
|
- `class-wc-tpp-product-meta.php`: Added `new WC_TPP_Product_Meta();` after class declaration
|
||||||
|
- `class-wc-tpp-frontend.php`: Added `new WC_TPP_Frontend();` after class declaration
|
||||||
|
- `class-wc-tpp-cart.php`: Added `new WC_TPP_Cart();` after class declaration
|
||||||
|
- `class-wc-tpp-settings.php`: Already has instantiation via return statement
|
||||||
|
- Removed `init_classes()` method from main plugin class
|
||||||
|
- Removed `woocommerce_loaded` hook that delayed class instantiation
|
||||||
|
- Classes now instantiate immediately when `require_once` loads them
|
||||||
|
- All `class_exists()` guards remain in place for redeclaration protection
|
||||||
|
|
||||||
|
## [1.1.13] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Class redeclaration errors for all plugin component classes affecting version 1.1.12
|
||||||
|
- Fatal errors "Cannot redeclare class WC_TPP_Admin", "Cannot redeclare class WC_TPP_Product_Meta", "Cannot redeclare class WC_TPP_Frontend", "Cannot redeclare class WC_TPP_Cart", "Cannot redeclare class WC_TPP_Settings"
|
||||||
|
- Plugin functionality completely broken in v1.1.12 - no settings page, no frontend display, no backend controls
|
||||||
|
- All plugin features now working correctly after adding class guards
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped all 5 plugin component class declarations in `class_exists()` checks:
|
||||||
|
- `WC_TPP_Admin` (includes/class-wc-tpp-admin.php)
|
||||||
|
- `WC_TPP_Product_Meta` (includes/class-wc-tpp-product-meta.php)
|
||||||
|
- `WC_TPP_Frontend` (includes/class-wc-tpp-frontend.php)
|
||||||
|
- `WC_TPP_Cart` (includes/class-wc-tpp-cart.php)
|
||||||
|
- `WC_TPP_Settings` (includes/class-wc-tpp-settings.php)
|
||||||
|
- Completes comprehensive redeclaration protection started in v1.1.9-1.1.12
|
||||||
|
- All functions, constants, and classes now fully protected against redeclaration
|
||||||
|
- Plugin now activates and functions correctly without fatal errors
|
||||||
|
|
||||||
|
## [1.1.12] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Class redeclaration error for `WC_Tier_Package_Prices` affecting version 1.1.11
|
||||||
|
- Fatal error "Cannot redeclare class WC_Tier_Package_Prices" when plugin file loaded multiple times
|
||||||
|
- Plugin activation failures caused by class redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `WC_Tier_Package_Prices` class declaration in `class_exists()` check
|
||||||
|
- Completes comprehensive redeclaration protection for all plugin components
|
||||||
|
- Prevents fatal errors during WordPress plugin activation/deactivation cycles
|
||||||
|
- All functions, constants, and classes now safely guarded against redeclaration
|
||||||
|
|
||||||
|
## [1.1.11] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Constant redeclaration warnings/errors for plugin constants affecting versions 1.1.3-1.1.10
|
||||||
|
- Potential errors when plugin constants (WC_TPP_VERSION, WC_TPP_PLUGIN_DIR, etc.) already defined
|
||||||
|
- Plugin initialization failures caused by constant redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped all `define()` calls in `defined()` checks for WC_TPP_VERSION, WC_TPP_PLUGIN_DIR, WC_TPP_PLUGIN_URL, WC_TPP_PLUGIN_BASENAME
|
||||||
|
- Prevents warnings/errors during WordPress plugin activation/deactivation cycles
|
||||||
|
- Completes comprehensive protection against all redeclaration issues
|
||||||
|
- All global functions and constants now safely guarded
|
||||||
|
|
||||||
|
## [1.1.10] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Function redeclaration error for `wc_tpp_init()` affecting version 1.1.9
|
||||||
|
- Fatal error "Cannot redeclare function wc_tpp_init()" when plugin file loaded multiple times
|
||||||
|
- Plugin activation failures caused by function redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `wc_tpp_init()` function in `function_exists()` check
|
||||||
|
- Completes the fix started in v1.1.9 by protecting all global functions
|
||||||
|
- Prevents fatal errors during WordPress plugin activation cycles
|
||||||
|
- Both `wc_tpp_woocommerce_missing_notice()` and `wc_tpp_init()` now safely guarded
|
||||||
|
|
||||||
|
## [1.1.9] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Function redeclaration error for `wc_tpp_woocommerce_missing_notice()` affecting versions 1.1.3-1.1.8
|
||||||
|
- Fatal error "Cannot redeclare function wc_tpp_woocommerce_missing_notice()" when plugin file loaded multiple times
|
||||||
|
- Plugin activation and deactivation failures caused by function redeclaration
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Wrapped `wc_tpp_woocommerce_missing_notice()` function in `function_exists()` check
|
||||||
|
- Prevents fatal error during WordPress plugin activation/deactivation cycles
|
||||||
|
- Ensures function can safely be declared even if file is included multiple times
|
||||||
|
- Moved function declaration before WooCommerce check for better code organization
|
||||||
|
|
||||||
|
## [1.1.8] - 2025-12-22
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **CRITICAL:** Plugin activation fatal error introduced in v1.1.3-v1.1.7
|
||||||
|
- Fixed premature class instantiation of `WC_TPP_Admin` and `WC_TPP_Product_Meta`
|
||||||
|
- Both classes now instantiated via `woocommerce_loaded` hook after WooCommerce is available
|
||||||
|
- Resolves WordPress 6.9.x and WooCommerce 10.x compatibility issues
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Removed `new WC_TPP_Admin();` from bottom of class-wc-tpp-admin.php
|
||||||
|
- Removed `new WC_TPP_Product_Meta();` from bottom of class-wc-tpp-product-meta.php
|
||||||
|
- Added both classes to `init_classes()` method in main plugin file
|
||||||
|
- All four main classes (Admin, Product Meta, Frontend, Cart) now follow same initialization pattern
|
||||||
|
- Ensures WooCommerce hooks are available before registration
|
||||||
|
|
||||||
|
## [1.1.7] - 2025-12-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Optional text labels for tier pricing (similar to package labels)
|
||||||
|
- Clickable tier pricing rows that auto-populate quantity field
|
||||||
|
- Add to Cart button auto-disable when quantity is 0 or less
|
||||||
|
|
||||||
|
### Enhanced
|
||||||
|
|
||||||
|
- Tier pricing table rows now clickable with visual hover feedback
|
||||||
|
- Clicking a tier row sets quantity to that tier's minimum quantity
|
||||||
|
- Smooth scroll animation to quantity field when tier is clicked
|
||||||
|
- Add to Cart button disabled state with visual feedback (opacity, cursor)
|
||||||
|
- Tier labels display below quantity in frontend table (italic, gray text)
|
||||||
|
|
||||||
|
### Technical Details
|
||||||
|
|
||||||
|
- Added optional `label` field to tier pricing meta box (admin/tier-row.twig)
|
||||||
|
- Updated tier save logic to store label field (class-wc-tpp-product-meta.php)
|
||||||
|
- Enhanced tier pricing template to display labels (frontend/tier-pricing-table.twig)
|
||||||
|
- Added click handler for tier rows (assets/js/frontend.js)
|
||||||
|
- Added `updateAddToCartButton()` function to manage button state
|
||||||
|
- CSS: `.wc-tpp-tier-label` styling for tier labels
|
||||||
|
- CSS: Clickable cursor and hover animation for tier rows
|
||||||
|
- CSS: Disabled button styling (`.single_add_to_cart_button:disabled`)
|
||||||
|
|
||||||
|
## [1.1.6] - 2025-12-21
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **CRITICAL:** Plugin activation fatal error in v1.1.3, v1.1.4, and v1.1.5
|
||||||
|
- Fatal error caused by premature class instantiation before WooCommerce is loaded
|
||||||
|
- Removed immediate class instantiation from `class-wc-tpp-cart.php` and `class-wc-tpp-frontend.php`
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- Moved `WC_TPP_Cart` and `WC_TPP_Frontend` instantiation to `woocommerce_loaded` hook
|
||||||
|
- Added `init_classes()` method to main plugin class for controlled class initialization
|
||||||
|
- Ensures WooCommerce is fully loaded before registering hooks that depend on WC functions
|
||||||
|
- Fixed hook registration timing to prevent accessing WooCommerce before it's available
|
||||||
|
|
||||||
|
## [1.1.5] - 2025-12-21
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **CRITICAL:** Plugin activation error in v1.1.3 and v1.1.4 caused by `add_cart_quantity_css()` method
|
||||||
|
- Fatal error when WooCommerce cart object not available during plugin initialization
|
||||||
|
- Frontend errors on admin pages and during activation
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- Added `function_exists('WC')` check before accessing WooCommerce functions
|
||||||
|
- Added `is_admin()` check to prevent CSS injection on admin pages
|
||||||
|
- Enhanced error prevention in `add_cart_quantity_css()` method
|
||||||
|
|
||||||
|
## [1.1.4] - 2025-12-21
|
||||||
|
|
||||||
|
### 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
|
## [1.0.1] - 2025-12-21
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
488
CLAUDE.md
Normal file
488
CLAUDE.md
Normal file
@@ -0,0 +1,488 @@
|
|||||||
|
# WooCommerce Tier and Package Prices - AI Context Document
|
||||||
|
|
||||||
|
**Last Updated:** 2025-12-23
|
||||||
|
**Current Version:** 1.1.21
|
||||||
|
**Author:** Marco Graetsch
|
||||||
|
**Project Status:** Production-ready WordPress plugin
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
This is a WooCommerce plugin that adds flexible pricing capabilities to products through two distinct pricing models:
|
||||||
|
|
||||||
|
1. **Tier Pricing (Volume Discounts)**: Progressive discounts based on quantity ranges (e.g., 1-9 items @ $12, 10-24 @ $10, 25+ @ $8)
|
||||||
|
2. **Package Pricing (Fixed Bundles)**: Exact quantity packages at fixed prices (e.g., exactly 10 items for $95, exactly 25 for $200)
|
||||||
|
|
||||||
|
### Key Fact: 100% AI-Generated
|
||||||
|
This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase was created through AI assistance.
|
||||||
|
|
||||||
|
## Technical Stack
|
||||||
|
|
||||||
|
- **Language:** PHP 7.4+
|
||||||
|
- **Framework:** WordPress Plugin API
|
||||||
|
- **E-commerce:** WooCommerce 8.0+ (tested up to 10.x)
|
||||||
|
- **Template Engine:** Twig 3.0 (via Composer)
|
||||||
|
- **Frontend:** Vanilla JavaScript + jQuery
|
||||||
|
- **Styling:** Custom CSS
|
||||||
|
- **Dependency Management:** Composer
|
||||||
|
- **Internationalization:** WordPress i18n (.pot/.po/.mo files)
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"twig/twig": "^3.0",
|
||||||
|
"symfony/polyfill-ctype": "^1.x",
|
||||||
|
"symfony/polyfill-mbstring": "^1.x"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Directory Structure
|
||||||
|
```
|
||||||
|
wc-tier-and-package-prices/
|
||||||
|
├── wc-tier-and-package-prices.php # Main plugin file (entry point)
|
||||||
|
├── includes/ # PHP classes
|
||||||
|
│ ├── class-wc-tpp-admin.php # Admin settings integration
|
||||||
|
│ ├── class-wc-tpp-settings.php # WooCommerce settings page
|
||||||
|
│ ├── class-wc-tpp-product-meta.php # Product edit page meta boxes
|
||||||
|
│ ├── class-wc-tpp-frontend.php # Product page display logic
|
||||||
|
│ ├── class-wc-tpp-cart.php # Cart price calculations
|
||||||
|
│ └── class-wc-tpp-template-loader.php # Twig template loader
|
||||||
|
├── templates/ # Twig templates
|
||||||
|
│ ├── admin/ # Admin interface templates
|
||||||
|
│ │ ├── tier-row.twig # Single tier input row
|
||||||
|
│ │ └── package-row.twig # Single package input row
|
||||||
|
│ └── frontend/ # Customer-facing templates
|
||||||
|
│ ├── pricing-table.twig # Main pricing display wrapper
|
||||||
|
│ ├── tier-pricing-table.twig # Tier pricing display
|
||||||
|
│ └── package-pricing-display.twig # Package buttons/cards
|
||||||
|
├── assets/
|
||||||
|
│ ├── css/
|
||||||
|
│ │ ├── admin.css # Backend styling
|
||||||
|
│ │ └── frontend.css # Product page & cart styling
|
||||||
|
│ └── js/
|
||||||
|
│ ├── admin.js # Meta box interaction (add/remove rows)
|
||||||
|
│ └── frontend.js # Dynamic price updates, package selection
|
||||||
|
├── languages/ # Translation files
|
||||||
|
│ ├── *.pot # Translation template
|
||||||
|
│ ├── *.po # Translation sources
|
||||||
|
│ └── *.mo # Compiled translations
|
||||||
|
├── vendor/ # Composer dependencies (included in releases)
|
||||||
|
├── releases/ # Release packages (not in git)
|
||||||
|
└── *.md # Documentation files
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Class Responsibilities
|
||||||
|
|
||||||
|
#### 1. `WC_Tier_Package_Prices` (Main Plugin Class)
|
||||||
|
|
||||||
|
- **Location:** `wc-tier-and-package-prices.php`
|
||||||
|
- **Pattern:** Singleton
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Plugin initialization and bootstrapping
|
||||||
|
- Loading all component classes via `includes()`
|
||||||
|
- HPOS (High-Performance Order Storage) compatibility declaration
|
||||||
|
- Text domain loading for internationalization
|
||||||
|
- Activation/deactivation hooks
|
||||||
|
|
||||||
|
#### 2. `WC_TPP_Admin`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-admin.php`
|
||||||
|
- **Pattern:** Singleton
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Enqueues admin CSS/JS
|
||||||
|
- Registers WooCommerce settings page via filter
|
||||||
|
- Manages settings page instance (cached to prevent duplicates)
|
||||||
|
- Product meta box asset loading
|
||||||
|
|
||||||
|
#### 3. `WC_TPP_Settings`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-settings.php`
|
||||||
|
- **Extends:** `WC_Settings_Page` (WooCommerce core)
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Creates "Tier & Package Prices" tab in WooCommerce settings
|
||||||
|
- Defines global plugin settings (enable/disable features, display position, etc.)
|
||||||
|
- Setting persistence through WooCommerce options API
|
||||||
|
|
||||||
|
**Global Settings:**
|
||||||
|
|
||||||
|
- `wc_tpp_enable_tier_pricing` (yes/no)
|
||||||
|
- `wc_tpp_enable_package_pricing` (yes/no)
|
||||||
|
- `wc_tpp_display_table` (yes/no) - Show pricing tables on product pages
|
||||||
|
- `wc_tpp_display_position` (before_add_to_cart / after_add_to_cart / after_price)
|
||||||
|
- `wc_tpp_restrict_package_quantities` (yes/no) - Global quantity restrictions
|
||||||
|
|
||||||
|
#### 4. `WC_TPP_Product_Meta`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-product-meta.php`
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Adds tier/package pricing fields to product edit page
|
||||||
|
- Renders Twig templates for meta box rows
|
||||||
|
- Saves tier/package data to post meta
|
||||||
|
- Nonce verification and capability checks for security
|
||||||
|
- Prevents autosave from corrupting data
|
||||||
|
|
||||||
|
**Product Meta Keys:**
|
||||||
|
|
||||||
|
- `_wc_tpp_tiers` - Array of tier objects `[{min_qty, price, label}]`
|
||||||
|
- `_wc_tpp_packages` - Array of package objects `[{qty, price, label}]`
|
||||||
|
- `_wc_tpp_restrict_to_packages` - Per-product quantity restriction (yes/no)
|
||||||
|
|
||||||
|
#### 5. `WC_TPP_Frontend`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-frontend.php`
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Enqueues frontend CSS/JS on product pages
|
||||||
|
- Displays pricing tables via Twig templates
|
||||||
|
- Localizes currency settings to JavaScript
|
||||||
|
- Hides quantity inputs for restricted products
|
||||||
|
- Modifies catalog "Add to Cart" buttons to "View Options" for restricted products
|
||||||
|
- Static methods for price lookups (`get_tier_price()`, `get_package_price()`)
|
||||||
|
|
||||||
|
#### 6. `WC_TPP_Cart`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-cart.php`
|
||||||
|
- **Responsibilities:**
|
||||||
|
- **MOST CRITICAL CLASS** - Handles all cart price calculations
|
||||||
|
- Applies tier/package pricing during cart totals calculation
|
||||||
|
- Stores pricing metadata in cart items for display
|
||||||
|
- Customizes cart item display (price labels, quantity indicators)
|
||||||
|
- Validates package quantities on add-to-cart
|
||||||
|
- Hides/disables quantity inputs for restricted products (classic cart + blocks)
|
||||||
|
- **WooCommerce Blocks support** via `woocommerce_store_api_product_quantity_editable` filter
|
||||||
|
|
||||||
|
**Price Calculation Priority (in `apply_tier_package_pricing()`):**
|
||||||
|
|
||||||
|
1. Check for exact package match → Use package price if found
|
||||||
|
2. Check for tier match → Use tier price if found
|
||||||
|
3. Fall back to regular product price
|
||||||
|
|
||||||
|
#### 7. `WC_TPP_Template_Loader`
|
||||||
|
|
||||||
|
- **Location:** `includes/class-wc-tpp-template-loader.php`
|
||||||
|
- **Pattern:** Singleton
|
||||||
|
- **Responsibilities:**
|
||||||
|
- Initializes Twig environment with proper paths
|
||||||
|
- Renders Twig templates from both admin and frontend directories
|
||||||
|
- Handles template caching and error handling
|
||||||
|
|
||||||
|
## Important Implementation Details
|
||||||
|
|
||||||
|
### Price Calculation Logic
|
||||||
|
|
||||||
|
**Package Pricing** (exact match):
|
||||||
|
```php
|
||||||
|
// In cart: if quantity == 10 and package exists for 10, use package price
|
||||||
|
if ($quantity == $package['qty']) {
|
||||||
|
$unit_price = $package['price'] / $quantity; // Total price divided by quantity
|
||||||
|
$product->set_price($unit_price); // WooCommerce expects unit price
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Tier Pricing** (range-based):
|
||||||
|
```php
|
||||||
|
// In cart: if quantity >= 10, use tier price for quantities 10+
|
||||||
|
foreach ($tiers as $tier) {
|
||||||
|
if ($quantity >= $tier['min_qty']) {
|
||||||
|
$applicable_price = $tier['price']; // This is already unit price
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$product->set_price($applicable_price);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quantity Restriction Feature
|
||||||
|
|
||||||
|
Products can be configured to ONLY allow purchase in package quantities:
|
||||||
|
|
||||||
|
- **Global setting:** `wc_tpp_restrict_package_quantities`
|
||||||
|
- **Per-product setting:** `_wc_tpp_restrict_to_packages`
|
||||||
|
- **When enabled:**
|
||||||
|
- Quantity inputs are hidden on product page, cart, and mini-cart
|
||||||
|
- Customers must use package selection buttons
|
||||||
|
- Validation prevents arbitrary quantities from being added
|
||||||
|
- Catalog buttons change to "View Options" instead of "Add to Cart"
|
||||||
|
|
||||||
|
### WooCommerce Blocks Compatibility
|
||||||
|
|
||||||
|
**CRITICAL BUG FIXED in v1.1.20:**
|
||||||
|
|
||||||
|
- Filter `woocommerce_store_api_product_quantity_editable` passes `WC_Product` object, NOT cart item array
|
||||||
|
- Previous code tried to use product object as array → fatal error
|
||||||
|
- Fixed by accepting product object and using `$product->get_id()`
|
||||||
|
|
||||||
|
### Cart Item Metadata
|
||||||
|
|
||||||
|
The plugin stores additional data in cart items for display purposes:
|
||||||
|
|
||||||
|
```php
|
||||||
|
WC()->cart->cart_contents[$cart_item_key]['wc_tpp_pricing_type'] = 'package' | 'tier';
|
||||||
|
WC()->cart->cart_contents[$cart_item_key]['wc_tpp_total_price'] = 99.99; // For packages
|
||||||
|
WC()->cart->cart_contents[$cart_item_key]['wc_tpp_unit_price'] = 9.99; // For tiers
|
||||||
|
```
|
||||||
|
|
||||||
|
This metadata is used by display filters to show "(Package price)" or "(Volume discount)" labels.
|
||||||
|
|
||||||
|
## Common Patterns & Conventions
|
||||||
|
|
||||||
|
### Class Instantiation Pattern
|
||||||
|
All classes auto-instantiate at the end of their file:
|
||||||
|
```php
|
||||||
|
if (!class_exists('WC_TPP_Frontend')) {
|
||||||
|
class WC_TPP_Frontend {
|
||||||
|
// class code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new WC_TPP_Frontend(); // Auto-instantiate
|
||||||
|
```
|
||||||
|
|
||||||
|
**Exception:** Admin and Settings classes use singleton pattern to prevent duplicates.
|
||||||
|
|
||||||
|
### Security Best Practices
|
||||||
|
|
||||||
|
- All user inputs are sanitized (integers for quantities/prices)
|
||||||
|
- Nonce verification on form submissions
|
||||||
|
- Capability checks (`edit_products`) before saving
|
||||||
|
- Output escaping in templates (`esc_attr`, `esc_html`, `esc_js`)
|
||||||
|
- Direct file access prevention via `ABSPATH` check
|
||||||
|
|
||||||
|
### Translation Ready
|
||||||
|
All user-facing strings use:
|
||||||
|
```php
|
||||||
|
__('Text to translate', 'wc-tier-package-prices')
|
||||||
|
_e('Text to translate', 'wc-tier-package-prices')
|
||||||
|
```
|
||||||
|
|
||||||
|
Text domain: `wc-tier-package-prices`
|
||||||
|
|
||||||
|
**Available Translations (as of v1.1.21):**
|
||||||
|
|
||||||
|
- `en_US` - English (United States)
|
||||||
|
- `de_DE` - German (Germany, formal)
|
||||||
|
- `de_DE_informal` - German (Germany, informal "du")
|
||||||
|
- `de_CH` - German (Switzerland, formal "Sie")
|
||||||
|
- `de_CH_informal` - German (Switzerland, informal "du")
|
||||||
|
- `fr_CH` - French (Switzerland)
|
||||||
|
- `it_CH` - Italian (Switzerland)
|
||||||
|
|
||||||
|
Note: Swiss locales use CHF currency formatting in examples (e.g., "CHF 50.-")
|
||||||
|
|
||||||
|
## Known Issues & Historical Context
|
||||||
|
|
||||||
|
### Settings Page Duplication Saga (v1.1.15-1.1.19)
|
||||||
|
Multiple versions attempted to fix settings page appearing twice:
|
||||||
|
|
||||||
|
- **Root cause:** Settings file auto-instantiation + Composer autoloader
|
||||||
|
- **Solution:** Removed auto-instantiation from settings file, explicit instantiation in admin class
|
||||||
|
- **Prevention:** Singleton pattern + duplicate detection in array
|
||||||
|
|
||||||
|
### Class Redeclaration Issues (v1.1.8-1.1.14)
|
||||||
|
Plugin was completely non-functional:
|
||||||
|
|
||||||
|
- **Cause:** Incorrect initialization pattern without `class_exists()` guards
|
||||||
|
- **Solution:** Added guards and restored direct instantiation pattern
|
||||||
|
- **Lesson:** Always wrap class declarations in `class_exists()` checks
|
||||||
|
|
||||||
|
### WooCommerce Blocks Fatal Error (v1.1.19 → v1.1.20)
|
||||||
|
```
|
||||||
|
Fatal error: Cannot use object of type WC_Product_Simple as array
|
||||||
|
Location: includes/class-wc-tpp-cart.php:233
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Cause:** Filter signature mismatch - expected array, received product object
|
||||||
|
- **Fix:** Changed method signature to accept `WC_Product $product` instead of `$cart_item` array
|
||||||
|
- **Status:** FIXED in v1.1.20
|
||||||
|
|
||||||
|
## Release Process
|
||||||
|
|
||||||
|
### Version Bumping
|
||||||
|
Update version in 3 places:
|
||||||
|
|
||||||
|
1. `wc-tier-and-package-prices.php` - Plugin header comment (line 7)
|
||||||
|
2. `wc-tier-and-package-prices.php` - `WC_TPP_VERSION` constant (line 26)
|
||||||
|
3. `composer.json` - version field (optional, not critical)
|
||||||
|
|
||||||
|
### Creating Release Package
|
||||||
|
```bash
|
||||||
|
# From project root
|
||||||
|
cd releases
|
||||||
|
|
||||||
|
# Create zip excluding dev files
|
||||||
|
zip -r wc-tier-and-package-prices-X.X.X.zip .. \
|
||||||
|
-x '*.git*' '*.log' '.claude/*' 'CLAUDE.md' 'releases/*' 'node_modules/*' \
|
||||||
|
'.DS_Store' 'Thumbs.db' '.vscode/*' '.idea/*' '*.sublime-*' \
|
||||||
|
'notes.*' 'logs/*' 'templates/cache/*' 'composer.lock'
|
||||||
|
|
||||||
|
# Generate checksums
|
||||||
|
md5sum wc-tier-and-package-prices-X.X.X.zip > wc-tier-and-package-prices-X.X.X.zip.md5
|
||||||
|
sha256sum wc-tier-and-package-prices-X.X.X.zip > wc-tier-and-package-prices-X.X.X.zip.sha256
|
||||||
|
```
|
||||||
|
|
||||||
|
**IMPORTANT:** The `vendor/` directory MUST be included in releases (Twig dependency required for runtime).
|
||||||
|
|
||||||
|
### What Gets Released
|
||||||
|
|
||||||
|
- All plugin source files
|
||||||
|
- Compiled vendor dependencies
|
||||||
|
- Translation files (.mo compiled from .po)
|
||||||
|
- Assets (CSS, JS)
|
||||||
|
- Documentation (README, CHANGELOG, etc.)
|
||||||
|
|
||||||
|
### What's Excluded
|
||||||
|
|
||||||
|
- Git metadata (`.git/`)
|
||||||
|
- Development files (`.vscode/`, `.claude/`, `CLAUDE.md`)
|
||||||
|
- Logs and cache files
|
||||||
|
- Previous releases
|
||||||
|
- `composer.lock` (but `vendor/` is included)
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
When making changes, test these critical paths:
|
||||||
|
|
||||||
|
### Admin
|
||||||
|
|
||||||
|
- [ ] Settings page appears once under WooCommerce > Tier & Package Prices
|
||||||
|
- [ ] Settings save correctly
|
||||||
|
- [ ] Product edit page shows tier/package meta boxes
|
||||||
|
- [ ] Adding/removing tiers works
|
||||||
|
- [ ] Adding/removing packages works
|
||||||
|
- [ ] Data saves when clicking "Update" on product
|
||||||
|
|
||||||
|
### Frontend (Product Page)
|
||||||
|
|
||||||
|
- [ ] Pricing tables display when configured
|
||||||
|
- [ ] Package buttons update quantity selector
|
||||||
|
- [ ] Price updates dynamically when quantity changes
|
||||||
|
- [ ] Restricted products hide quantity input
|
||||||
|
- [ ] "View Options" appears on catalog for restricted products
|
||||||
|
|
||||||
|
### Cart & Checkout
|
||||||
|
|
||||||
|
- [ ] Correct prices applied for tier pricing
|
||||||
|
- [ ] Correct prices applied for package pricing
|
||||||
|
- [ ] Cart displays pricing type labels
|
||||||
|
- [ ] Package quantities can't be edited if restricted
|
||||||
|
- [ ] Prices recalculate if quantity changed (non-restricted products)
|
||||||
|
- [ ] Checkout totals are correct
|
||||||
|
|
||||||
|
### WooCommerce Blocks (Critical!)
|
||||||
|
|
||||||
|
- [ ] Mini cart block doesn't throw fatal errors
|
||||||
|
- [ ] Cart block works correctly
|
||||||
|
- [ ] Checkout block processes orders
|
||||||
|
- [ ] Quantity editable flag works for blocks
|
||||||
|
|
||||||
|
## Development Tips for Future AI Assistants
|
||||||
|
|
||||||
|
### Future Features and Roadmap
|
||||||
|
|
||||||
|
The is a hierarchical list for upcoming features and can be considered as a
|
||||||
|
Roadmap for the upcoming development.
|
||||||
|
|
||||||
|
#### Version 1.1.x
|
||||||
|
|
||||||
|
1. ~~Add translations for `de_CH`, `de_DE_informal`, `fr_CH`, `it_CH`~~ ✅ **COMPLETED in v1.1.21**
|
||||||
|
|
||||||
|
#### Version 1.2.x
|
||||||
|
|
||||||
|
1. New Feature: Create different, selectable templates for tierprices and packages to use in the frontend. Make the new templates selectable globally on the settings-page, not per product.
|
||||||
|
|
||||||
|
### When Debugging Cart Issues
|
||||||
|
|
||||||
|
1. Check `includes/class-wc-tpp-cart.php` first
|
||||||
|
2. The `apply_tier_package_pricing()` method runs on `woocommerce_before_calculate_totals`
|
||||||
|
3. Always validate product objects with `is_a($product, 'WC_Product')`
|
||||||
|
4. Remember: WooCommerce expects UNIT prices, not total prices (except for internal calculations)
|
||||||
|
|
||||||
|
### When Working with WooCommerce Hooks
|
||||||
|
|
||||||
|
- WooCommerce has both classic and block-based systems
|
||||||
|
- Classic cart uses different hooks than Store API (blocks)
|
||||||
|
- Always check filter/action documentation for parameter types
|
||||||
|
- Don't assume cart item arrays everywhere - sometimes it's product objects!
|
||||||
|
|
||||||
|
### When Adding Features
|
||||||
|
|
||||||
|
- Follow the existing pattern: add setting → add UI → add logic → add template
|
||||||
|
- Use Twig for all new templates (consistency)
|
||||||
|
- Add translations for all user-facing strings
|
||||||
|
- Test with both simple products and variable products (if applicable)
|
||||||
|
- Consider both classic and block-based cart/checkout
|
||||||
|
|
||||||
|
### When Fixing Bugs
|
||||||
|
|
||||||
|
1. Check `CHANGELOG.md` for historical context
|
||||||
|
2. Look for similar issues in past versions
|
||||||
|
3. Always add detailed changelog entry explaining root cause
|
||||||
|
4. Consider edge cases (guest checkout, logged-in users, AJAX add-to-cart, etc.)
|
||||||
|
|
||||||
|
## File Locations Quick Reference
|
||||||
|
|
||||||
|
| Task | File(s) |
|
||||||
|
|------|---------|
|
||||||
|
| Change version | `wc-tier-and-package-prices.php` (2 places) |
|
||||||
|
| Add global setting | `includes/class-wc-tpp-settings.php` |
|
||||||
|
| Modify product meta box | `includes/class-wc-tpp-product-meta.php` + `templates/admin/*.twig` |
|
||||||
|
| Change product page display | `includes/class-wc-tpp-frontend.php` + `templates/frontend/*.twig` |
|
||||||
|
| Fix cart pricing | `includes/class-wc-tpp-cart.php` |
|
||||||
|
| Update styles | `assets/css/frontend.css` or `assets/css/admin.css` |
|
||||||
|
| Fix JavaScript bugs | `assets/js/frontend.js` or `assets/js/admin.js` |
|
||||||
|
| Add translations | `languages/*.po` then compile to `.mo` |
|
||||||
|
| Document changes | `CHANGELOG.md` |
|
||||||
|
|
||||||
|
## Compatibility Notes
|
||||||
|
|
||||||
|
### WordPress
|
||||||
|
|
||||||
|
- Minimum: 6.0
|
||||||
|
- Tested up to: 6.9.x
|
||||||
|
- Uses standard plugin API, no deprecated functions
|
||||||
|
|
||||||
|
### WooCommerce
|
||||||
|
|
||||||
|
- Minimum: 8.0
|
||||||
|
- Tested up to: 10.x
|
||||||
|
- HPOS compatible (declared via `FeaturesUtil::declare_compatibility`)
|
||||||
|
- Blocks compatible (with proper filter handling)
|
||||||
|
|
||||||
|
### PHP
|
||||||
|
|
||||||
|
- Minimum: 7.4
|
||||||
|
- Uses modern PHP features (type hints acceptable in new code)
|
||||||
|
- Composer autoloader handles namespacing
|
||||||
|
|
||||||
|
### Browsers
|
||||||
|
|
||||||
|
- Modern browsers (ES6+ JavaScript)
|
||||||
|
- Responsive CSS (mobile-friendly)
|
||||||
|
- jQuery dependency (WooCommerce provides)
|
||||||
|
|
||||||
|
## Support & Resources
|
||||||
|
|
||||||
|
- **Repository:** https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
|
||||||
|
- **Documentation:** See `README.md`, `QUICKSTART.md`, `USAGE_EXAMPLES.md`, `INSTALLATION.md`
|
||||||
|
- **Changelog:** `CHANGELOG.md` (detailed version history)
|
||||||
|
- **Issue Tracking:** Check fatal-errors-*.log files for production errors
|
||||||
|
|
||||||
|
## Final Notes
|
||||||
|
|
||||||
|
This is a production-quality plugin with real-world usage. Any changes should:
|
||||||
|
|
||||||
|
1. Maintain backward compatibility with existing tier/package configurations
|
||||||
|
2. Not break WooCommerce core functionality
|
||||||
|
3. Work with both classic and block-based themes
|
||||||
|
4. Be thoroughly tested before release
|
||||||
|
5. Include proper error handling and validation
|
||||||
|
6. Update CHANGELOG.md with detailed explanations
|
||||||
|
|
||||||
|
The plugin architecture is solid and well-tested. Most bugs arise from:
|
||||||
|
|
||||||
|
- WooCommerce API changes (especially blocks)
|
||||||
|
- Filter/action signature changes
|
||||||
|
- Edge cases in cart calculations
|
||||||
|
- Settings persistence issues
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Always refer to this document when starting work on this project. Good luck!
|
||||||
@@ -90,8 +90,8 @@ After activation, you should see:
|
|||||||
|
|
||||||
Before installation, verify:
|
Before installation, verify:
|
||||||
|
|
||||||
- ✓ WordPress 5.8 or higher
|
- ✓ WordPress 6.0 or higher (tested up to 6.9.x)
|
||||||
- ✓ WooCommerce 5.0 or higher installed and activated
|
- ✓ WooCommerce 8.0 or higher (tested up to 10.x) installed and activated
|
||||||
- ✓ PHP 7.4 or higher
|
- ✓ PHP 7.4 or higher
|
||||||
- ✓ Write permissions in `/wp-content/plugins/` directory
|
- ✓ Write permissions in `/wp-content/plugins/` directory
|
||||||
|
|
||||||
@@ -153,16 +153,34 @@ wp-content/
|
|||||||
├── USAGE_EXAMPLES.md
|
├── USAGE_EXAMPLES.md
|
||||||
├── includes/
|
├── includes/
|
||||||
│ ├── class-wc-tpp-admin.php
|
│ ├── class-wc-tpp-admin.php
|
||||||
|
│ ├── class-wc-tpp-settings.php
|
||||||
│ ├── class-wc-tpp-cart.php
|
│ ├── class-wc-tpp-cart.php
|
||||||
│ ├── class-wc-tpp-frontend.php
|
│ ├── class-wc-tpp-frontend.php
|
||||||
│ └── class-wc-tpp-product-meta.php
|
│ ├── class-wc-tpp-product-meta.php
|
||||||
└── assets/
|
│ └── class-wc-tpp-template-loader.php
|
||||||
├── css/
|
├── templates/
|
||||||
│ ├── admin.css
|
│ ├── admin/
|
||||||
│ └── frontend.css
|
│ │ ├── tier-row.twig
|
||||||
└── js/
|
│ │ └── package-row.twig
|
||||||
├── admin.js
|
│ └── frontend/
|
||||||
└── frontend.js
|
│ ├── pricing-table.twig
|
||||||
|
│ ├── tier-pricing-table.twig
|
||||||
|
│ └── package-pricing-display.twig
|
||||||
|
├── assets/
|
||||||
|
│ ├── css/
|
||||||
|
│ │ ├── admin.css
|
||||||
|
│ │ └── frontend.css
|
||||||
|
│ └── js/
|
||||||
|
│ ├── admin.js
|
||||||
|
│ └── frontend.js
|
||||||
|
├── languages/
|
||||||
|
│ ├── wc-tier-package-prices.pot
|
||||||
|
│ ├── wc-tier-package-prices-de_DE.po
|
||||||
|
│ ├── wc-tier-package-prices-de_DE.mo
|
||||||
|
│ ├── wc-tier-package-prices-de_CH_informal.po
|
||||||
|
│ └── wc-tier-package-prices-de_CH_informal.mo
|
||||||
|
└── vendor/
|
||||||
|
└── (Twig and dependencies)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Getting Help
|
## Getting Help
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Quick Start Guide
|
# Quick Start Guide
|
||||||
|
|
||||||
Get started with WooCommerce Tier and Package Prices in 5 minutes!
|
Get started with WooCommerce Tier and Package Prices (v1.1.20) in 5 minutes!
|
||||||
|
|
||||||
## Step 1: Install (2 minutes)
|
## Step 1: Install (2 minutes)
|
||||||
|
|
||||||
@@ -79,8 +79,11 @@ Use packages for common bundles (6-pack, dozen, case)
|
|||||||
1. **Round Numbers**: Use 10, 25, 50, 100 for tiers
|
1. **Round Numbers**: Use 10, 25, 50, 100 for tiers
|
||||||
2. **Meaningful Savings**: Offer at least 10% off per tier
|
2. **Meaningful Savings**: Offer at least 10% off per tier
|
||||||
3. **Label Packages**: "Family Pack" sells better than "4-pack"
|
3. **Label Packages**: "Family Pack" sells better than "4-pack"
|
||||||
4. **Test Checkout**: Always complete a test order
|
4. **Label Tiers**: Use descriptive labels like "Wholesale Price" or "Bulk Discount"
|
||||||
5. **Mobile Check**: View on phone to verify responsiveness
|
5. **Test Checkout**: Always complete a test order
|
||||||
|
6. **Mobile Check**: View on phone to verify responsiveness
|
||||||
|
7. **Quantity Restrictions**: Enable package restrictions to prevent arbitrary quantities
|
||||||
|
8. **Blocks Compatible**: Works with both classic and block-based carts/checkout
|
||||||
|
|
||||||
## Need More Help?
|
## Need More Help?
|
||||||
|
|
||||||
|
|||||||
93
README.md
93
README.md
@@ -1,5 +1,7 @@
|
|||||||
# WooCommerce Tier and Package Prices
|
# WooCommerce Tier and Package Prices
|
||||||
|
|
||||||
|
__THIS PROJECT IS 100% VIBE-CODED USING CLAUDE.AI__
|
||||||
|
|
||||||
A powerful WooCommerce plugin that adds tier pricing and package pricing functionality to your products with configurable quantities at fixed prices.
|
A powerful WooCommerce plugin that adds tier pricing and package pricing functionality to your products with configurable quantities at fixed prices.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
@@ -108,12 +110,22 @@ When editing a product, scroll to the **Product data** panel:
|
|||||||
|
|
||||||
```
|
```
|
||||||
wc-tier-and-package-prices/
|
wc-tier-and-package-prices/
|
||||||
├── wc-tier-and-package-prices.php # Main plugin file
|
├── wc-tier-and-package-prices.php # Main plugin file (v1.1.20)
|
||||||
├── includes/
|
├── includes/
|
||||||
│ ├── class-wc-tpp-admin.php # Admin settings
|
│ ├── class-wc-tpp-admin.php # Admin settings integration
|
||||||
|
│ ├── class-wc-tpp-settings.php # WooCommerce settings page
|
||||||
│ ├── class-wc-tpp-product-meta.php # Product meta boxes
|
│ ├── class-wc-tpp-product-meta.php # Product meta boxes
|
||||||
│ ├── class-wc-tpp-frontend.php # Frontend display
|
│ ├── class-wc-tpp-frontend.php # Frontend display logic
|
||||||
│ └── class-wc-tpp-cart.php # Cart price calculations
|
│ ├── class-wc-tpp-cart.php # Cart price calculations
|
||||||
|
│ └── class-wc-tpp-template-loader.php # Twig template engine
|
||||||
|
├── templates/
|
||||||
|
│ ├── admin/
|
||||||
|
│ │ ├── tier-row.twig # Tier pricing input row
|
||||||
|
│ │ └── package-row.twig # Package pricing input row
|
||||||
|
│ └── frontend/
|
||||||
|
│ ├── pricing-table.twig # Main pricing display wrapper
|
||||||
|
│ ├── tier-pricing-table.twig # Tier pricing table
|
||||||
|
│ └── package-pricing-display.twig # Package selection UI
|
||||||
├── assets/
|
├── assets/
|
||||||
│ ├── css/
|
│ ├── css/
|
||||||
│ │ ├── admin.css # Admin styles
|
│ │ ├── admin.css # Admin styles
|
||||||
@@ -121,7 +133,16 @@ wc-tier-and-package-prices/
|
|||||||
│ └── js/
|
│ └── js/
|
||||||
│ ├── admin.js # Admin JavaScript
|
│ ├── admin.js # Admin JavaScript
|
||||||
│ └── frontend.js # Frontend JavaScript
|
│ └── frontend.js # Frontend JavaScript
|
||||||
└── README.md
|
├── languages/
|
||||||
|
│ ├── wc-tier-package-prices.pot # Translation template
|
||||||
|
│ ├── wc-tier-package-prices-*.po # Translation sources
|
||||||
|
│ └── wc-tier-package-prices-*.mo # Compiled translations
|
||||||
|
├── vendor/ # Composer dependencies (Twig)
|
||||||
|
├── CHANGELOG.md # Complete version history
|
||||||
|
├── INSTALLATION.md # Installation guide
|
||||||
|
├── QUICKSTART.md # Quick start guide
|
||||||
|
├── USAGE_EXAMPLES.md # Usage examples
|
||||||
|
└── README.md # This file
|
||||||
```
|
```
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
@@ -162,39 +183,51 @@ This plugin is licensed under the GPL v2 or later.
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
### Version 1.0.0 - 2025-12-21
|
### Version 1.1.20 - 2025-12-23
|
||||||
|
|
||||||
#### Compatibility Updates
|
**Current Release** - Latest stable version with full WooCommerce Blocks support
|
||||||
|
|
||||||
- ✅ Updated for WooCommerce 10.x compatibility
|
#### Fixed
|
||||||
- ✅ Updated for WordPress 6.9.x compatibility
|
- **CRITICAL:** WooCommerce Blocks fatal error in mini-cart and cart blocks
|
||||||
- ✅ Added HPOS (High-Performance Order Storage) support
|
- Fixed `woocommerce_store_api_product_quantity_editable` filter signature mismatch
|
||||||
- ✅ Declared compatibility with WooCommerce Custom Order Tables
|
- Filter now correctly accepts `WC_Product` object instead of cart item array
|
||||||
|
- Resolves "Cannot use object of type WC_Product_Simple as array" fatal error
|
||||||
|
|
||||||
#### Security Enhancements
|
#### Technical Details
|
||||||
|
- Updated `block_quantity_editable()` method signature to accept product object
|
||||||
|
- Changed parameter from `$cart_item` array to `WC_Product $product`
|
||||||
|
- Uses `$product->get_id()` instead of array access for product ID
|
||||||
|
- Full compatibility with WooCommerce Store API and block-based cart/checkout
|
||||||
|
|
||||||
- ✅ Added nonce verification for product meta save operations
|
### Recent Major Updates
|
||||||
- ✅ Added capability checks for user permissions
|
|
||||||
- ✅ Enhanced data escaping and sanitization
|
|
||||||
- ✅ Implemented autosave prevention
|
|
||||||
|
|
||||||
#### Code Improvements
|
#### Version 1.1.7 - Enhanced Tier Pricing
|
||||||
|
- Added optional text labels for tier pricing
|
||||||
|
- Clickable tier rows that auto-populate quantity field
|
||||||
|
- Add to Cart button auto-disable when quantity is invalid
|
||||||
|
|
||||||
- ✅ Enhanced cart object validation
|
#### Version 1.1.4 - WooCommerce Blocks Support
|
||||||
- ✅ Improved product object type checking
|
- Full support for WooCommerce block-based cart and checkout
|
||||||
- ✅ Better error handling for edge cases
|
- Quantity restrictions work with both classic and block carts
|
||||||
- ✅ Updated data storage methods for cart items
|
- Enhanced "View Options" button styling
|
||||||
- ✅ Modernized JavaScript localization with proper escaping
|
|
||||||
|
|
||||||
#### Initial Features
|
#### Version 1.1.0 - Package Quantity Restrictions
|
||||||
|
- Global and per-product package quantity restrictions
|
||||||
|
- Prevents customers from ordering non-package quantities
|
||||||
|
- Automatic quantity field hiding when restrictions enabled
|
||||||
|
|
||||||
- Initial release with tier pricing functionality
|
#### Version 1.0.1 - Twig Template Engine
|
||||||
- Package pricing with fixed quantities
|
- Migrated to Twig templating system
|
||||||
- Customizable pricing tables
|
- Enhanced security with automatic HTML escaping
|
||||||
- Global settings page
|
- Added German (Switzerland, Informal) translation
|
||||||
- Product-level configuration
|
|
||||||
- Cart integration with dynamic pricing
|
#### Version 1.0.0 - Initial Release
|
||||||
- Responsive frontend design
|
- Tier pricing functionality (quantity-based discounts)
|
||||||
|
- Package pricing functionality (fixed-price bundles)
|
||||||
|
- WooCommerce HPOS compatibility
|
||||||
|
- Multilingual support (English, German)
|
||||||
|
|
||||||
|
For complete version history, see [CHANGELOG.md](CHANGELOG.md)
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
# Usage Examples
|
# Usage Examples
|
||||||
|
|
||||||
|
**Plugin Version:** 1.1.20
|
||||||
|
**Last Updated:** 2025-12-23
|
||||||
|
|
||||||
## Example 1: T-Shirt Store with Volume Discounts
|
## Example 1: T-Shirt Store with Volume Discounts
|
||||||
|
|
||||||
### Tier Pricing Setup
|
### Tier Pricing Setup
|
||||||
@@ -16,9 +19,9 @@ For a t-shirt that normally costs $20:
|
|||||||
**How to configure:**
|
**How to configure:**
|
||||||
1. Edit your t-shirt product
|
1. Edit your t-shirt product
|
||||||
2. Set regular price to $20.00
|
2. Set regular price to $20.00
|
||||||
3. Add tier: Min Qty = 10, Price = $18.00
|
3. Add tier: Min Qty = 10, Price = $18.00, Label = "Bulk Discount"
|
||||||
4. Add tier: Min Qty = 25, Price = $16.00
|
4. Add tier: Min Qty = 25, Price = $16.00, Label = "Volume Pricing"
|
||||||
5. Add tier: Min Qty = 50, Price = $14.00
|
5. Add tier: Min Qty = 50, Price = $14.00, Label = "Wholesale Rate"
|
||||||
6. Save product
|
6. Save product
|
||||||
|
|
||||||
**Customer experience:**
|
**Customer experience:**
|
||||||
@@ -97,6 +100,62 @@ Regular mug price: $10.00
|
|||||||
- Package 2: Qty = 4, Price = $32.00, Label = "Family Set"
|
- Package 2: Qty = 4, Price = $32.00, Label = "Family Set"
|
||||||
- Package 3: Qty = 10, Price = $70.00, Label = "Office Bundle"
|
- Package 3: Qty = 10, Price = $70.00, Label = "Office Bundle"
|
||||||
|
|
||||||
|
## Example 5: Quantity Restrictions (New in v1.1.0)
|
||||||
|
|
||||||
|
### Party Supplies with Fixed Packages
|
||||||
|
|
||||||
|
For products that should ONLY be sold in specific package quantities:
|
||||||
|
|
||||||
|
**Product:** Balloons - Regular price $1.00 each
|
||||||
|
|
||||||
|
**Package Configuration:**
|
||||||
|
- Package 1: Qty = 12, Price = $10.00, Label = "Dozen Pack"
|
||||||
|
- Package 2: Qty = 24, Price = $18.00, Label = "Party Pack"
|
||||||
|
- Package 3: Qty = 50, Price = $40.00, Label = "Event Pack"
|
||||||
|
|
||||||
|
**How to configure:**
|
||||||
|
1. Edit balloon product
|
||||||
|
2. Set regular price to $1.00
|
||||||
|
3. Add packages as shown above
|
||||||
|
4. **Check "Restrict to package quantities only"** (per-product setting)
|
||||||
|
5. Save product
|
||||||
|
|
||||||
|
**Customer experience:**
|
||||||
|
- Quantity input field is hidden on product page
|
||||||
|
- Customer MUST select a package using the package selection buttons
|
||||||
|
- Attempting to add custom quantities via URL or API will fail with validation error
|
||||||
|
- Cart displays selected package quantity (cannot be edited)
|
||||||
|
- "View Options" button appears on shop/category pages instead of "Add to Cart"
|
||||||
|
|
||||||
|
**When to use quantity restrictions:**
|
||||||
|
- Pre-packaged items (dozen eggs, 6-pack drinks, etc.)
|
||||||
|
- Products with fixed manufacturing quantities
|
||||||
|
- Promotional bundles where you don't want individual sales
|
||||||
|
- Subscription boxes with specific item counts
|
||||||
|
|
||||||
|
## Example 6: Tier Labels for Enhanced UX (New in v1.1.7)
|
||||||
|
|
||||||
|
### Office Supplies with Clickable Tiers
|
||||||
|
|
||||||
|
**Product:** Premium Notebooks - Regular price $8.00 each
|
||||||
|
|
||||||
|
**Tier Configuration with Labels:**
|
||||||
|
- Tier 1: Min Qty = 5, Price = $7.50, Label = "Small Business Discount"
|
||||||
|
- Tier 2: Min Qty = 10, Price = $7.00, Label = "Wholesale Pricing"
|
||||||
|
- Tier 3: Min Qty = 25, Price = $6.50, Label = "Corporate Rate"
|
||||||
|
|
||||||
|
**Customer experience:**
|
||||||
|
- Tier labels appear below quantity in pricing table (italicized)
|
||||||
|
- Clicking a tier row auto-fills the quantity field with that tier's minimum quantity
|
||||||
|
- Smooth scroll animation highlights the quantity field
|
||||||
|
- Add to Cart button automatically disables when quantity is 0 or invalid
|
||||||
|
|
||||||
|
**Benefits of tier labels:**
|
||||||
|
- Helps customers understand pricing context
|
||||||
|
- Makes tiers more appealing with descriptive names
|
||||||
|
- Improves conversion by highlighting value propositions
|
||||||
|
- Clickable rows improve user experience
|
||||||
|
|
||||||
## Tips for Best Results
|
## Tips for Best Results
|
||||||
|
|
||||||
### Tier Pricing Best Practices
|
### Tier Pricing Best Practices
|
||||||
@@ -113,6 +172,11 @@ Regular mug price: $10.00
|
|||||||
- Minimum 5-10% per tier level
|
- Minimum 5-10% per tier level
|
||||||
- Higher tiers should have progressively better deals
|
- Higher tiers should have progressively better deals
|
||||||
|
|
||||||
|
4. **Use Labels** (v1.1.7+): Add descriptive labels to tiers
|
||||||
|
- "Wholesale Price" instead of just showing the number
|
||||||
|
- "Bulk Discount", "Volume Pricing", "Corporate Rate"
|
||||||
|
- Makes pricing more professional and appealing
|
||||||
|
|
||||||
### Package Pricing Best Practices
|
### Package Pricing Best Practices
|
||||||
|
|
||||||
1. **Strategic Quantities**: Match common use cases
|
1. **Strategic Quantities**: Match common use cases
|
||||||
@@ -169,3 +233,32 @@ Regular mug price: $10.00
|
|||||||
- Package 2: Medium party (25 pieces) = $110
|
- Package 2: Medium party (25 pieces) = $110
|
||||||
- Package 3: Large party (50 pieces) = $200
|
- Package 3: Large party (50 pieces) = $200
|
||||||
- Package 4: Event package (100 pieces) = $350
|
- Package 4: Event package (100 pieces) = $350
|
||||||
|
|
||||||
|
## WooCommerce Blocks Compatibility (v1.1.4+, Fixed in v1.1.20)
|
||||||
|
|
||||||
|
This plugin is **fully compatible** with WooCommerce block-based cart and checkout:
|
||||||
|
|
||||||
|
### Supported Block Types
|
||||||
|
- Cart Block (`woocommerce/cart`)
|
||||||
|
- Mini Cart Block (`woocommerce/mini-cart`)
|
||||||
|
- Checkout Block (`woocommerce/checkout`)
|
||||||
|
- All Store API endpoints
|
||||||
|
|
||||||
|
### Block-Specific Features
|
||||||
|
- Quantity restrictions work in block-based carts
|
||||||
|
- Package-restricted products hide quantity selectors in blocks
|
||||||
|
- Tier and package pricing applies correctly in block checkout
|
||||||
|
- Mini cart displays correct prices and restrictions
|
||||||
|
|
||||||
|
### Technical Notes
|
||||||
|
- v1.1.20 fixed critical fatal error in WooCommerce Blocks
|
||||||
|
- Uses `woocommerce_store_api_product_quantity_editable` filter
|
||||||
|
- Works with both classic and block-based themes
|
||||||
|
- No configuration needed - blocks work automatically
|
||||||
|
|
||||||
|
### Testing Your Block Setup
|
||||||
|
1. Add block-based cart to a page (`/cart`)
|
||||||
|
2. Add mini-cart block to your header
|
||||||
|
3. Add block-based checkout to a page (`/checkout`)
|
||||||
|
4. Test tier pricing, package pricing, and quantity restrictions
|
||||||
|
5. Verify prices calculate correctly at checkout
|
||||||
|
|||||||
@@ -50,11 +50,13 @@
|
|||||||
|
|
||||||
.wc-tpp-table tbody tr {
|
.wc-tpp-table tbody tr {
|
||||||
border-bottom: 1px solid #e0e0e0;
|
border-bottom: 1px solid #e0e0e0;
|
||||||
transition: background-color 0.2s;
|
transition: all 0.2s;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wc-tpp-table tbody tr:hover {
|
.wc-tpp-table tbody tr:hover {
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
|
transform: translateX(2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.wc-tpp-table tbody tr.wc-tpp-active-tier {
|
.wc-tpp-table tbody tr.wc-tpp-active-tier {
|
||||||
@@ -67,6 +69,14 @@
|
|||||||
font-size: 0.95em;
|
font-size: 0.95em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wc-tpp-tier-label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 4px;
|
||||||
|
color: #666;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
/* Package pricing */
|
/* Package pricing */
|
||||||
.wc-tpp-packages {
|
.wc-tpp-packages {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -156,6 +166,67 @@
|
|||||||
font-style: italic;
|
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 */
|
/* Responsive design */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.wc-tpp-packages {
|
.wc-tpp-packages {
|
||||||
|
|||||||
@@ -8,8 +8,10 @@
|
|||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
const $quantityInput = $('input.qty');
|
const $quantityInput = $('input.qty');
|
||||||
const $priceDisplay = $('.woocommerce-Price-amount.amount').first();
|
const $priceDisplay = $('.woocommerce-Price-amount.amount').first();
|
||||||
|
const $addToCartButton = $('.single_add_to_cart_button');
|
||||||
|
const isRestrictedMode = $('.wc-tpp-package-pricing-table').hasClass('wc-tpp-restricted-mode');
|
||||||
|
|
||||||
if ($quantityInput.length === 0) {
|
if ($quantityInput.length === 0 && !isRestrictedMode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,9 +155,35 @@
|
|||||||
$('.wc-tpp-price-message').remove();
|
$('.wc-tpp-price-message').remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Toggle add to cart button state based on quantity
|
||||||
|
function updateAddToCartButton() {
|
||||||
|
const quantity = parseInt($quantityInput.val()) || 0;
|
||||||
|
|
||||||
|
if (quantity <= 0) {
|
||||||
|
$addToCartButton.prop('disabled', true).addClass('disabled');
|
||||||
|
} else {
|
||||||
|
$addToCartButton.prop('disabled', false).removeClass('disabled');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle quantity input changes
|
// Handle quantity input changes
|
||||||
$quantityInput.on('input change', function() {
|
$quantityInput.on('input change', function() {
|
||||||
updatePriceDisplay();
|
updatePriceDisplay();
|
||||||
|
updateAddToCartButton();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle tier pricing row clicks
|
||||||
|
$('.wc-tpp-tier-pricing-table tbody tr').on('click', function() {
|
||||||
|
const minQty = parseInt($(this).data('min-qty'));
|
||||||
|
|
||||||
|
if ($quantityInput.length > 0 && !isRestrictedMode) {
|
||||||
|
$quantityInput.val(minQty).trigger('change');
|
||||||
|
|
||||||
|
// Scroll to quantity input for better UX
|
||||||
|
$('html, body').animate({
|
||||||
|
scrollTop: $quantityInput.offset().top - 100
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Handle package selection
|
// Handle package selection
|
||||||
@@ -164,7 +192,30 @@
|
|||||||
const $package = $(this).closest('.wc-tpp-package');
|
const $package = $(this).closest('.wc-tpp-package');
|
||||||
const qty = parseInt($package.data('qty'));
|
const qty = parseInt($package.data('qty'));
|
||||||
|
|
||||||
|
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');
|
$quantityInput.val(qty).trigger('change');
|
||||||
|
}
|
||||||
|
|
||||||
// Scroll to add to cart button
|
// Scroll to add to cart button
|
||||||
$('html, body').animate({
|
$('html, body').animate({
|
||||||
@@ -172,8 +223,27 @@
|
|||||||
}, 500);
|
}, 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
|
// Initial update
|
||||||
|
if (!isRestrictedMode) {
|
||||||
updatePriceDisplay();
|
updatePriceDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial button state check
|
||||||
|
if ($quantityInput.length > 0 && $addToCartButton.length > 0) {
|
||||||
|
updateAddToCartButton();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "magdev/wc-tier-package-prices",
|
"name": "magdev/wc-tier-package-prices",
|
||||||
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
||||||
"version": "1.0.1",
|
"version": "1.1.21",
|
||||||
"type": "wordpress-plugin",
|
"type": "wordpress-plugin",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
"authors": [
|
"authors": [
|
||||||
|
|||||||
@@ -7,42 +7,64 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Admin {
|
if (!class_exists('WC_TPP_Admin')) {
|
||||||
|
class WC_TPP_Admin {
|
||||||
|
|
||||||
public function __construct() {
|
private static $instance = null;
|
||||||
add_action('admin_menu', array($this, 'add_admin_menu'));
|
private static $settings_instance = null;
|
||||||
add_action('admin_init', array($this, 'register_settings'));
|
|
||||||
|
public static function get_instance() {
|
||||||
|
if (null === self::$instance) {
|
||||||
|
self::$instance = new self();
|
||||||
|
}
|
||||||
|
return self::$instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function __construct() {
|
||||||
|
add_filter('woocommerce_get_settings_pages', array($this, 'add_settings_page'));
|
||||||
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function add_admin_menu() {
|
/**
|
||||||
add_submenu_page(
|
* Add settings page to WooCommerce settings
|
||||||
'woocommerce',
|
*/
|
||||||
__('Tier & Package Prices', 'wc-tier-package-prices'),
|
public function add_settings_page($settings) {
|
||||||
__('Tier & Package Prices', 'wc-tier-package-prices'),
|
if (null === self::$settings_instance) {
|
||||||
'manage_woocommerce',
|
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php';
|
||||||
'wc-tier-package-prices',
|
self::$settings_instance = new WC_TPP_Settings();
|
||||||
array($this, 'settings_page')
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function register_settings() {
|
// Check if our settings page is already in the array to prevent duplicates
|
||||||
register_setting('wc_tpp_settings', 'wc_tpp_enable_tier_pricing');
|
// Check by class type and ID instead of instance comparison
|
||||||
register_setting('wc_tpp_settings', 'wc_tpp_enable_package_pricing');
|
foreach ($settings as $settings_page) {
|
||||||
register_setting('wc_tpp_settings', 'wc_tpp_display_table');
|
if ($settings_page instanceof WC_TPP_Settings) {
|
||||||
register_setting('wc_tpp_settings', 'wc_tpp_display_position');
|
return $settings;
|
||||||
|
}
|
||||||
|
// Also check by ID property if it's a WC_Settings_Page
|
||||||
|
if (is_object($settings_page) &&
|
||||||
|
method_exists($settings_page, 'get_id') &&
|
||||||
|
$settings_page->get_id() === 'tier_package_prices') {
|
||||||
|
return $settings;
|
||||||
|
}
|
||||||
|
// Check id property directly
|
||||||
|
if (is_object($settings_page) &&
|
||||||
|
isset($settings_page->id) &&
|
||||||
|
$settings_page->id === 'tier_package_prices') {
|
||||||
|
return $settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$settings[] = self::$settings_instance;
|
||||||
|
return $settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enqueue_admin_scripts($hook) {
|
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_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);
|
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();
|
WC_TPP_Admin::get_instance();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,12 +7,20 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Cart {
|
if (!class_exists('WC_TPP_Cart')) {
|
||||||
|
class WC_TPP_Cart {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('woocommerce_before_calculate_totals', array($this, 'apply_tier_package_pricing'), 10, 1);
|
add_action('woocommerce_before_calculate_totals', array($this, 'apply_tier_package_pricing'), 10, 1);
|
||||||
add_filter('woocommerce_cart_item_price', array($this, 'display_cart_item_price'), 10, 3);
|
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_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) {
|
public function apply_tier_package_pricing($cart) {
|
||||||
@@ -89,6 +97,162 @@ class WC_TPP_Cart {
|
|||||||
}
|
}
|
||||||
return $subtotal;
|
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 WC_Product $product Product object
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function block_quantity_editable($editable, $product) {
|
||||||
|
// Validate product object
|
||||||
|
if (!$product || !is_a($product, 'WC_Product')) {
|
||||||
|
return $editable;
|
||||||
|
}
|
||||||
|
|
||||||
|
$product_id = $product->get_id();
|
||||||
|
|
||||||
|
if (!$product_id) {
|
||||||
|
return $editable;
|
||||||
|
}
|
||||||
|
|
||||||
|
$global_restrict = get_option('wc_tpp_restrict_package_quantities', 'no') === 'yes';
|
||||||
|
$product_restrict = get_post_meta($product_id, '_wc_tpp_restrict_to_packages', true) === 'yes';
|
||||||
|
$packages = get_post_meta($product_id, '_wc_tpp_packages', true);
|
||||||
|
|
||||||
|
// If restriction is enabled and packages exist, make quantity non-editable
|
||||||
|
if (($global_restrict || $product_restrict) && !empty($packages)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $editable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new WC_TPP_Cart();
|
new WC_TPP_Cart();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,18 +7,28 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Frontend {
|
if (!class_exists('WC_TPP_Frontend')) {
|
||||||
|
class WC_TPP_Frontend {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
|
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
|
||||||
add_action('woocommerce_before_add_to_cart_button', array($this, 'display_pricing_table_before'), 20);
|
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_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_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() {
|
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);
|
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);
|
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
|
// 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() {
|
public function display_pricing_table() {
|
||||||
global $product;
|
global $product;
|
||||||
|
|
||||||
@@ -60,6 +88,8 @@ class WC_TPP_Frontend {
|
|||||||
$product_id = $product->get_id();
|
$product_id = $product->get_id();
|
||||||
$tiers = get_post_meta($product_id, '_wc_tpp_tiers', true);
|
$tiers = get_post_meta($product_id, '_wc_tpp_tiers', true);
|
||||||
$packages = get_post_meta($product_id, '_wc_tpp_packages', 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)) {
|
if (empty($tiers) && empty($packages)) {
|
||||||
return;
|
return;
|
||||||
@@ -68,7 +98,8 @@ class WC_TPP_Frontend {
|
|||||||
WC_TPP_Template_Loader::get_instance()->display('frontend/pricing-table.twig', array(
|
WC_TPP_Template_Loader::get_instance()->display('frontend/pricing-table.twig', array(
|
||||||
'product' => $product,
|
'product' => $product,
|
||||||
'tiers' => $tiers,
|
'tiers' => $tiers,
|
||||||
'packages' => $packages
|
'packages' => $packages,
|
||||||
|
'restrict_to_packages' => $global_restrict || $product_restrict
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,6 +135,54 @@ class WC_TPP_Frontend {
|
|||||||
|
|
||||||
return null;
|
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();
|
new WC_TPP_Frontend();
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ if (!defined('ABSPATH')) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WC_TPP_Product_Meta {
|
if (!class_exists('WC_TPP_Product_Meta')) {
|
||||||
|
class WC_TPP_Product_Meta {
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action('woocommerce_product_options_pricing', array($this, 'add_tier_pricing_fields'));
|
add_action('woocommerce_product_options_pricing', array($this, 'add_tier_pricing_fields'));
|
||||||
@@ -69,10 +70,19 @@ class WC_TPP_Product_Meta {
|
|||||||
<p class="form-field">
|
<p class="form-field">
|
||||||
<button type="button" class="button wc-tpp-add-package"><?php _e('Add Package', 'wc-tier-package-prices'); ?></button>
|
<button type="button" class="button wc-tpp-add-package"><?php _e('Add Package', 'wc-tier-package-prices'); ?></button>
|
||||||
</p>
|
</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>
|
</div>
|
||||||
|
|
||||||
<script type="text/html" id="wc-tpp-tier-row-template">
|
<script type="text/html" id="wc-tpp-tier-row-template">
|
||||||
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '')); ?>
|
<?php $this->render_tier_row('{{INDEX}}', array('min_qty' => '', 'price' => '', 'label' => '')); ?>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" id="wc-tpp-package-row-template">
|
<script type="text/html" id="wc-tpp-package-row-template">
|
||||||
@@ -118,7 +128,8 @@ class WC_TPP_Product_Meta {
|
|||||||
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
|
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
|
||||||
$tiers[] = array(
|
$tiers[] = array(
|
||||||
'min_qty' => absint($tier['min_qty']),
|
'min_qty' => absint($tier['min_qty']),
|
||||||
'price' => wc_format_decimal($tier['price'])
|
'price' => wc_format_decimal($tier['price']),
|
||||||
|
'label' => sanitize_text_field($tier['label'] ?? '')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,7 +162,12 @@ class WC_TPP_Product_Meta {
|
|||||||
} else {
|
} else {
|
||||||
delete_post_meta($post_id, '_wc_tpp_packages');
|
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();
|
new WC_TPP_Product_Meta();
|
||||||
|
}
|
||||||
|
|||||||
143
includes/class-wc-tpp-settings.php
Normal file
143
includes/class-wc-tpp-settings.php
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
<?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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
languages/wc-tier-package-prices-de_CH.mo
Normal file
BIN
languages/wc-tier-package-prices-de_CH.mo
Normal file
Binary file not shown.
245
languages/wc-tier-package-prices-de_CH.po
Normal file
245
languages/wc-tier-package-prices-de_CH.po
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
# German (Switzerland) translation for WooCommerce Tier and Package Prices
|
||||||
|
# Copyright (C) 2025 Marco Graetsch
|
||||||
|
# This file is distributed under the GPL v2 or later.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.21\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
|
"POT-Creation-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"PO-Revision-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"Last-Translator: Marco Graetsch\n"
|
||||||
|
"Language-Team: German (Switzerland)\n"
|
||||||
|
"Language: de_CH\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Generator: Poedit 3.0\n"
|
||||||
|
"X-Domain: wc-tier-package-prices\n"
|
||||||
|
|
||||||
|
#: wc-tier-and-package-prices.php:41
|
||||||
|
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||||
|
msgstr "WooCommerce Staffel- und Paketpreise benötigt eine installierte und aktive WooCommerce-Installation."
|
||||||
|
|
||||||
|
#: 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ö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ä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\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:86
|
||||||
|
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, 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"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:24
|
||||||
|
msgid "Set quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Mengenbasierte Preisstaffeln festlegen. Kunden erhalten Rabatte beim Kauf grösserer Mengen."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:41
|
||||||
|
msgid "Add Tier"
|
||||||
|
msgstr "Staffel hinzufügen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:52
|
||||||
|
msgid "Package Pricing"
|
||||||
|
msgstr "Paketpreise"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:53
|
||||||
|
msgid "Set fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||||
|
msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stück für CHF 50.-, 25 Stück für CHF 100.-."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:70
|
||||||
|
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"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:91
|
||||||
|
msgid "e.g., 10"
|
||||||
|
msgstr "z.B. 10"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:95
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:114
|
||||||
|
msgid "e.g., 9.99"
|
||||||
|
msgstr "z.B. 9.90"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:97
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:120
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Entfernen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:109
|
||||||
|
#: includes/class-wc-tpp-frontend.php:75
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr "Menge"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:113
|
||||||
|
msgid "Fixed Price"
|
||||||
|
msgstr "Festpreis"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:117
|
||||||
|
msgid "Label (Optional)"
|
||||||
|
msgstr "Bezeichnung (Optional)"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:118
|
||||||
|
msgid "e.g., Starter Pack"
|
||||||
|
msgstr "z.B. Starter-Paket"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:71
|
||||||
|
msgid "Volume Discounts"
|
||||||
|
msgstr "Mengenrabatte"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:94
|
||||||
|
#: includes/class-wc-tpp-frontend.php:76
|
||||||
|
msgid "Price per Unit"
|
||||||
|
msgstr "Preis pro Einheit"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:77
|
||||||
|
msgid "You Save"
|
||||||
|
msgstr "Sie sparen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:110
|
||||||
|
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össe"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
|
msgid "pieces"
|
||||||
|
msgstr "Stück"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:129
|
||||||
|
msgid "per unit"
|
||||||
|
msgstr "pro Einheit"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:133
|
||||||
|
msgid "Select Package"
|
||||||
|
msgstr "Paket auswählen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:63
|
||||||
|
msgid "Package price"
|
||||||
|
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ö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.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
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"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
@@ -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:21
|
||||||
#: includes/class-wc-tpp-admin.php:22
|
#: includes/class-wc-tpp-admin.php:22
|
||||||
|
#: includes/class-wc-tpp-settings.php:28
|
||||||
msgid "Tier & Package Prices"
|
msgid "Tier & Package Prices"
|
||||||
msgstr "Staffel- & Paketpreise"
|
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-admin.php:54
|
||||||
|
#: includes/class-wc-tpp-settings.php:65
|
||||||
msgid "Enable Tier Pricing"
|
msgid "Enable Tier Pricing"
|
||||||
msgstr "Staffelpreise aktivieren"
|
msgstr "Staffelpreise aktivieren"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:58
|
#: includes/class-wc-tpp-admin.php:58
|
||||||
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
msgid "Enable tier pricing for products"
|
msgid "Enable tier pricing for products"
|
||||||
msgstr "Staffelpreise für Produkte aktivieren"
|
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-admin.php:63
|
||||||
|
#: includes/class-wc-tpp-settings.php:74
|
||||||
msgid "Enable Package Pricing"
|
msgid "Enable Package Pricing"
|
||||||
msgstr "Paketpreise aktivieren"
|
msgstr "Paketpreise aktivieren"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:67
|
#: includes/class-wc-tpp-admin.php:67
|
||||||
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
msgid "Enable fixed-price packages for products"
|
msgid "Enable fixed-price packages for products"
|
||||||
msgstr "Festpreis-Pakete für Produkte aktivieren"
|
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-admin.php:72
|
||||||
|
#: includes/class-wc-tpp-settings.php:83
|
||||||
msgid "Display Pricing Table"
|
msgid "Display Pricing Table"
|
||||||
msgstr "Preistabelle anzeigen"
|
msgstr "Preistabelle anzeigen"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:76
|
#: includes/class-wc-tpp-admin.php:76
|
||||||
|
#: includes/class-wc-tpp-settings.php:84
|
||||||
msgid "Show tier and package pricing table on product pages"
|
msgid "Show tier and package pricing table on product pages"
|
||||||
msgstr "Staffel- und Paketpreis-Tabelle auf Produktseiten anzeigen"
|
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-admin.php:81
|
||||||
|
#: includes/class-wc-tpp-settings.php:92
|
||||||
msgid "Display Position"
|
msgid "Display Position"
|
||||||
msgstr "Anzeigeposition"
|
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
|
#: includes/class-wc-tpp-admin.php:85
|
||||||
msgid "Before Add to Cart"
|
msgid "Before Add to Cart"
|
||||||
msgstr "Vor \"In den Warenkorb\""
|
msgstr "Vor \"In den Warenkorb\""
|
||||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
|||||||
msgstr "Nach \"In den Warenkorb\""
|
msgstr "Nach \"In den Warenkorb\""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:87
|
#: includes/class-wc-tpp-admin.php:87
|
||||||
|
#: includes/class-wc-tpp-settings.php:103
|
||||||
msgid "After Price"
|
msgid "After Price"
|
||||||
msgstr "Nach dem Preis"
|
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
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
msgid "Tier Pricing"
|
msgid "Tier Pricing"
|
||||||
msgstr "Staffelpreise"
|
msgstr "Staffelpreise"
|
||||||
@@ -90,6 +148,10 @@ msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stüc
|
|||||||
msgid "Add Package"
|
msgid "Add Package"
|
||||||
msgstr "Paket hinzufügen"
|
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
|
#: includes/class-wc-tpp-product-meta.php:90
|
||||||
msgid "Minimum Quantity"
|
msgid "Minimum Quantity"
|
||||||
msgstr "Mindestmenge"
|
msgstr "Mindestmenge"
|
||||||
@@ -142,6 +204,10 @@ msgstr "Du sparst"
|
|||||||
msgid "Package Deals"
|
msgid "Package Deals"
|
||||||
msgstr "Paketangebote"
|
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
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
msgid "pieces"
|
msgid "pieces"
|
||||||
msgstr "Stück"
|
msgstr "Stück"
|
||||||
@@ -161,3 +227,19 @@ msgstr "Paketpreis"
|
|||||||
#: includes/class-wc-tpp-cart.php:66
|
#: includes/class-wc-tpp-cart.php:66
|
||||||
msgid "Volume discount"
|
msgid "Volume discount"
|
||||||
msgstr "Mengenrabatt"
|
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.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
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"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
@@ -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:21
|
||||||
#: includes/class-wc-tpp-admin.php:22
|
#: includes/class-wc-tpp-admin.php:22
|
||||||
|
#: includes/class-wc-tpp-settings.php:28
|
||||||
msgid "Tier & Package Prices"
|
msgid "Tier & Package Prices"
|
||||||
msgstr "Staffel- & Paketpreise"
|
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-admin.php:54
|
||||||
|
#: includes/class-wc-tpp-settings.php:65
|
||||||
msgid "Enable Tier Pricing"
|
msgid "Enable Tier Pricing"
|
||||||
msgstr "Staffelpreise aktivieren"
|
msgstr "Staffelpreise aktivieren"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:58
|
#: includes/class-wc-tpp-admin.php:58
|
||||||
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
msgid "Enable tier pricing for products"
|
msgid "Enable tier pricing for products"
|
||||||
msgstr "Staffelpreise für Produkte aktivieren"
|
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-admin.php:63
|
||||||
|
#: includes/class-wc-tpp-settings.php:74
|
||||||
msgid "Enable Package Pricing"
|
msgid "Enable Package Pricing"
|
||||||
msgstr "Paketpreise aktivieren"
|
msgstr "Paketpreise aktivieren"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:67
|
#: includes/class-wc-tpp-admin.php:67
|
||||||
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
msgid "Enable fixed-price packages for products"
|
msgid "Enable fixed-price packages for products"
|
||||||
msgstr "Festpreis-Pakete für Produkte aktivieren"
|
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-admin.php:72
|
||||||
|
#: includes/class-wc-tpp-settings.php:83
|
||||||
msgid "Display Pricing Table"
|
msgid "Display Pricing Table"
|
||||||
msgstr "Preistabelle anzeigen"
|
msgstr "Preistabelle anzeigen"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:76
|
#: includes/class-wc-tpp-admin.php:76
|
||||||
|
#: includes/class-wc-tpp-settings.php:84
|
||||||
msgid "Show tier and package pricing table on product pages"
|
msgid "Show tier and package pricing table on product pages"
|
||||||
msgstr "Staffel- und Paketpreis-Tabelle auf Produktseiten anzeigen"
|
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-admin.php:81
|
||||||
|
#: includes/class-wc-tpp-settings.php:92
|
||||||
msgid "Display Position"
|
msgid "Display Position"
|
||||||
msgstr "Anzeigeposition"
|
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
|
#: includes/class-wc-tpp-admin.php:85
|
||||||
msgid "Before Add to Cart"
|
msgid "Before Add to Cart"
|
||||||
msgstr "Vor \"In den Warenkorb\""
|
msgstr "Vor \"In den Warenkorb\""
|
||||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
|||||||
msgstr "Nach \"In den Warenkorb\""
|
msgstr "Nach \"In den Warenkorb\""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:87
|
#: includes/class-wc-tpp-admin.php:87
|
||||||
|
#: includes/class-wc-tpp-settings.php:103
|
||||||
msgid "After Price"
|
msgid "After Price"
|
||||||
msgstr "Nach dem Preis"
|
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
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
msgid "Tier Pricing"
|
msgid "Tier Pricing"
|
||||||
msgstr "Staffelpreise"
|
msgstr "Staffelpreise"
|
||||||
@@ -90,6 +148,10 @@ msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stüc
|
|||||||
msgid "Add Package"
|
msgid "Add Package"
|
||||||
msgstr "Paket hinzufügen"
|
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
|
#: includes/class-wc-tpp-product-meta.php:90
|
||||||
msgid "Minimum Quantity"
|
msgid "Minimum Quantity"
|
||||||
msgstr "Mindestmenge"
|
msgstr "Mindestmenge"
|
||||||
@@ -142,6 +204,10 @@ msgstr "Sie sparen"
|
|||||||
msgid "Package Deals"
|
msgid "Package Deals"
|
||||||
msgstr "Paketangebote"
|
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
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
msgid "pieces"
|
msgid "pieces"
|
||||||
msgstr "Stück"
|
msgstr "Stück"
|
||||||
@@ -161,3 +227,19 @@ msgstr "Paketpreis"
|
|||||||
#: includes/class-wc-tpp-cart.php:66
|
#: includes/class-wc-tpp-cart.php:66
|
||||||
msgid "Volume discount"
|
msgid "Volume discount"
|
||||||
msgstr "Mengenrabatt"
|
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"
|
||||||
|
|||||||
BIN
languages/wc-tier-package-prices-de_DE_informal.mo
Normal file
BIN
languages/wc-tier-package-prices-de_DE_informal.mo
Normal file
Binary file not shown.
245
languages/wc-tier-package-prices-de_DE_informal.po
Normal file
245
languages/wc-tier-package-prices-de_DE_informal.po
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
# German (Germany, Informal) translation for WooCommerce Tier and Package Prices
|
||||||
|
# Copyright (C) 2025 Marco Graetsch
|
||||||
|
# This file is distributed under the GPL v2 or later.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.21\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
|
"POT-Creation-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"PO-Revision-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"Last-Translator: Marco Graetsch\n"
|
||||||
|
"Language-Team: German (Germany)\n"
|
||||||
|
"Language: de_DE_informal\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Generator: Poedit 3.0\n"
|
||||||
|
"X-Domain: wc-tier-package-prices\n"
|
||||||
|
|
||||||
|
#: wc-tier-and-package-prices.php:41
|
||||||
|
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||||
|
msgstr "WooCommerce Staffel- und Paketpreise erfordert, dass WooCommerce installiert und aktiviert ist."
|
||||||
|
|
||||||
|
#: 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öß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ä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\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:86
|
||||||
|
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, 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"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:24
|
||||||
|
msgid "Set quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Mengenbasierte Preisstaffeln festlegen. Kunden erhalten Rabatte beim Kauf größerer Mengen."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:41
|
||||||
|
msgid "Add Tier"
|
||||||
|
msgstr "Staffel hinzufügen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:52
|
||||||
|
msgid "Package Pricing"
|
||||||
|
msgstr "Paketpreise"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:53
|
||||||
|
msgid "Set fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||||
|
msgstr "Festpreis-Pakete mit bestimmten Mengen festlegen. Zum Beispiel: 10 Stück für 50€, 25 Stück für 100€."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:70
|
||||||
|
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"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:91
|
||||||
|
msgid "e.g., 10"
|
||||||
|
msgstr "z.B. 10"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:95
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:114
|
||||||
|
msgid "e.g., 9.99"
|
||||||
|
msgstr "z.B. 9,99"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:97
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:120
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Entfernen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:109
|
||||||
|
#: includes/class-wc-tpp-frontend.php:75
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr "Menge"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:113
|
||||||
|
msgid "Fixed Price"
|
||||||
|
msgstr "Festpreis"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:117
|
||||||
|
msgid "Label (Optional)"
|
||||||
|
msgstr "Bezeichnung (Optional)"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:118
|
||||||
|
msgid "e.g., Starter Pack"
|
||||||
|
msgstr "z.B. Starter-Paket"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:71
|
||||||
|
msgid "Volume Discounts"
|
||||||
|
msgstr "Mengenrabatte"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:94
|
||||||
|
#: includes/class-wc-tpp-frontend.php:76
|
||||||
|
msgid "Price per Unit"
|
||||||
|
msgstr "Preis pro Einheit"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:77
|
||||||
|
msgid "You Save"
|
||||||
|
msgstr "Du sparst"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:110
|
||||||
|
msgid "Package Deals"
|
||||||
|
msgstr "Paketangebote"
|
||||||
|
|
||||||
|
#: templates/frontend/package-pricing-display.twig:11
|
||||||
|
msgid "Choose a package size below"
|
||||||
|
msgstr "Wähle unten eine Paketgröße"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
|
msgid "pieces"
|
||||||
|
msgstr "Stück"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:129
|
||||||
|
msgid "per unit"
|
||||||
|
msgstr "pro Einheit"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:133
|
||||||
|
msgid "Select Package"
|
||||||
|
msgstr "Paket auswählen"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:63
|
||||||
|
msgid "Package price"
|
||||||
|
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öß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.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
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"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
"PO-Revision-Date: 2025-12-21 00:00+0000\n"
|
||||||
@@ -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:21
|
||||||
#: includes/class-wc-tpp-admin.php:22
|
#: includes/class-wc-tpp-admin.php:22
|
||||||
|
#: includes/class-wc-tpp-settings.php:28
|
||||||
msgid "Tier & Package Prices"
|
msgid "Tier & Package Prices"
|
||||||
msgstr "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-admin.php:54
|
||||||
|
#: includes/class-wc-tpp-settings.php:65
|
||||||
msgid "Enable Tier Pricing"
|
msgid "Enable Tier Pricing"
|
||||||
msgstr "Enable Tier Pricing"
|
msgstr "Enable Tier Pricing"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:58
|
#: includes/class-wc-tpp-admin.php:58
|
||||||
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
msgid "Enable tier pricing for products"
|
msgid "Enable tier pricing for products"
|
||||||
msgstr "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-admin.php:63
|
||||||
|
#: includes/class-wc-tpp-settings.php:74
|
||||||
msgid "Enable Package Pricing"
|
msgid "Enable Package Pricing"
|
||||||
msgstr "Enable Package Pricing"
|
msgstr "Enable Package Pricing"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:67
|
#: includes/class-wc-tpp-admin.php:67
|
||||||
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
msgid "Enable fixed-price packages for products"
|
msgid "Enable fixed-price packages for products"
|
||||||
msgstr "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-admin.php:72
|
||||||
|
#: includes/class-wc-tpp-settings.php:83
|
||||||
msgid "Display Pricing Table"
|
msgid "Display Pricing Table"
|
||||||
msgstr "Display Pricing Table"
|
msgstr "Display Pricing Table"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:76
|
#: includes/class-wc-tpp-admin.php:76
|
||||||
|
#: includes/class-wc-tpp-settings.php:84
|
||||||
msgid "Show tier and package pricing table on product pages"
|
msgid "Show tier and package pricing table on product pages"
|
||||||
msgstr "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-admin.php:81
|
||||||
|
#: includes/class-wc-tpp-settings.php:92
|
||||||
msgid "Display Position"
|
msgid "Display Position"
|
||||||
msgstr "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
|
#: includes/class-wc-tpp-admin.php:85
|
||||||
msgid "Before Add to Cart"
|
msgid "Before Add to Cart"
|
||||||
msgstr "Before Add to Cart"
|
msgstr "Before Add to Cart"
|
||||||
@@ -63,9 +107,23 @@ msgid "After Add to Cart"
|
|||||||
msgstr "After Add to Cart"
|
msgstr "After Add to Cart"
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:87
|
#: includes/class-wc-tpp-admin.php:87
|
||||||
|
#: includes/class-wc-tpp-settings.php:103
|
||||||
msgid "After Price"
|
msgid "After Price"
|
||||||
msgstr "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
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
msgid "Tier Pricing"
|
msgid "Tier Pricing"
|
||||||
msgstr "Tier Pricing"
|
msgstr "Tier Pricing"
|
||||||
@@ -90,6 +148,10 @@ msgstr "Set fixed-price packages with specific quantities. For example: 10 piece
|
|||||||
msgid "Add Package"
|
msgid "Add Package"
|
||||||
msgstr "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
|
#: includes/class-wc-tpp-product-meta.php:90
|
||||||
msgid "Minimum Quantity"
|
msgid "Minimum Quantity"
|
||||||
msgstr "Minimum Quantity"
|
msgstr "Minimum Quantity"
|
||||||
@@ -142,6 +204,10 @@ msgstr "You Save"
|
|||||||
msgid "Package Deals"
|
msgid "Package Deals"
|
||||||
msgstr "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
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
msgid "pieces"
|
msgid "pieces"
|
||||||
msgstr "pieces"
|
msgstr "pieces"
|
||||||
@@ -161,3 +227,19 @@ msgstr "Package price"
|
|||||||
#: includes/class-wc-tpp-cart.php:66
|
#: includes/class-wc-tpp-cart.php:66
|
||||||
msgid "Volume discount"
|
msgid "Volume discount"
|
||||||
msgstr "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"
|
||||||
|
|||||||
BIN
languages/wc-tier-package-prices-fr_CH.mo
Normal file
BIN
languages/wc-tier-package-prices-fr_CH.mo
Normal file
Binary file not shown.
245
languages/wc-tier-package-prices-fr_CH.po
Normal file
245
languages/wc-tier-package-prices-fr_CH.po
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
# French (Switzerland) translation for WooCommerce Tier and Package Prices
|
||||||
|
# Copyright (C) 2025 Marco Graetsch
|
||||||
|
# This file is distributed under the GPL v2 or later.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.21\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
|
"POT-Creation-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"PO-Revision-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"Last-Translator: Marco Graetsch\n"
|
||||||
|
"Language-Team: French (Switzerland)\n"
|
||||||
|
"Language: fr_CH\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
"X-Generator: Poedit 3.0\n"
|
||||||
|
"X-Domain: wc-tier-package-prices\n"
|
||||||
|
|
||||||
|
#: wc-tier-and-package-prices.php:41
|
||||||
|
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||||
|
msgstr "WooCommerce Prix Échelonnés et Forfaitaires nécessite que WooCommerce soit installé et actif."
|
||||||
|
|
||||||
|
#: 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 "Prix Échelonnés & Forfaitaires"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:40
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Général"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:58
|
||||||
|
msgid "Tier & Package Prices Settings"
|
||||||
|
msgstr "Paramètres Prix Échelonnés & Forfaitaires"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:60
|
||||||
|
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||||
|
msgstr "Configurez les options de prix échelonnés et forfaitaires pour vos produits WooCommerce."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:54
|
||||||
|
#: includes/class-wc-tpp-settings.php:65
|
||||||
|
msgid "Enable Tier Pricing"
|
||||||
|
msgstr "Activer les prix échelonnés"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:58
|
||||||
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
|
msgid "Enable tier pricing for products"
|
||||||
|
msgstr "Activer les prix échelonnés pour les produits"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:70
|
||||||
|
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Permet des paliers de prix basés sur la quantité. Les clients bénéficient de prix réduits lors de l'achat de quantités plus importantes."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:63
|
||||||
|
#: includes/class-wc-tpp-settings.php:74
|
||||||
|
msgid "Enable Package Pricing"
|
||||||
|
msgstr "Activer les prix forfaitaires"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:67
|
||||||
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
|
msgid "Enable fixed-price packages for products"
|
||||||
|
msgstr "Activer les forfaits à prix fixe pour les produits"
|
||||||
|
|
||||||
|
#: 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 "Permet des forfaits à prix fixe avec des quantités spécifiques. Par exemple: 10 pièces pour CHF 50.-, 25 pièces pour CHF 100.-."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:72
|
||||||
|
#: includes/class-wc-tpp-settings.php:83
|
||||||
|
msgid "Display Pricing Table"
|
||||||
|
msgstr "Afficher le tableau des prix"
|
||||||
|
|
||||||
|
#: 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 "Afficher le tableau des prix échelonnés et forfaitaires sur les pages produits"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:88
|
||||||
|
msgid "Display the pricing table to customers on product pages."
|
||||||
|
msgstr "Affiche le tableau des prix aux clients sur les pages produits."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:81
|
||||||
|
#: includes/class-wc-tpp-settings.php:92
|
||||||
|
msgid "Display Position"
|
||||||
|
msgstr "Position d'affichage"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:93
|
||||||
|
msgid "Choose where to display the pricing table on product pages."
|
||||||
|
msgstr "Choisissez où afficher le tableau des prix sur les pages produits."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:101
|
||||||
|
msgid "Before Add to Cart Button"
|
||||||
|
msgstr "Avant le bouton \"Ajouter au panier\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:102
|
||||||
|
msgid "After Add to Cart Button"
|
||||||
|
msgstr "Après le bouton \"Ajouter au panier\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:85
|
||||||
|
msgid "Before Add to Cart"
|
||||||
|
msgstr "Avant \"Ajouter au panier\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:86
|
||||||
|
msgid "After Add to Cart"
|
||||||
|
msgstr "Après \"Ajouter au panier\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:87
|
||||||
|
#: includes/class-wc-tpp-settings.php:103
|
||||||
|
msgid "After Price"
|
||||||
|
msgstr "Après le prix"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:108
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:76
|
||||||
|
msgid "Restrict to Package Quantities"
|
||||||
|
msgstr "Restreindre aux quantités forfaitaires"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:109
|
||||||
|
msgid "Limit quantities to defined package sizes only"
|
||||||
|
msgstr "Limiter les quantités aux tailles de forfaits définies uniquement"
|
||||||
|
|
||||||
|
#: 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 "Lorsque cette option est activée, les clients ne peuvent acheter les produits que dans les quantités exactes définies dans les forfaits. Le champ de saisie de quantité sera masqué et remplacé par des boutons de sélection de forfait."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
|
msgid "Tier Pricing"
|
||||||
|
msgstr "Prix échelonnés"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:24
|
||||||
|
msgid "Set quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Définir des paliers de prix basés sur la quantité. Les clients bénéficient de réductions lors de l'achat de quantités plus importantes."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:41
|
||||||
|
msgid "Add Tier"
|
||||||
|
msgstr "Ajouter un palier"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:52
|
||||||
|
msgid "Package Pricing"
|
||||||
|
msgstr "Prix forfaitaires"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:53
|
||||||
|
msgid "Set fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||||
|
msgstr "Définir des forfaits à prix fixe avec des quantités spécifiques. Par exemple: 10 pièces pour CHF 50.-, 25 pièces pour CHF 100.-."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:70
|
||||||
|
msgid "Add Package"
|
||||||
|
msgstr "Ajouter un forfait"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:77
|
||||||
|
msgid "Only allow quantities defined in packages above"
|
||||||
|
msgstr "Autoriser uniquement les quantités définies dans les forfaits ci-dessus"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:90
|
||||||
|
msgid "Minimum Quantity"
|
||||||
|
msgstr "Quantité minimale"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:91
|
||||||
|
msgid "e.g., 10"
|
||||||
|
msgstr "p.ex. 10"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:95
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:114
|
||||||
|
msgid "e.g., 9.99"
|
||||||
|
msgstr "p.ex. 9.90"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:97
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:120
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Supprimer"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:109
|
||||||
|
#: includes/class-wc-tpp-frontend.php:75
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr "Quantité"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:113
|
||||||
|
msgid "Fixed Price"
|
||||||
|
msgstr "Prix fixe"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:117
|
||||||
|
msgid "Label (Optional)"
|
||||||
|
msgstr "Étiquette (Optionnel)"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:118
|
||||||
|
msgid "e.g., Starter Pack"
|
||||||
|
msgstr "p.ex. Pack de démarrage"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:71
|
||||||
|
msgid "Volume Discounts"
|
||||||
|
msgstr "Remises sur quantité"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:94
|
||||||
|
#: includes/class-wc-tpp-frontend.php:76
|
||||||
|
msgid "Price per Unit"
|
||||||
|
msgstr "Prix par unité"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:77
|
||||||
|
msgid "You Save"
|
||||||
|
msgstr "Vous économisez"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:110
|
||||||
|
msgid "Package Deals"
|
||||||
|
msgstr "Offres forfaitaires"
|
||||||
|
|
||||||
|
#: templates/frontend/package-pricing-display.twig:11
|
||||||
|
msgid "Choose a package size below"
|
||||||
|
msgstr "Choisissez une taille de forfait ci-dessous"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
|
msgid "pieces"
|
||||||
|
msgstr "pièces"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:129
|
||||||
|
msgid "per unit"
|
||||||
|
msgstr "par unité"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:133
|
||||||
|
msgid "Select Package"
|
||||||
|
msgstr "Sélectionner le forfait"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:63
|
||||||
|
msgid "Package price"
|
||||||
|
msgstr "Prix forfaitaire"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:66
|
||||||
|
msgid "Volume discount"
|
||||||
|
msgstr "Remise sur quantité"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:124
|
||||||
|
msgid "this product"
|
||||||
|
msgstr "ce produit"
|
||||||
|
|
||||||
|
#: 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 "La quantité %1$d n'est pas disponible pour %2$s. Veuillez choisir parmi les tailles de forfait disponibles: %3$s"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:173
|
||||||
|
msgid "View Options"
|
||||||
|
msgstr "Voir les options"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:178
|
||||||
|
msgid "View options for %s"
|
||||||
|
msgstr "Voir les options pour %s"
|
||||||
BIN
languages/wc-tier-package-prices-it_CH.mo
Normal file
BIN
languages/wc-tier-package-prices-it_CH.mo
Normal file
Binary file not shown.
245
languages/wc-tier-package-prices-it_CH.po
Normal file
245
languages/wc-tier-package-prices-it_CH.po
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
# Italian (Switzerland) translation for WooCommerce Tier and Package Prices
|
||||||
|
# Copyright (C) 2025 Marco Graetsch
|
||||||
|
# This file is distributed under the GPL v2 or later.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: WooCommerce Tier and Package Prices 1.1.21\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
|
"POT-Creation-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"PO-Revision-Date: 2025-12-23 00:00+0000\n"
|
||||||
|
"Last-Translator: Marco Graetsch\n"
|
||||||
|
"Language-Team: Italian (Switzerland)\n"
|
||||||
|
"Language: it_CH\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
"X-Generator: Poedit 3.0\n"
|
||||||
|
"X-Domain: wc-tier-package-prices\n"
|
||||||
|
|
||||||
|
#: wc-tier-and-package-prices.php:41
|
||||||
|
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||||
|
msgstr "WooCommerce Prezzi Scaglionati e Pacchetti richiede che WooCommerce sia installato e attivo."
|
||||||
|
|
||||||
|
#: 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 "Prezzi Scaglionati & Pacchetti"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:40
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Generale"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:58
|
||||||
|
msgid "Tier & Package Prices Settings"
|
||||||
|
msgstr "Impostazioni Prezzi Scaglionati & Pacchetti"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:60
|
||||||
|
msgid "Configure tier pricing and package pricing options for your WooCommerce products."
|
||||||
|
msgstr "Configura le opzioni di prezzi scaglionati e pacchetti per i tuoi prodotti WooCommerce."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:54
|
||||||
|
#: includes/class-wc-tpp-settings.php:65
|
||||||
|
msgid "Enable Tier Pricing"
|
||||||
|
msgstr "Attiva prezzi scaglionati"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:58
|
||||||
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
|
msgid "Enable tier pricing for products"
|
||||||
|
msgstr "Attiva prezzi scaglionati per i prodotti"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:70
|
||||||
|
msgid "Allow quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Permette scaglioni di prezzo basati sulla quantità. I clienti ottengono prezzi scontati quando acquistano quantità maggiori."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:63
|
||||||
|
#: includes/class-wc-tpp-settings.php:74
|
||||||
|
msgid "Enable Package Pricing"
|
||||||
|
msgstr "Attiva prezzi pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:67
|
||||||
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
|
msgid "Enable fixed-price packages for products"
|
||||||
|
msgstr "Attiva pacchetti a prezzo fisso per i prodotti"
|
||||||
|
|
||||||
|
#: 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 "Permette pacchetti a prezzo fisso con quantità specifiche. Ad esempio: 10 pezzi per CHF 50.-, 25 pezzi per CHF 100.-."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:72
|
||||||
|
#: includes/class-wc-tpp-settings.php:83
|
||||||
|
msgid "Display Pricing Table"
|
||||||
|
msgstr "Visualizza tabella prezzi"
|
||||||
|
|
||||||
|
#: 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 "Mostra la tabella dei prezzi scaglionati e pacchetti nelle pagine prodotto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:88
|
||||||
|
msgid "Display the pricing table to customers on product pages."
|
||||||
|
msgstr "Visualizza la tabella prezzi ai clienti nelle pagine prodotto."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:81
|
||||||
|
#: includes/class-wc-tpp-settings.php:92
|
||||||
|
msgid "Display Position"
|
||||||
|
msgstr "Posizione visualizzazione"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:93
|
||||||
|
msgid "Choose where to display the pricing table on product pages."
|
||||||
|
msgstr "Scegli dove visualizzare la tabella prezzi nelle pagine prodotto."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:101
|
||||||
|
msgid "Before Add to Cart Button"
|
||||||
|
msgstr "Prima del pulsante \"Aggiungi al carrello\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:102
|
||||||
|
msgid "After Add to Cart Button"
|
||||||
|
msgstr "Dopo il pulsante \"Aggiungi al carrello\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:85
|
||||||
|
msgid "Before Add to Cart"
|
||||||
|
msgstr "Prima di \"Aggiungi al carrello\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:86
|
||||||
|
msgid "After Add to Cart"
|
||||||
|
msgstr "Dopo \"Aggiungi al carrello\""
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-admin.php:87
|
||||||
|
#: includes/class-wc-tpp-settings.php:103
|
||||||
|
msgid "After Price"
|
||||||
|
msgstr "Dopo il prezzo"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:108
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:76
|
||||||
|
msgid "Restrict to Package Quantities"
|
||||||
|
msgstr "Limita alle quantità pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-settings.php:109
|
||||||
|
msgid "Limit quantities to defined package sizes only"
|
||||||
|
msgstr "Limita le quantità solo alle dimensioni pacchetto definite"
|
||||||
|
|
||||||
|
#: 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 "Quando attivato, i clienti possono acquistare prodotti solo nelle quantità esatte definite nei pacchetti. Il campo di inserimento quantità verrà nascosto e sostituito con pulsanti di selezione pacchetto."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
|
msgid "Tier Pricing"
|
||||||
|
msgstr "Prezzi scaglionati"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:24
|
||||||
|
msgid "Set quantity-based pricing tiers. Customers get discounted prices when buying in larger quantities."
|
||||||
|
msgstr "Imposta scaglioni di prezzo basati sulla quantità. I clienti ottengono sconti quando acquistano quantità maggiori."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:41
|
||||||
|
msgid "Add Tier"
|
||||||
|
msgstr "Aggiungi scaglione"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:52
|
||||||
|
msgid "Package Pricing"
|
||||||
|
msgstr "Prezzi pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:53
|
||||||
|
msgid "Set fixed-price packages with specific quantities. For example: 10 pieces for $50, 25 pieces for $100."
|
||||||
|
msgstr "Imposta pacchetti a prezzo fisso con quantità specifiche. Ad esempio: 10 pezzi per CHF 50.-, 25 pezzi per CHF 100.-."
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:70
|
||||||
|
msgid "Add Package"
|
||||||
|
msgstr "Aggiungi pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:77
|
||||||
|
msgid "Only allow quantities defined in packages above"
|
||||||
|
msgstr "Consenti solo le quantità definite nei pacchetti sopra"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:90
|
||||||
|
msgid "Minimum Quantity"
|
||||||
|
msgstr "Quantità minima"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:91
|
||||||
|
msgid "e.g., 10"
|
||||||
|
msgstr "es. 10"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:95
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:114
|
||||||
|
msgid "e.g., 9.99"
|
||||||
|
msgstr "es. 9.90"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:97
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:120
|
||||||
|
msgid "Remove"
|
||||||
|
msgstr "Rimuovi"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:109
|
||||||
|
#: includes/class-wc-tpp-frontend.php:75
|
||||||
|
msgid "Quantity"
|
||||||
|
msgstr "Quantità"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:113
|
||||||
|
msgid "Fixed Price"
|
||||||
|
msgstr "Prezzo fisso"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:117
|
||||||
|
msgid "Label (Optional)"
|
||||||
|
msgstr "Etichetta (Opzionale)"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:118
|
||||||
|
msgid "e.g., Starter Pack"
|
||||||
|
msgstr "es. Pacchetto starter"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:71
|
||||||
|
msgid "Volume Discounts"
|
||||||
|
msgstr "Sconti quantità"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-product-meta.php:94
|
||||||
|
#: includes/class-wc-tpp-frontend.php:76
|
||||||
|
msgid "Price per Unit"
|
||||||
|
msgstr "Prezzo per unità"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:77
|
||||||
|
msgid "You Save"
|
||||||
|
msgstr "Risparmi"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:110
|
||||||
|
msgid "Package Deals"
|
||||||
|
msgstr "Offerte pacchetto"
|
||||||
|
|
||||||
|
#: templates/frontend/package-pricing-display.twig:11
|
||||||
|
msgid "Choose a package size below"
|
||||||
|
msgstr "Scegli una dimensione pacchetto qui sotto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:123
|
||||||
|
msgid "pieces"
|
||||||
|
msgstr "pezzi"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:129
|
||||||
|
msgid "per unit"
|
||||||
|
msgstr "per unità"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:133
|
||||||
|
msgid "Select Package"
|
||||||
|
msgstr "Seleziona pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:63
|
||||||
|
msgid "Package price"
|
||||||
|
msgstr "Prezzo pacchetto"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:66
|
||||||
|
msgid "Volume discount"
|
||||||
|
msgstr "Sconto quantità"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-cart.php:124
|
||||||
|
msgid "this product"
|
||||||
|
msgstr "questo prodotto"
|
||||||
|
|
||||||
|
#: 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 "La quantità %1$d non è disponibile per %2$s. Si prega di scegliere tra le dimensioni pacchetto disponibili: %3$s"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:173
|
||||||
|
msgid "View Options"
|
||||||
|
msgstr "Visualizza opzioni"
|
||||||
|
|
||||||
|
#: includes/class-wc-tpp-frontend.php:178
|
||||||
|
msgid "View options for %s"
|
||||||
|
msgstr "Visualizza opzioni per %s"
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# This file is distributed under the GPL v2 or later.
|
# This file is distributed under the GPL v2 or later.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.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"
|
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||||
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
"POT-Creation-Date: 2025-12-21 00:00+0000\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -14,55 +14,96 @@ msgstr ""
|
|||||||
"X-Generator: Poedit 3.0\n"
|
"X-Generator: Poedit 3.0\n"
|
||||||
"X-Domain: wc-tier-package-prices\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."
|
msgid "WooCommerce Tier and Package Prices requires WooCommerce to be installed and active."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:21
|
#: includes/class-wc-tpp-settings.php:28
|
||||||
#: includes/class-wc-tpp-admin.php:22
|
#: includes/class-wc-tpp-settings.php:58
|
||||||
msgid "Tier & Package Prices"
|
msgid "Tier & Package Prices"
|
||||||
msgstr ""
|
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"
|
msgid "Enable Tier Pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:58
|
#: includes/class-wc-tpp-settings.php:66
|
||||||
msgid "Enable tier pricing for products"
|
msgid "Enable tier pricing for products"
|
||||||
msgstr ""
|
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"
|
msgid "Enable Package Pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:67
|
#: includes/class-wc-tpp-settings.php:75
|
||||||
msgid "Enable fixed-price packages for products"
|
msgid "Enable fixed-price packages for products"
|
||||||
msgstr ""
|
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"
|
msgid "Display Pricing Table"
|
||||||
msgstr ""
|
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"
|
msgid "Show tier and package pricing table on product pages"
|
||||||
msgstr ""
|
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"
|
msgid "Display Position"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:85
|
#: includes/class-wc-tpp-settings.php:93
|
||||||
msgid "Before Add to Cart"
|
msgid "Choose where to display the pricing table on product pages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-admin.php:86
|
#: includes/class-wc-tpp-settings.php:101
|
||||||
msgid "After Add to Cart"
|
msgid "Before Add to Cart Button"
|
||||||
msgstr ""
|
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"
|
msgid "After Price"
|
||||||
msgstr ""
|
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
|
#: includes/class-wc-tpp-product-meta.php:23
|
||||||
msgid "Tier Pricing"
|
msgid "Tier Pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -87,80 +128,105 @@ msgstr ""
|
|||||||
msgid "Add Package"
|
msgid "Add Package"
|
||||||
msgstr ""
|
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"
|
msgid "Minimum Quantity"
|
||||||
msgstr ""
|
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"
|
msgid "e.g., 10"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:94
|
#: templates/admin/tier-row.twig:16
|
||||||
msgid "Price per Unit"
|
msgid "Price per Unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:95
|
#: templates/admin/tier-row.twig:21
|
||||||
#: includes/class-wc-tpp-product-meta.php:114
|
|
||||||
msgid "e.g., 9.99"
|
msgid "e.g., 9.99"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:97
|
#: templates/admin/tier-row.twig:25
|
||||||
#: includes/class-wc-tpp-product-meta.php:120
|
#: templates/admin/package-row.twig:30
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:109
|
#: templates/admin/package-row.twig:9
|
||||||
|
#: templates/frontend/tier-pricing-table.twig:13
|
||||||
msgid "Quantity"
|
msgid "Quantity"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:113
|
#: templates/admin/package-row.twig:20
|
||||||
msgid "Fixed Price"
|
msgid "Fixed Price"
|
||||||
msgstr ""
|
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)"
|
msgid "Label (Optional)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-product-meta.php:118
|
#: templates/admin/package-row.twig:29
|
||||||
msgid "e.g., Starter Pack"
|
msgid "e.g., Starter Pack"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:71
|
#: templates/frontend/tier-pricing-table.twig:9
|
||||||
msgid "Volume Discounts"
|
msgid "Volume Discounts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:75
|
#: templates/frontend/tier-pricing-table.twig:14
|
||||||
msgid "Quantity"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:76
|
|
||||||
msgid "Price per Unit"
|
msgid "Price per Unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:77
|
#: templates/frontend/tier-pricing-table.twig:15
|
||||||
msgid "You Save"
|
msgid "You Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:110
|
#: templates/frontend/package-pricing-display.twig:8
|
||||||
msgid "Package Deals"
|
msgid "Package Deals"
|
||||||
msgstr ""
|
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"
|
msgid "pieces"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:129
|
#: templates/frontend/package-pricing-display.twig:24
|
||||||
msgid "per unit"
|
msgid "per unit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-frontend.php:133
|
#: templates/frontend/package-pricing-display.twig:28
|
||||||
msgid "Select Package"
|
msgid "Select Package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-cart.php:63
|
#: includes/class-wc-tpp-cart.php:76
|
||||||
msgid "Package price"
|
msgid "Package price"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: includes/class-wc-tpp-cart.php:66
|
#: includes/class-wc-tpp-cart.php:79
|
||||||
msgid "Volume discount"
|
msgid "Volume discount"
|
||||||
msgstr ""
|
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 ""
|
||||||
|
|||||||
219
releases/README.md
Normal file
219
releases/README.md
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
# WooCommerce Tier and Package Prices - Releases
|
||||||
|
|
||||||
|
This directory contains production-ready releases of the WooCommerce Tier and Package Prices plugin.
|
||||||
|
|
||||||
|
## Latest Release
|
||||||
|
|
||||||
|
**Version 1.1.20** - December 23, 2025
|
||||||
|
|
||||||
|
### What's New in 1.1.20
|
||||||
|
- 🔧 **CRITICAL FIX:** Resolved WooCommerce Blocks fatal error in mini-cart and cart blocks
|
||||||
|
- ✅ Full WooCommerce Blocks compatibility (cart, mini-cart, checkout)
|
||||||
|
- ✅ Fixed `woocommerce_store_api_product_quantity_editable` filter signature
|
||||||
|
- ✅ Tier labels for enhanced UX (v1.1.7)
|
||||||
|
- ✅ Package quantity restrictions (v1.1.0)
|
||||||
|
- ✅ Clickable tier rows with auto-fill
|
||||||
|
- ✅ Enhanced "View Options" buttons
|
||||||
|
|
||||||
|
### Quick Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Download the package
|
||||||
|
wget https://your-domain.com/releases/wc-tier-and-package-prices-1.1.20.zip
|
||||||
|
|
||||||
|
# Verify checksum (optional but recommended)
|
||||||
|
sha256sum wc-tier-and-package-prices-1.1.20.zip
|
||||||
|
|
||||||
|
# Install via WordPress admin or WP-CLI
|
||||||
|
wp plugin install wc-tier-and-package-prices-1.1.20.zip --activate
|
||||||
|
```
|
||||||
|
|
||||||
|
## Files in This Directory
|
||||||
|
|
||||||
|
### Release Packages
|
||||||
|
|
||||||
|
| File | Description | Size |
|
||||||
|
|------|-------------|------|
|
||||||
|
| `wc-tier-and-package-prices-1.1.20.zip` | Production plugin package | ~400 KB |
|
||||||
|
| `wc-tier-and-package-prices-1.1.20.zip.sha256` | SHA-256 checksum | - |
|
||||||
|
| `wc-tier-and-package-prices-1.1.20.zip.md5` | MD5 checksum | - |
|
||||||
|
| `RELEASE-INFO-1.1.20.md` | Detailed release information | - |
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
### Verify Package Integrity
|
||||||
|
|
||||||
|
**Using SHA-256:**
|
||||||
|
```bash
|
||||||
|
sha256sum -c wc-tier-and-package-prices-1.1.20.zip.sha256
|
||||||
|
```
|
||||||
|
|
||||||
|
**Using MD5:**
|
||||||
|
```bash
|
||||||
|
md5sum -c wc-tier-and-package-prices-1.1.20.zip.md5
|
||||||
|
```
|
||||||
|
|
||||||
|
### Expected Checksums
|
||||||
|
|
||||||
|
Checksums will be generated when the release package is created.
|
||||||
|
|
||||||
|
## Installation Methods
|
||||||
|
|
||||||
|
### Method 1: WordPress Admin (Recommended for most users)
|
||||||
|
|
||||||
|
1. Download `wc-tier-and-package-prices-1.1.20.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.1.20.zip --activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 3: Manual Installation (Advanced)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extract to wp-content/plugins/
|
||||||
|
unzip wc-tier-and-package-prices-1.1.20.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 with optional labels (quantity-based discounts)
|
||||||
|
- ✅ Package pricing with quantity restrictions (fixed-price bundles)
|
||||||
|
- ✅ Clickable tier rows with auto-quantity fill
|
||||||
|
- ✅ WooCommerce Blocks full support (cart, mini-cart, checkout)
|
||||||
|
- ✅ Twig template engine for secure templating
|
||||||
|
- ✅ WooCommerce HPOS (High-Performance Order Storage) compatible
|
||||||
|
- ✅ Quantity restriction enforcement
|
||||||
|
- ✅ "View Options" catalog buttons for restricted products
|
||||||
|
- ✅ Multilingual support (3 languages)
|
||||||
|
|
||||||
|
### 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.x
|
||||||
|
- ✅ Tested with WordPress 6.0 - 6.9.x
|
||||||
|
- ✅ PHP 7.4+ compatible
|
||||||
|
- ✅ Block-based themes compatible
|
||||||
|
|
||||||
|
## Package Contents
|
||||||
|
|
||||||
|
```
|
||||||
|
wc-tier-and-package-prices/
|
||||||
|
├── assets/ # CSS and JavaScript
|
||||||
|
│ ├── css/
|
||||||
|
│ │ ├── admin.css
|
||||||
|
│ │ └── frontend.css
|
||||||
|
│ └── js/
|
||||||
|
│ ├── admin.js
|
||||||
|
│ └── frontend.js
|
||||||
|
├── includes/ # PHP classes
|
||||||
|
│ ├── class-wc-tpp-admin.php
|
||||||
|
│ ├── class-wc-tpp-settings.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.po
|
||||||
|
│ ├── wc-tier-package-prices-de_CH_informal.mo
|
||||||
|
│ ├── wc-tier-package-prices-de_DE.po
|
||||||
|
│ ├── wc-tier-package-prices-de_DE.mo
|
||||||
|
│ ├── wc-tier-package-prices-en_US.po
|
||||||
|
│ ├── wc-tier-package-prices-en_US.mo
|
||||||
|
│ └── wc-tier-package-prices.pot
|
||||||
|
├── templates/ # Twig templates
|
||||||
|
│ ├── admin/
|
||||||
|
│ │ ├── tier-row.twig
|
||||||
|
│ │ └── package-row.twig
|
||||||
|
│ └── frontend/
|
||||||
|
│ ├── pricing-table.twig
|
||||||
|
│ ├── tier-pricing-table.twig
|
||||||
|
│ └── package-pricing-display.twig
|
||||||
|
├── vendor/ # Composer dependencies
|
||||||
|
│ └── twig/twig/
|
||||||
|
├── CHANGELOG.md
|
||||||
|
├── INSTALLATION.md
|
||||||
|
├── QUICKSTART.md
|
||||||
|
├── USAGE_EXAMPLES.md
|
||||||
|
├── README.md
|
||||||
|
├── composer.json
|
||||||
|
└── wc-tier-and-package-prices.php
|
||||||
|
```
|
||||||
|
|
||||||
|
## System Requirements
|
||||||
|
|
||||||
|
| Requirement | Minimum Version | Tested Up To |
|
||||||
|
|-------------|----------------|--------------|
|
||||||
|
| WordPress | 6.0+ | 6.9.x |
|
||||||
|
| PHP | 7.4+ | 8.x |
|
||||||
|
| WooCommerce | 8.0+ | 10.x |
|
||||||
|
| MySQL | 5.6+ | 8.x |
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
- **Documentation:** See README.md, INSTALLATION.md, QUICKSTART.md, USAGE_EXAMPLES.md
|
||||||
|
- **Repository:** https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
|
||||||
|
- **Author:** Marco Graetsch
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
### 1.1.20 (2025-12-23) - Current Release
|
||||||
|
- **CRITICAL FIX:** WooCommerce Blocks fatal error resolved
|
||||||
|
- Fixed filter signature for `woocommerce_store_api_product_quantity_editable`
|
||||||
|
- Full compatibility with WooCommerce Store API and block-based cart/checkout
|
||||||
|
- Enhanced stability for block-based themes
|
||||||
|
|
||||||
|
### 1.1.7 (2025-12-22)
|
||||||
|
- Added optional tier labels for enhanced UX
|
||||||
|
- Clickable tier rows with auto-quantity fill
|
||||||
|
- Add to Cart button auto-disable for invalid quantities
|
||||||
|
|
||||||
|
### 1.1.4 (2025-12-22)
|
||||||
|
- WooCommerce Blocks support (cart, mini-cart, checkout)
|
||||||
|
- Enhanced "View Options" button styling
|
||||||
|
|
||||||
|
### 1.1.0 (2025-12-21)
|
||||||
|
- Package quantity restrictions (global and per-product)
|
||||||
|
- Quantity field hiding for restricted products
|
||||||
|
- Server-side validation for package quantities
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
|
For complete version history, see [CHANGELOG.md](../CHANGELOG.md)
|
||||||
|
|
||||||
|
## 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.
|
||||||
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.15.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.15.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.15.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.15.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
15fa0e0933c85b23f66940bf43810835 wc-tier-and-package-prices-1.1.15.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.15.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.15.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
a419579111ad20b127411e1078ca99187156d606381549e6bf147ffc3bd58de1 wc-tier-and-package-prices-1.1.15.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.16.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.16.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.16.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.16.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
d30a90715dbcd46a1dfd19f025897530 wc-tier-and-package-prices-1.1.16.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.16.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.16.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e2ad36e049a902b8e287154867ef72c0e169766508781e223176a2a753b60915 wc-tier-and-package-prices-1.1.16.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.17.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.17.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.17.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.17.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
9adbb9aad13b8d141cfabfdf53643480 wc-tier-and-package-prices-1.1.17.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.17.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.17.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
985a195bf98d4dbc0a7afa90173efcda472f4c769adf3c833fa6a99ba9d44095 wc-tier-and-package-prices-1.1.17.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.18.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.18.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.18.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.18.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ec4bb1d78a3c27488244b44971916ffd wc-tier-and-package-prices-1.1.18.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.18.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.18.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
7d942002edd866c2b6f3192ba010fe64058b7433c5ac776a48e9c3c41f4e2fda wc-tier-and-package-prices-1.1.18.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.19.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.19.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.19.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.19.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
c61c3a059429d8dacdce71d4acce401e wc-tier-and-package-prices-1.1.19.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.19.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.19.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0e8bc4ccd233d388238e800cd0e0a129f9e8da14008e7164db7934a48ca8223a wc-tier-and-package-prices-1.1.19.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.20.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.20.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.20.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.20.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
bfdeee75bfe3795c9ab9abfe47f12a41 wc-tier-and-package-prices-1.1.20.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.20.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.20.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
953859241d15d76ec4783c72bac851ddd69e5a1f7b119ee4f9ebd30c7fabed17 wc-tier-and-package-prices-1.1.20.zip
|
||||||
BIN
releases/wc-tier-and-package-prices-1.1.21.zip
Normal file
BIN
releases/wc-tier-and-package-prices-1.1.21.zip
Normal file
Binary file not shown.
1
releases/wc-tier-and-package-prices-1.1.21.zip.md5
Normal file
1
releases/wc-tier-and-package-prices-1.1.21.zip.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
16813b3ed0d1001d5f60194d61d36fc2 wc-tier-and-package-prices-1.1.21.zip
|
||||||
1
releases/wc-tier-and-package-prices-1.1.21.zip.sha256
Normal file
1
releases/wc-tier-and-package-prices-1.1.21.zip.sha256
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e0063852a9ac23b1fd994471a2829f9dcbe26316f00ddee2d00f77c7c6a47c8f wc-tier-and-package-prices-1.1.21.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
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user