From 8fc061433493dce45cffeee6c4163e756d58ab02 Mon Sep 17 00:00:00 2001 From: magdev Date: Wed, 31 Dec 2025 21:06:08 +0100 Subject: [PATCH] Fix critical Twig filter error in product selector template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed "Unknown 'esc_attr' filter" error that occurred when rendering the product selector template. The issue was caused by WordPress escaping functions being registered only as Twig functions, not filters. Changes: - Added TwigFilter registrations for esc_html, esc_attr, esc_url - Template now supports both filter syntax (|esc_attr) and function syntax - Fixes compatibility issues when other plugins use their own Twig instances - Version bump to 1.1.5 This resolves the bug documented in logs/fatal-errors-2025-12-31.log 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ includes/Plugin.php | 5 +++++ wc-composable-product.php | 4 ++-- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca82f43..cc1362b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,44 @@ 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.5] - 2025-12-31 + +### Fixed + +- **CRITICAL**: Fixed Twig template error "Unknown 'esc_attr' filter" when rendering product selector +- Template compatibility issue when other plugins (e.g., WooCommerce Tier and Package Prices) use Twig +- WordPress escaping functions now properly registered as both Twig functions AND filters + +### Technical + +- Added `TwigFilter` registrations for `esc_html`, `esc_attr`, and `esc_url` in `Plugin::init_twig()` +- Template can now use both syntax styles: `{{ value|esc_attr }}` (filter) and `{{ esc_attr(value) }}` (function) +- Prevents conflicts when multiple plugins bundle their own Twig installations + +### Notes + +- Previous versions only registered escaping functions as Twig functions, not filters +- Template used filter syntax (`|esc_attr`) which failed when parsed by external Twig instances +- Fix ensures compatibility regardless of which Twig instance processes the template + +## [1.1.4] - 2025-12-31 + +### Added + +- Fixed price field in Composable Options tab for easier price configuration +- JavaScript toggle to show/hide fixed price field based on selected pricing mode + +### Changed + +- Simplified pricing mode description text in admin interface +- Fixed price field now appears dynamically when "Fixed" pricing mode is selected + +### Technical + +- Added `_regular_price` field with `composable_fixed_price_field` CSS class in `Product_Data.php` +- Implemented `toggleFixedPriceField()` JavaScript function in `assets/js/admin.js` +- Progressive disclosure pattern improves admin UX by showing relevant fields only + ## [1.1.3] - 2024-12-31 ### Added diff --git a/includes/Plugin.php b/includes/Plugin.php index fd9cf29..ea46525 100644 --- a/includes/Plugin.php +++ b/includes/Plugin.php @@ -84,6 +84,11 @@ 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')); + + // Add WordPress escaping functions as Twig filters + $this->twig->addFilter(new \Twig\TwigFilter('esc_html', 'esc_html')); + $this->twig->addFilter(new \Twig\TwigFilter('esc_attr', 'esc_attr')); + $this->twig->addFilter(new \Twig\TwigFilter('esc_url', 'esc_url')); } /** diff --git a/wc-composable-product.php b/wc-composable-product.php index 1599c4e..ad8d266 100644 --- a/wc-composable-product.php +++ b/wc-composable-product.php @@ -3,7 +3,7 @@ * Plugin Name: WooCommerce Composable Products * Plugin URI: https://github.com/magdev/wc-composable-product * Description: Create composable products where customers select a limited number of items from a configurable set - * Version: 1.1.3 + * Version: 1.1.5 * Author: Marco Graetsch * Author URI: https://example.com * License: GPL v3 or later @@ -19,7 +19,7 @@ defined('ABSPATH') || exit; // Define plugin constants -define('WC_COMPOSABLE_PRODUCT_VERSION', '1.1.3'); +define('WC_COMPOSABLE_PRODUCT_VERSION', '1.1.5'); define('WC_COMPOSABLE_PRODUCT_FILE', __FILE__); define('WC_COMPOSABLE_PRODUCT_PATH', plugin_dir_path(__FILE__)); define('WC_COMPOSABLE_PRODUCT_URL', plugin_dir_url(__FILE__));