You've already forked wc-tier-and-package-prices
Identified and fixed the actual root cause of duplicate settings page: automatic instantiation in settings file being executed multiple times. Root Cause Analysis: - Settings file ended with: return new WC_TPP_Settings(); - File is in Composer's classmap for autoloading - When autoloader loads class, it executes the entire file including instantiation - Each include/autoload created a NEW instance despite admin singleton pattern - Admin singleton prevented multiple admin instances but not multiple settings instances The Fix: - Removed automatic instantiation (return new) from settings file - Settings file now only contains class definition - Admin class explicitly creates instance: new WC_TPP_Settings() - Changed from include to require_once to prevent multiple file loads - Settings instance now created exactly once, when filter needs it Fixes: - Settings page rendering twice in WooCommerce backend - Multiple WC_TPP_Settings instances being created - Composer autoload triggering unintended instantiation Changes: - Removed line 145 from class-wc-tpp-settings.php (return new WC_TPP_Settings()) - Modified add_settings_page() to use require_once + explicit new - Settings file now side-effect free, safe for autoloading Technical Details: - Composer classmap autoloader includes files when class is referenced - Previous code had side effect (instantiation) on every include - New code separates class definition from instantiation - Instance creation now controlled explicitly by admin class - require_once ensures file loaded once even if accessed multiple times Updated Files: - includes/class-wc-tpp-settings.php (removed return new line) - includes/class-wc-tpp-admin.php (explicit instantiation) - wc-tier-and-package-prices.php (version 1.1.18) - composer.json (version 1.1.18) - CHANGELOG.md (v1.1.18 section) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
144 lines
5.3 KiB
PHP
144 lines
5.3 KiB
PHP
<?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);
|
|
}
|
|
}
|
|
}
|