You've already forked wc-composable-product
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 29a68b0be4 | |||
| fb8ddf903e | |||
| 33d2836de0 | |||
| c036a37602 | |||
| efedd1bf29 | |||
| 12388af5a0 | |||
| c39c13ffed | |||
| 7931dbeef9 | |||
| ee81de86c2 | |||
| 669888817b | |||
| 5564b888fc | |||
| 91aca25169 | |||
| 4195fb2651 | |||
| ba28ae174f | |||
| 755108a7d3 | |||
| 85983d5473 | |||
| 252b187600 | |||
| 8185a77697 | |||
| 6c2e317230 | |||
| 58f5329bc4 | |||
| 0767016370 | |||
| fa7ec0e422 | |||
| f4d2543d4e | |||
| 9e4513f911 | |||
| 4dc7b767a8 | |||
| f763e35d19 | |||
| 8b271c90c0 | |||
| 0dd4408b23 | |||
| 7a4a0a0135 | |||
| c6a48d6404 | |||
| ac1cb9b135 | |||
| f5bc0d0335 | |||
| 88a907c4dd | |||
| 03a7624564 | |||
| 1c3f44f3c2 | |||
| 287f8b778b | |||
| 63d8f9ed52 | |||
| 601570d724 | |||
| e9b2d1c79b | |||
| d27dd4b7bd |
241
CHANGELOG.md
241
CHANGELOG.md
@@ -5,6 +5,247 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.1.14] - 2025-12-31
|
||||
|
||||
### Added
|
||||
|
||||
- **DEBUG**: Comprehensive debug logging to troubleshoot product retrieval issues
|
||||
- Error log output shows selection criteria, query arguments, and results
|
||||
- Logs each product/variation being added to help identify filtering issues
|
||||
- Enable by setting WP_DEBUG to true in wp-config.php
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified file: includes/Product_Type.php (added error_log statements throughout get_available_products())
|
||||
- Logs criteria array (categories, tags, SKUs)
|
||||
- Logs WP_Query arguments before execution
|
||||
- Logs number of posts found by query
|
||||
- Logs each variable product's variation count
|
||||
- Logs each variation/simple product being added with name
|
||||
- Logs total products available at end
|
||||
- All logging wrapped in WP_DEBUG checks (no performance impact in production)
|
||||
|
||||
### Notes
|
||||
|
||||
- This is a debug release to help diagnose why products aren't showing
|
||||
- No functional changes from v1.1.13
|
||||
- User should enable WP_DEBUG and check debug.log or error.log
|
||||
- Log output will show exactly where products are being filtered out
|
||||
- All translation files remain at 100% completion (57/57 strings)
|
||||
|
||||
## [1.1.13] - 2025-12-31
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: "No products available for selection" message showing even when products are configured
|
||||
- Removed overly strict `is_in_stock()` requirement that was filtering out all products
|
||||
- Products now show regardless of stock status (out-of-stock items are displayed but disabled)
|
||||
- Added `'relation' => 'AND'` to meta_query for proper handling of multiple meta conditions
|
||||
|
||||
### Changed
|
||||
|
||||
- Product retrieval now shows all purchasable products, not just in-stock ones
|
||||
- Stock status still displayed on frontend with appropriate styling
|
||||
- Out-of-stock items shown but disabled via checkbox and visual indicators
|
||||
- Frontend stock management from v1.1.0 still fully functional
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified file: includes/Product_Type.php (lines 117-124, 177, 181)
|
||||
- Changed from `$variation->is_in_stock() && $variation->is_purchasable()` to just `$variation->is_purchasable()`
|
||||
- Changed from `$product->is_in_stock() && $product->is_purchasable()` to just `$product->is_purchasable()`
|
||||
- Added `'relation' => 'AND'` to meta_query array for WordPress query compatibility
|
||||
|
||||
### Notes
|
||||
|
||||
- This fixes the issue where NO products were showing in the selector
|
||||
- Stock validation still occurs at add-to-cart time (Stock_Manager class)
|
||||
- Frontend still displays stock badges (in stock, low stock, out of stock)
|
||||
- Out-of-stock items remain non-selectable via disabled checkboxes
|
||||
- All translation files remain at 100% completion (57/57 strings)
|
||||
|
||||
## [1.1.12] - 2025-12-31
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: Variable product variations still not appearing in product selector after v1.1.11 release
|
||||
- Changed variation retrieval method from `get_available_variations()` to `get_children()` for more reliable variation ID retrieval
|
||||
- `get_available_variations()` returns complex data arrays which may not work in all contexts
|
||||
- `get_children()` returns simple array of variation IDs directly, ensuring consistent results
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified file: includes/Product_Type.php (lines 171-184)
|
||||
- Changed from `$product->get_available_variations()` to `$product->get_children()`
|
||||
- More direct and reliable method for retrieving variation IDs
|
||||
- Each variation ID passed to `wc_get_product()` for full product object
|
||||
- Maintains all stock and purchasability checks from v1.1.11
|
||||
|
||||
### Notes
|
||||
|
||||
- This is a patch release fixing the variable product support introduced in v1.1.11
|
||||
- User reported "nope, still no product selectable" after v1.1.11
|
||||
- Root cause: `get_available_variations()` returns variation data arrays instead of clean IDs
|
||||
- `get_children()` is the standard WooCommerce method for retrieving variation IDs
|
||||
- All translation files remain at 100% completion (57/57 strings - no changes needed)
|
||||
|
||||
## [1.1.11] - 2025-12-31
|
||||
|
||||
### Added
|
||||
|
||||
- **FEATURE**: Variable product support - composable products can now include variable products and their variations
|
||||
- Variable products automatically expand to show all available variations as selectable items
|
||||
- Each variation displays with full attribute information (e.g., "Product - Color: Red, Size: Large")
|
||||
|
||||
### Fixed
|
||||
|
||||
- Products not showing in selector when all available products were variable products
|
||||
- Variable products were being filtered out because parent products aren't directly purchasable
|
||||
|
||||
### Changed
|
||||
|
||||
- Modified `get_available_products()` to detect and handle variable products
|
||||
- Variable products now expand into their individual variations
|
||||
- Each variation checked individually for stock status and purchasability
|
||||
- Simple products continue to work exactly as before
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified file: includes/Product_Type.php (lines 160-188)
|
||||
- Added logic to detect `is_type('variable')` products
|
||||
- Uses `get_available_variations()` to retrieve all variations
|
||||
- Each variation validated with `is_in_stock()` and `is_purchasable()`
|
||||
- Maintains backward compatibility with simple products
|
||||
|
||||
### Notes
|
||||
|
||||
- This is a feature enhancement release, not a bug fix
|
||||
- Resolves the issue where categories containing only variable products showed no selections
|
||||
- Variations display with their parent product name plus selected attributes
|
||||
- Stock management works correctly for both simple products and variations
|
||||
- All translation files remain at 100% completion (57/57 strings - no new strings added)
|
||||
|
||||
## [1.1.10] - 2025-12-31
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: Admin panel - Both General and Composable tabs visible simultaneously on initial page load
|
||||
- **CRITICAL**: Frontend - No products showing in product selector, only cart button and pricing visible
|
||||
- Empty product grid now shows helpful message instead of blank space
|
||||
|
||||
### Changed
|
||||
|
||||
- Added explicit `display: none` to `#composable_product_data` panel for proper initial hiding
|
||||
- Panel now only shows when `body.product-type-composable` class is present
|
||||
- Added empty state message in product selector template when no products are configured
|
||||
- Cleared Twig cache to ensure template changes take effect
|
||||
|
||||
### Added
|
||||
|
||||
- Empty state message: "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
- Translations for empty state message in all 6 supported locales (de_DE, de_DE_informal, de_CH, de_CH_informal, fr_CH, it_CH)
|
||||
- Recompiled .mo translation files
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified files: assets/css/admin.css (lines 7-16), templates/product-selector.twig (lines 12-15)
|
||||
- Root cause (admin): Panel lacked explicit CSS hiding rule, relied only on `hidden` class
|
||||
- Root cause (frontend): No feedback when products array is empty
|
||||
- Solution: CSS specificity + empty state conditional in Twig template
|
||||
|
||||
### Notes
|
||||
|
||||
- This release fixes two critical bugs discovered immediately after v1.1.9
|
||||
- Admin interface now correctly hides composable panel until product type is selected
|
||||
- Frontend provides clear user feedback when product selection is unavailable
|
||||
- All translation files now 100% complete (57/57 strings)
|
||||
|
||||
## [1.1.9] - 2025-12-31
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: Admin rendering completely broken - tabs disappeared and fields appeared out of context after v1.1.8 release
|
||||
- CSS selectors were too broad, hiding tab navigation along with field groups
|
||||
- Removed `!important` flags that caused overly aggressive hiding
|
||||
|
||||
### Changed
|
||||
|
||||
- Made CSS selectors more specific: `.options_group.show_if_composable` for field groups only
|
||||
- Added separate rule for tab links: `.product_data_tabs li.composable_options`
|
||||
- Tab navigation now works correctly without hiding itself
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified files: assets/css/admin.css (lines 22-40)
|
||||
- Root cause: `.show_if_composable` class used by WooCommerce for both tab links AND field groups
|
||||
- Solution: Separate selectors for each use case to prevent unintended hiding
|
||||
|
||||
### Notes
|
||||
|
||||
- This release fixes critical regression introduced in v1.1.8
|
||||
- Admin interface now renders correctly with visible tabs and properly positioned fields
|
||||
- No `!important` flags needed with specific selectors
|
||||
|
||||
## [1.1.8] - 2025-12-31
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: Admin rendering bug where both General and Composable Options tabs showed simultaneously on initial page load
|
||||
- **CRITICAL**: Frontend product selector not appearing on product pages - WooCommerce's default add-to-cart button now hidden for composable products
|
||||
- **CRITICAL**: Price formatting not localized - prices now display with proper currency symbols, decimal separators, and thousand separators for all locales
|
||||
|
||||
### Added
|
||||
|
||||
- `wc_price()` Twig function for proper price formatting in templates
|
||||
- `formatPrice()` JavaScript method with full WooCommerce locale support
|
||||
- Price format localization data passed to frontend JavaScript (decimal/thousand separators, currency position, number of decimals)
|
||||
- `hide_default_add_to_cart()` method to prevent WooCommerce's default purchase UI for composable products
|
||||
|
||||
### Changed
|
||||
|
||||
- Enhanced CSS specificity with `!important` flags for proper tab visibility control
|
||||
- Template now uses `{{ fixed_price_html|raw }}` instead of raw currency concatenation
|
||||
- Product selector passes pre-formatted price HTML from `wc_price()` function
|
||||
- Frontend JavaScript updates prices dynamically using WooCommerce format settings
|
||||
|
||||
### Technical
|
||||
|
||||
- Modified files: assets/css/admin.css (+24 lines), includes/Cart_Handler.php (+14 lines), includes/Plugin.php (+7 lines), includes/Product_Selector.php (+2 lines), templates/product-selector.twig, assets/js/frontend.js (+28 lines)
|
||||
- All PHP files pass syntax validation
|
||||
- Supports Swiss format (CHF 50.-), European format (50,00 €), US format ($50.00), and all other WooCommerce locales
|
||||
- Thousand separator support: comma (1,000), dot (1.000), apostrophe (1'000), space (1 000)
|
||||
|
||||
### Notes
|
||||
|
||||
- This release fixes all three critical UI bugs reported in CLAUDE.md
|
||||
- Admin tabs now display correctly on initial page load without JavaScript flicker
|
||||
- Frontend product selector is now the only purchase interface (no WooCommerce default button)
|
||||
- All prices maintain proper locale formatting during dynamic updates
|
||||
|
||||
## [1.1.7] - 2025-12-31
|
||||
|
||||
### Added
|
||||
|
||||
- Compiled .mo translation files for all 6 supported locales (de_DE, de_DE_informal, de_CH, de_CH_informal, fr_CH, it_CH)
|
||||
- WordPress can now load translations in admin and frontend areas
|
||||
|
||||
### Fixed
|
||||
|
||||
- **CRITICAL**: Missing translations in WordPress admin when using non-English locales
|
||||
- Settings page ("Composable Products", "Default Selection Limit", etc.) now properly translated
|
||||
- Product settings ("Composable Options", "Selection Criteria", etc.) now properly translated
|
||||
|
||||
### Technical
|
||||
|
||||
- Compiled .mo files from .po sources using msgfmt
|
||||
- All 6 locales now have complete translation coverage (56/56 strings translated and compiled)
|
||||
- .mo files required for WordPress i18n system to display translations
|
||||
|
||||
### Notes
|
||||
|
||||
- Previous versions included .po translation files but WordPress requires compiled .mo files
|
||||
- This release makes all existing translations actually visible to users
|
||||
|
||||
## [1.1.6] - 2025-12-31
|
||||
|
||||
### Added
|
||||
|
||||
@@ -4,10 +4,17 @@
|
||||
* @package WC_Composable_Product
|
||||
*/
|
||||
|
||||
/* Hide composable panel by default */
|
||||
#composable_product_data {
|
||||
display: none;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
/* Show composable panel when composable type is selected */
|
||||
body.product-type-composable #composable_product_data {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.composable_criteria_group {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 12px;
|
||||
@@ -19,11 +26,23 @@
|
||||
min-height: 150px;
|
||||
}
|
||||
|
||||
.show_if_composable {
|
||||
/* Hide composable-specific elements by default (but not tabs) */
|
||||
.options_group.show_if_composable {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.product-type-composable .show_if_composable {
|
||||
/* Show composable elements when composable product type is selected */
|
||||
body.product-type-composable .options_group.show_if_composable {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Hide the Composable Options tab link by default */
|
||||
.product_data_tabs li.composable_options {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Show the Composable Options tab when composable type selected */
|
||||
body.product-type-composable .product_data_tabs li.composable_options {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,36 @@
|
||||
this.clearMessages($container);
|
||||
},
|
||||
|
||||
/**
|
||||
* Format price using WooCommerce settings
|
||||
*
|
||||
* @param {number} price Price amount
|
||||
* @return {string} Formatted price HTML
|
||||
*/
|
||||
formatPrice: function(price) {
|
||||
if (typeof wcComposableProduct === 'undefined' || !wcComposableProduct.price_format) {
|
||||
return price.toFixed(2);
|
||||
}
|
||||
|
||||
const format = wcComposableProduct.price_format;
|
||||
const decimals = parseInt(format.decimals, 10);
|
||||
const decimalSep = format.decimal_separator;
|
||||
const thousandSep = format.thousand_separator;
|
||||
|
||||
// Format number
|
||||
let priceStr = price.toFixed(decimals);
|
||||
const parts = priceStr.split('.');
|
||||
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandSep);
|
||||
priceStr = parts.join(decimalSep);
|
||||
|
||||
// Apply price format (e.g., "%1$s%2$s" for symbol+price or "%2$s%1$s" for price+symbol)
|
||||
let formatted = format.price_format
|
||||
.replace('%1$s', '<span class="woocommerce-Price-currencySymbol">' + format.currency_symbol + '</span>')
|
||||
.replace('%2$s', priceStr);
|
||||
|
||||
return '<span class="woocommerce-Price-amount amount">' + formatted + '</span>';
|
||||
},
|
||||
|
||||
/**
|
||||
* Update total price
|
||||
*
|
||||
@@ -79,8 +109,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
const currencySymbol = $container.find('.total-price').data('currency');
|
||||
$container.find('.calculated-total').text(currencySymbol + total.toFixed(2));
|
||||
const formattedPrice = this.formatPrice(total);
|
||||
$container.find('.calculated-total').html(formattedPrice);
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marco Graetsch",
|
||||
"email": "marco@example.com"
|
||||
"email": "magdev3.0@gmail.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
|
||||
@@ -35,6 +35,21 @@ class Cart_Handler {
|
||||
add_action('woocommerce_before_calculate_totals', [$this, 'calculate_cart_item_price']);
|
||||
add_action('woocommerce_single_product_summary', [$this, 'render_product_selector'], 25);
|
||||
add_action('woocommerce_checkout_create_order_line_item', [$this->stock_manager, 'store_selected_products_in_order'], 10, 3);
|
||||
add_filter('woocommerce_is_purchasable', [$this, 'hide_default_add_to_cart'], 10, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide default WooCommerce add to cart button for composable products
|
||||
*
|
||||
* @param bool $is_purchasable Is purchasable status
|
||||
* @param \WC_Product $product Product object
|
||||
* @return bool
|
||||
*/
|
||||
public function hide_default_add_to_cart($is_purchasable, $product) {
|
||||
if ($product && $product->get_type() === 'composable') {
|
||||
return false;
|
||||
}
|
||||
return $is_purchasable;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -84,6 +84,7 @@ class Plugin {
|
||||
$this->twig->addFunction(new \Twig\TwigFunction('esc_html', 'esc_html'));
|
||||
$this->twig->addFunction(new \Twig\TwigFunction('esc_attr', 'esc_attr'));
|
||||
$this->twig->addFunction(new \Twig\TwigFunction('esc_url', 'esc_url'));
|
||||
$this->twig->addFunction(new \Twig\TwigFunction('wc_price', 'wc_price'));
|
||||
|
||||
// Add WordPress escaping functions as Twig filters
|
||||
$this->twig->addFilter(new \Twig\TwigFilter('esc_html', 'esc_html'));
|
||||
@@ -161,6 +162,13 @@ class Plugin {
|
||||
'max_items' => __('Maximum items selected', 'wc-composable-product'),
|
||||
'min_items' => __('Please select at least one item', 'wc-composable-product'),
|
||||
],
|
||||
'price_format' => [
|
||||
'currency_symbol' => get_woocommerce_currency_symbol(),
|
||||
'decimal_separator' => wc_get_price_decimal_separator(),
|
||||
'thousand_separator' => wc_get_price_thousand_separator(),
|
||||
'decimals' => wc_get_price_decimals(),
|
||||
'price_format' => get_woocommerce_price_format(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,8 @@ class Product_Selector {
|
||||
'show_prices' => $show_prices,
|
||||
'show_total' => $show_total,
|
||||
'fixed_price' => $product->get_price(),
|
||||
'fixed_price_html' => wc_price($product->get_price()),
|
||||
'zero_price_html' => wc_price(0),
|
||||
'currency_symbol' => get_woocommerce_currency_symbol(),
|
||||
];
|
||||
|
||||
|
||||
@@ -115,6 +115,7 @@ class Product_Type extends \WC_Product {
|
||||
|
||||
// Exclude composable products from selection
|
||||
$args['meta_query'] = [
|
||||
'relation' => 'AND',
|
||||
[
|
||||
'key' => '_product_type',
|
||||
'value' => 'composable',
|
||||
@@ -122,6 +123,11 @@ class Product_Type extends \WC_Product {
|
||||
],
|
||||
];
|
||||
|
||||
// Debug logging
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Composable Product Criteria: ' . print_r($criteria, true));
|
||||
}
|
||||
|
||||
switch ($criteria['type']) {
|
||||
case 'category':
|
||||
if (!empty($criteria['categories'])) {
|
||||
@@ -157,19 +163,59 @@ class Product_Type extends \WC_Product {
|
||||
break;
|
||||
}
|
||||
|
||||
// Debug logging
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Composable Product Query Args: ' . print_r($args, true));
|
||||
}
|
||||
|
||||
$query = new \WP_Query($args);
|
||||
$products = [];
|
||||
|
||||
// Debug logging
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Composable Product Query Found: ' . $query->found_posts . ' posts');
|
||||
}
|
||||
|
||||
if ($query->have_posts()) {
|
||||
foreach ($query->posts as $post) {
|
||||
$product = wc_get_product($post->ID);
|
||||
if ($product && $product->is_in_stock() && $product->is_purchasable()) {
|
||||
|
||||
if (!$product) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Handle variable products by including their variations
|
||||
if ($product->is_type('variable')) {
|
||||
// Get variation IDs directly from the product
|
||||
$variation_ids = $product->get_children();
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Variable product ' . $product->get_id() . ' has ' . count($variation_ids) . ' variations');
|
||||
}
|
||||
foreach ($variation_ids as $variation_id) {
|
||||
$variation = wc_get_product($variation_id);
|
||||
if ($variation && $variation->is_purchasable()) {
|
||||
$products[] = $variation;
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Added variation ' . $variation_id . ' - ' . $variation->get_name());
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif ($product->is_purchasable()) {
|
||||
// Simple and other product types
|
||||
$products[] = $product;
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Added simple product ' . $product->get_id() . ' - ' . $product->get_name());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wp_reset_postdata();
|
||||
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) {
|
||||
error_log('Total products available: ' . count($products));
|
||||
}
|
||||
|
||||
return $products;
|
||||
}
|
||||
|
||||
|
||||
BIN
languages/wc-composable-product-de_CH.mo
Normal file
BIN
languages/wc-composable-product-de_CH.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "übrig"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "An Lager"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Keine Produkte zur Auswahl verfügbar. Bitte konfigurieren Sie die Produktkriterien im Admin-Bereich."
|
||||
|
||||
BIN
languages/wc-composable-product-de_CH_informal.mo
Normal file
BIN
languages/wc-composable-product-de_CH_informal.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "übrig"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "An Lager"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Keine Produkte zur Auswahl verfügbar. Bitte konfiguriere die Produktkriterien im Admin-Bereich."
|
||||
|
||||
BIN
languages/wc-composable-product-de_DE.mo
Normal file
BIN
languages/wc-composable-product-de_DE.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "übrig"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "Auf Lager"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Keine Produkte zur Auswahl verfügbar. Bitte konfigurieren Sie die Produktkriterien im Admin-Bereich."
|
||||
|
||||
BIN
languages/wc-composable-product-de_DE_informal.mo
Normal file
BIN
languages/wc-composable-product-de_DE_informal.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "übrig"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "Auf Lager"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Keine Produkte zur Auswahl verfügbar. Bitte konfiguriere die Produktkriterien im Admin-Bereich."
|
||||
|
||||
BIN
languages/wc-composable-product-fr_CH.mo
Normal file
BIN
languages/wc-composable-product-fr_CH.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "restant"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "En stock"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Aucun produit disponible pour la sélection. Veuillez configurer les critères de produit dans le panneau d'administration."
|
||||
|
||||
BIN
languages/wc-composable-product-it_CH.mo
Normal file
BIN
languages/wc-composable-product-it_CH.mo
Normal file
Binary file not shown.
@@ -238,3 +238,7 @@ msgstr "rimasti"
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr "Disponibile"
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr "Nessun prodotto disponibile per la selezione. Si prega di configurare i criteri del prodotto nel pannello di amministrazione."
|
||||
|
||||
@@ -237,3 +237,7 @@ msgstr ""
|
||||
#: templates/product-selector.twig
|
||||
msgid "In stock"
|
||||
msgstr ""
|
||||
|
||||
#: templates/product-selector.twig
|
||||
msgid "No products available for selection. Please configure the product criteria in the admin panel."
|
||||
msgstr ""
|
||||
|
||||
BIN
releases/wc-composable-product-v1.1.10.zip
Normal file
BIN
releases/wc-composable-product-v1.1.10.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.10.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.10.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
271aad47684ee8318a8824861d5fc387 wc-composable-product-v1.1.10.zip
|
||||
1
releases/wc-composable-product-v1.1.10.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.10.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
63bfe97aa9fd98e74750786ed0e1579b069505e85558316f7042787994c856ac wc-composable-product-v1.1.10.zip
|
||||
BIN
releases/wc-composable-product-v1.1.11.zip
Normal file
BIN
releases/wc-composable-product-v1.1.11.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.11.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.11.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
63b105311dc1cc8ac67c05528ad02e30 wc-composable-product-v1.1.11.zip
|
||||
1
releases/wc-composable-product-v1.1.11.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.11.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
214002a28a0426b4d2423f234d1dff63e4a8e58c6301cbd6eaed8db670db88c6 wc-composable-product-v1.1.11.zip
|
||||
BIN
releases/wc-composable-product-v1.1.12.zip
Normal file
BIN
releases/wc-composable-product-v1.1.12.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.12.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.12.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
546b9f9dd4ef0ec174d574af301a7bbc wc-composable-product-v1.1.12.zip
|
||||
1
releases/wc-composable-product-v1.1.12.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.12.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
c445f1744d28cb53ef314f2dbb253aae31a7750f49f615f5c11a109274736f75 wc-composable-product-v1.1.12.zip
|
||||
BIN
releases/wc-composable-product-v1.1.13.zip
Normal file
BIN
releases/wc-composable-product-v1.1.13.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.13.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.13.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
49d0e5220e927a3b20c25ed5d475f72b wc-composable-product-v1.1.13.zip
|
||||
1
releases/wc-composable-product-v1.1.13.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.13.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
6011f23f19da9c61c1953f9de110d073bb594fa5e75bf9745d37f666e2869873 wc-composable-product-v1.1.13.zip
|
||||
BIN
releases/wc-composable-product-v1.1.14.zip
Normal file
BIN
releases/wc-composable-product-v1.1.14.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.14.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.14.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
7b8bbd9c1e0a5db59f89ae677f095430 wc-composable-product-v1.1.14.zip
|
||||
1
releases/wc-composable-product-v1.1.14.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.14.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
7c943fc5a85d5a48125aaf9f2e42434b370c4fa168ca33cd1e3485deb55302a5 wc-composable-product-v1.1.14.zip
|
||||
BIN
releases/wc-composable-product-v1.1.6.zip
Normal file
BIN
releases/wc-composable-product-v1.1.6.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.6.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.6.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
eae384e342450abd4ac83af0266ac764 wc-composable-product-v1.1.6.zip
|
||||
1
releases/wc-composable-product-v1.1.6.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.6.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
d64f4f5f1a00d392989cb613780e5726106a08c6aace08e0c74c80553a0b0f1e wc-composable-product-v1.1.6.zip
|
||||
BIN
releases/wc-composable-product-v1.1.7.zip
Normal file
BIN
releases/wc-composable-product-v1.1.7.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.7.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.7.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
871fbb3b910380c0e43bcf1538408eda releases/wc-composable-product-v1.1.7.zip
|
||||
1
releases/wc-composable-product-v1.1.7.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.7.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
866e7dd34431f4c881629fd8b59ddd3a27c7a45b7324a3d88cd064a3e01c1b83 releases/wc-composable-product-v1.1.7.zip
|
||||
BIN
releases/wc-composable-product-v1.1.8.zip
Normal file
BIN
releases/wc-composable-product-v1.1.8.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.8.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.8.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
78eee5eee4762c308c5d37d1aac06b04 wc-composable-product-v1.1.8.zip
|
||||
1
releases/wc-composable-product-v1.1.8.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.8.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
d7d06e2a5d336609249f803b681cdf270dbe60d6fc28bdd6c451c6744d2fdab6 wc-composable-product-v1.1.8.zip
|
||||
BIN
releases/wc-composable-product-v1.1.9.zip
Normal file
BIN
releases/wc-composable-product-v1.1.9.zip
Normal file
Binary file not shown.
1
releases/wc-composable-product-v1.1.9.zip.md5
Normal file
1
releases/wc-composable-product-v1.1.9.zip.md5
Normal file
@@ -0,0 +1 @@
|
||||
a5b08f3613d1b1e8aba0c2b7b82a1582 wc-composable-product-v1.1.9.zip
|
||||
1
releases/wc-composable-product-v1.1.9.zip.sha256
Normal file
1
releases/wc-composable-product-v1.1.9.zip.sha256
Normal file
@@ -0,0 +1 @@
|
||||
f9fc497c0531c7ea828e164137f3db6e0a2755b899690dfb7d6411baf0c7a65a wc-composable-product-v1.1.9.zip
|
||||
@@ -9,6 +9,11 @@
|
||||
</div>
|
||||
|
||||
<div class="composable-products-grid">
|
||||
{% if products is empty %}
|
||||
<div class="composable-no-products">
|
||||
<p>{{ __('No products available for selection. Please configure the product criteria in the admin panel.') }}</p>
|
||||
</div>
|
||||
{% else %}
|
||||
{% for product in products %}
|
||||
<div class="composable-product-item{% if not product.in_stock %} out-of-stock{% endif %}" data-product-id="{{ product.id }}" data-price="{{ product.price }}" data-stock-status="{{ product.stock_status }}">
|
||||
<div class="product-item-inner">
|
||||
@@ -52,16 +57,17 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% if show_total %}
|
||||
<div class="composable-total">
|
||||
<div class="total-label">{{ __('Total Price:') }}</div>
|
||||
<div class="total-price" data-currency="{{ currency_symbol }}">
|
||||
<div class="total-price" data-currency="{{ currency_symbol }}" data-fixed-price="{{ fixed_price }}">
|
||||
{% if pricing_mode == 'fixed' %}
|
||||
{{ currency_symbol }}{{ fixed_price }}
|
||||
{{ fixed_price_html|raw }}
|
||||
{% else %}
|
||||
<span class="calculated-total">{{ currency_symbol }}0.00</span>
|
||||
<span class="calculated-total">{{ zero_price_html|raw }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Plugin Name: WooCommerce Composable Products
|
||||
* Plugin URI: https://github.com/magdev/wc-composable-product
|
||||
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-composable-product
|
||||
* Description: Create composable products where customers select a limited number of items from a configurable set
|
||||
* Version: 1.1.6
|
||||
* Version: 1.1.14
|
||||
* Author: Marco Graetsch
|
||||
* Author URI: https://example.com
|
||||
* Author URI: https://src.bundespruefstelle.ch/magdev
|
||||
* License: GPL v3 or later
|
||||
* License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
||||
* Text Domain: wc-composable-product
|
||||
@@ -19,7 +20,7 @@
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
// Define plugin constants
|
||||
define('WC_COMPOSABLE_PRODUCT_VERSION', '1.1.6');
|
||||
define('WC_COMPOSABLE_PRODUCT_VERSION', '1.1.14');
|
||||
define('WC_COMPOSABLE_PRODUCT_FILE', __FILE__);
|
||||
define('WC_COMPOSABLE_PRODUCT_PATH', plugin_dir_path(__FILE__));
|
||||
define('WC_COMPOSABLE_PRODUCT_URL', plugin_dir_url(__FILE__));
|
||||
|
||||
Reference in New Issue
Block a user