/** * Plugin Name: Tint Quote Sender * Plugin URI: https://protintrva.com/plugins/tint-quote-sender * Description: Instant tint quote calculator with customizable vehicle types, packages, and lead capture * Version: 1.0.0 * Author: Aaron H. * Author URI: https://apcsplugins.com * License: GPL v2 or later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Text Domain: tint-quote-sender * Domain Path: /languages */ // Exit if accessed directly if (!defined('ABSPATH')) { exit; } // Define plugin constants define('TQS_VERSION', '1.0.0'); define('TQS_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('TQS_PLUGIN_URL', plugin_dir_url(__FILE__)); define('TQS_PLUGIN_BASENAME', plugin_basename(__FILE__)); /** * Main Plugin Class * * Handles plugin initialization, hooks, and core functionality */ final class Tint_Quote_Sender { /** * Single instance of the plugin * @var Tint_Quote_Sender */ private static $instance = null; /** * Get plugin instance * @return Tint_Quote_Sender */ public static function instance() { if (is_null(self::$instance)) { self::$instance = new self(); } return self::$instance; } /** * Constructor - Private to enforce singleton pattern */ private function __construct() { $this->includes(); $this->init_hooks(); } /** * Include required files * Modular structure for maintainability */ private function includes() { // Core classes require_once TQS_PLUGIN_DIR . 'includes/class-tqs-core.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-settings.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-shortcodes.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-frontend.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-admin.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-database.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-email.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-history.php'; require_once TQS_PLUGIN_DIR . 'includes/class-tqs-validation.php'; // Helper functions require_once TQS_PLUGIN_DIR . 'includes/tqs-functions.php'; } /** * Initialize WordPress hooks */ private function init_hooks() { // Activation/Deactivation hooks register_activation_hook(__FILE__, array($this, 'activate')); register_deactivation_hook(__FILE__, array($this, 'deactivate')); } /** * Plugin activation * Creates database tables and sets defaults */ public function activate() { // Load database class to create tables require_once TQS_PLUGIN_DIR . 'includes/class-tqs-database.php'; TQS_Database::install(); // Set default admin options TQS_Settings::set_defaults(); // Flush rewrite rules flush_rewrite_rules(); } /** * Plugin deactivation * Cleans up scheduled tasks */ public function deactivate() { // Clear any scheduled hooks (if we add cron jobs later) wp_clear_scheduled_hook('tqs_scheduled_cleanup'); // Flush rewrite rules flush_rewrite_rules(); } /** * Get TQS_Core instance * @return TQS_Core */ public function get_core() { return TQS_Core::instance(); } } /** * Initialize the plugin * Using function instead of direct class instantiation for hook compatibility */ function tint_quote_sender() { return Tint_Quote_Sender::instance(); } // Initialize the plugin on WordPress init add_action('plugins_loaded', 'tint_quote_sender'); /** * Helper function to escape output * @param string $text Text to escape * @return string Escaped text */ function tqs_esc($text) { echo esc_html(htmlspecialchars($text)); } /** * Helper function to escape and return * @param string $text Text to escape * @return string Escaped text */ function tqs_esc_attr($text) { return esc_attr($text); } /** * Helper function to sanitize email * @param string $email Email address * @return string Sanitized email */ function tqs_sanitize_email($email) { return sanitize_email($email); } /** * Helper function to sanitize phone * @param string $phone Phone number * @return string Sanitized phone */ function tqs_sanitize_phone($phone) { // Remove all non-numeric characters except +, -, (, ), and space return preg_replace('/[^0-9+\-\s()]/', '', $phone); } /** * Helper function to sanitize price * @param float $price Price value * @return float Sanitized price */ function tqs_sanitize_price($price) { return floatval(sanitize_text_field($price)); } // Load text domain for translations add_action('plugins_loaded', function() { load_plugin_textdomain('tint-quote-sender', false, dirname(TQS_PLUGIN_BASENAME) . '/languages'); });