Files
wc-tier-and-package-prices/wc-tier-and-package-prices.php

120 lines
3.7 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* 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
Release version 1.1.7 - Enhanced user experience features Added three new customer-facing features to improve product page interaction and tier pricing functionality. Features: - Optional text labels for tier pricing (similar to package labels) - Clickable tier pricing table rows to auto-populate quantity field - Add to Cart button auto-disables when quantity is 0 or less Enhanced User Experience: - Tier pricing rows now clickable with cursor pointer and hover animation - Clicking tier row sets quantity and smoothly scrolls to quantity field - Add to Cart button shows disabled state with reduced opacity - Tier labels display below quantity in italic gray text Technical Changes: - Added optional 'label' field to tier pricing admin meta box - Updated tier save logic to include label field (sanitized) - Enhanced tier pricing frontend template to display labels - Added click handler for tier pricing rows in frontend.js - Added updateAddToCartButton() function to manage button state - CSS: .wc-tpp-tier-label styling for tier labels - CSS: Clickable cursor and hover transform for tier rows - CSS: Disabled button styling (.single_add_to_cart_button:disabled) Updated Files: - templates/admin/tier-row.twig (added label field) - includes/class-wc-tpp-product-meta.php (save label, template update) - templates/frontend/tier-pricing-table.twig (display labels) - assets/js/frontend.js (tier row clicks, button disable logic) - assets/css/frontend.css (tier label style, clickable rows, disabled button) - wc-tier-and-package-prices.php (version 1.1.7) - composer.json (version 1.1.7) - CHANGELOG.md (v1.1.7 section) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 00:15:48 +01:00
* Version: 1.1.7
* Author: Marco Graetsch
* Author URI: https://src.bundespruefstelle.ch/magdev
* Text Domain: wc-tier-package-prices
* Domain Path: /languages
* Requires at least: 6.0
* Requires PHP: 7.4
* WC requires at least: 8.0
* WC tested up to: 10.0
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly
}
// Define plugin constants
Release version 1.1.7 - Enhanced user experience features Added three new customer-facing features to improve product page interaction and tier pricing functionality. Features: - Optional text labels for tier pricing (similar to package labels) - Clickable tier pricing table rows to auto-populate quantity field - Add to Cart button auto-disables when quantity is 0 or less Enhanced User Experience: - Tier pricing rows now clickable with cursor pointer and hover animation - Clicking tier row sets quantity and smoothly scrolls to quantity field - Add to Cart button shows disabled state with reduced opacity - Tier labels display below quantity in italic gray text Technical Changes: - Added optional 'label' field to tier pricing admin meta box - Updated tier save logic to include label field (sanitized) - Enhanced tier pricing frontend template to display labels - Added click handler for tier pricing rows in frontend.js - Added updateAddToCartButton() function to manage button state - CSS: .wc-tpp-tier-label styling for tier labels - CSS: Clickable cursor and hover transform for tier rows - CSS: Disabled button styling (.single_add_to_cart_button:disabled) Updated Files: - templates/admin/tier-row.twig (added label field) - includes/class-wc-tpp-product-meta.php (save label, template update) - templates/frontend/tier-pricing-table.twig (display labels) - assets/js/frontend.js (tier row clicks, button disable logic) - assets/css/frontend.css (tier label style, clickable rows, disabled button) - wc-tier-and-package-prices.php (version 1.1.7) - composer.json (version 1.1.7) - CHANGELOG.md (v1.1.7 section) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-22 00:15:48 +01:00
define('WC_TPP_VERSION', '1.1.7');
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('WC_TPP_PLUGIN_URL', plugin_dir_url(__FILE__));
define('WC_TPP_PLUGIN_BASENAME', plugin_basename(__FILE__));
// Load Composer autoloader
require_once WC_TPP_PLUGIN_DIR . 'vendor/autoload.php';
/**
* Check if WooCommerce is active
*/
if (!in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
add_action('admin_notices', 'wc_tpp_woocommerce_missing_notice');
return;
}
function wc_tpp_woocommerce_missing_notice() {
?>
<div class="notice notice-error">
<p><?php _e('WooCommerce Tier and Package Prices requires WooCommerce to be installed and active.', 'wc-tier-package-prices'); ?></p>
</div>
<?php
}
/**
* Main plugin class
*/
class WC_Tier_Package_Prices {
private static $instance = null;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_hooks();
$this->includes();
}
private function init_hooks() {
add_action('plugins_loaded', array($this, 'load_textdomain'));
add_action('before_woocommerce_init', array($this, 'declare_hpos_compatibility'));
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
}
private function includes() {
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-template-loader.php';
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-admin.php';
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-product-meta.php';
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-frontend.php';
require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-cart.php';
Release version 1.1.6 - Critical fix for plugin activation Fixed critical bug that prevented plugin activation in v1.1.3, v1.1.4, and v1.1.5. Root Cause: - WC_TPP_Cart and WC_TPP_Frontend classes were instantiated immediately when their files were loaded (via `new ClassName();` at bottom of files) - This happened BEFORE WooCommerce was fully loaded - Hook registration attempted to access WooCommerce functions before they existed - Result: Fatal error during plugin activation Solution: - Removed immediate instantiation from class-wc-tpp-cart.php (line 251) - Removed immediate instantiation from class-wc-tpp-frontend.php (line 186) - Added init_classes() method to main plugin class - Classes now instantiated via woocommerce_loaded hook - Ensures WooCommerce is fully initialized before any hooks are registered Changes: - includes/class-wc-tpp-cart.php - Removed `new WC_TPP_Cart();` - includes/class-wc-tpp-frontend.php - Removed `new WC_TPP_Frontend();` - wc-tier-and-package-prices.php - Added init_classes() and woocommerce_loaded hook - CHANGELOG.md - Added v1.1.6 section - composer.json - Version 1.1.6 - All translation files updated to 1.1.6 - All .mo files recompiled This fix ensures proper WordPress plugin lifecycle: 1. Plugin file loaded 2. Classes defined (but not instantiated) 3. WooCommerce loads 4. woocommerce_loaded hook fires 5. Classes instantiated with full WooCommerce availability 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 19:57:27 +01:00
// Instantiate classes after WooCommerce is loaded
add_action('woocommerce_loaded', array($this, 'init_classes'));
}
public function init_classes() {
new WC_TPP_Frontend();
new WC_TPP_Cart();
}
public function declare_hpos_compatibility() {
if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables', __FILE__, true);
}
}
public function load_textdomain() {
load_plugin_textdomain('wc-tier-package-prices', false, dirname(WC_TPP_PLUGIN_BASENAME) . '/languages');
}
public function activate() {
// Add default options
add_option('wc_tpp_enable_tier_pricing', 'yes');
add_option('wc_tpp_enable_package_pricing', 'yes');
add_option('wc_tpp_display_table', 'yes');
flush_rewrite_rules();
}
public function deactivate() {
flush_rewrite_rules();
}
}
// Initialize the plugin
function wc_tpp_init() {
return WC_Tier_Package_Prices::get_instance();
}
add_action('plugins_loaded', 'wc_tpp_init', 11);