From 2b2c06794b983b33d97665c35e527c84eb43906e Mon Sep 17 00:00:00 2001 From: magdev Date: Mon, 22 Dec 2025 20:01:27 +0100 Subject: [PATCH] Release version 1.1.16 - Singleton pattern for settings page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed persistent duplicate settings page rendering by implementing proper singleton pattern for admin class and caching settings instance. Fixes: - Settings page still appearing twice despite v1.1.15 fix - Multiple instantiation of WC_TPP_Admin class - Duplicate creation of WC_TPP_Settings instances Changes: - Implemented singleton pattern for WC_TPP_Admin class - Added private static $instance property with get_instance() method - Made WC_TPP_Admin constructor private - Added static $settings_instance property to cache settings page - Modified add_settings_page() to check and reuse cached settings instance - Changed instantiation from new WC_TPP_Admin() to WC_TPP_Admin::get_instance() Technical Details: - Ensures only one WC_TPP_Admin instance exists throughout plugin lifecycle - Prevents duplicate filter registrations even if woocommerce_get_settings_pages called multiple times - Settings page object created once and reused on subsequent filter calls - Follows WordPress/WooCommerce best practices for singleton implementation Updated Files: - includes/class-wc-tpp-admin.php (singleton pattern implementation) - wc-tier-and-package-prices.php (version 1.1.16) - composer.json (version 1.1.16) - CHANGELOG.md (v1.1.16 section) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- CHANGELOG.md | 22 ++++++++++++++++++++++ composer.json | 2 +- includes/class-wc-tpp-admin.php | 19 ++++++++++++++++--- wc-tier-and-package-prices.php | 4 ++-- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 312ad0f..3deca9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,28 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.1.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 diff --git a/composer.json b/composer.json index 20aef7f..cb3e94d 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "magdev/wc-tier-package-prices", "description": "WooCommerce plugin for tier pricing and package prices with Twig templates", - "version": "1.1.15", + "version": "1.1.16", "type": "wordpress-plugin", "license": "GPL-2.0-or-later", "authors": [ diff --git a/includes/class-wc-tpp-admin.php b/includes/class-wc-tpp-admin.php index febeaf1..3bde1d0 100644 --- a/includes/class-wc-tpp-admin.php +++ b/includes/class-wc-tpp-admin.php @@ -10,7 +10,17 @@ if (!defined('ABSPATH')) { if (!class_exists('WC_TPP_Admin')) { class WC_TPP_Admin { - public function __construct() { + private static $instance = null; + private static $settings_instance = null; + + public static function get_instance() { + if (null === self::$instance) { + self::$instance = new self(); + } + return self::$instance; + } + + private function __construct() { add_filter('woocommerce_get_settings_pages', array($this, 'add_settings_page')); add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); } @@ -19,7 +29,10 @@ if (!class_exists('WC_TPP_Admin')) { * Add settings page to WooCommerce settings */ public function add_settings_page($settings) { - $settings[] = include WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php'; + if (null === self::$settings_instance) { + self::$settings_instance = include WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-settings.php'; + } + $settings[] = self::$settings_instance; return $settings; } @@ -31,5 +44,5 @@ if (!class_exists('WC_TPP_Admin')) { } } -new WC_TPP_Admin(); +WC_TPP_Admin::get_instance(); } diff --git a/wc-tier-and-package-prices.php b/wc-tier-and-package-prices.php index 953a676..505b7c3 100644 --- a/wc-tier-and-package-prices.php +++ b/wc-tier-and-package-prices.php @@ -4,7 +4,7 @@ * Plugin Name: WooCommerce Tier and Package Prices * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices * Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices - * Version: 1.1.15 + * Version: 1.1.16 * Author: Marco Graetsch * Author URI: https://src.bundespruefstelle.ch/magdev * Text Domain: wc-tier-package-prices @@ -23,7 +23,7 @@ if (!defined('ABSPATH')) { // Define plugin constants if (!defined('WC_TPP_VERSION')) { - define('WC_TPP_VERSION', '1.1.15'); + define('WC_TPP_VERSION', '1.1.16'); } if (!defined('WC_TPP_PLUGIN_DIR')) { define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));