Skip to content

Priority Tasks #1

Description

@vapvarun

Email Customizer Plugin - Priority Tasks

1. Security Fixes

1.1 Input Validation & Sanitization

Current Issue: Missing nonce verification and input validation
Files: admin/class-email-customizer-for-woocommerce-admin.php:55, 120

Tasks:

  • Add nonce verification for all GET/POST requests
  • Create input validation class
  • Implement sanitization for all user inputs
  • Add rate limiting for AJAX requests

Implementation:

// Add to constructor in admin class
if (isset($_GET[$this->email_trigger])) {
    if (!wp_verify_nonce($_GET['_wpnonce'], 'email_customizer_preview_' . get_current_user_id())) {
        wp_die('Security check failed');
    }
    add_action('wp_print_styles', array($this, 'wb_email_customizer_remove_theme_styles'), 100);
}

// Create includes/class-input-validator.php
class Email_Customizer_Input_Validator {
    public static function validate_color($color) {
        return sanitize_hex_color($color) ?: '#000000';
    }
    
    public static function validate_font_size($size) {
        $size = absint($size);
        return ($size >= 8 && $size <= 72) ? $size : 14;
    }
    
    public static function validate_email($email) {
        return is_email($email) ? sanitize_email($email) : false;
    }
}

1.2 Capability-Based Access Control

Current Issue: Missing capability checks in admin functions
Files: admin/class-email-customizer-for-woocommerce-admin.php:285

Tasks:

  • Add capability checks to all admin methods
  • Create role-based access system
  • Implement permission constants

Implementation:

// Add to admin methods
public function wb_email_customizer_admin_options_page() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die(__('You do not have sufficient permissions.', 'email-customizer-for-woocommerce'));
    }
    // ... rest of method
}

// Create capability constants
class Email_Customizer_Capabilities {
    const MANAGE_EMAIL_TEMPLATES = 'manage_email_templates';
    const SEND_TEST_EMAILS = 'send_test_emails';
    const VIEW_EMAIL_SETTINGS = 'view_email_settings';
}

2. Code Structure Improvements

2.1 Error Handling System

Current Issue: No centralized error handling
Files: All PHP files lack proper error handling

Tasks:

  • Create error handler class
  • Implement logging system
  • Add user-friendly error messages
  • Set up error reporting

Implementation:

// Create includes/class-error-handler.php
class Email_Customizer_Error_Handler {
    const ERROR_LEVEL_CRITICAL = 'critical';
    const ERROR_LEVEL_WARNING = 'warning';
    const ERROR_LEVEL_INFO = 'info';
    
    private static $instance = null;
    private $log_file;
    
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function log_error($message, $level = self::ERROR_LEVEL_WARNING, $context = array()) {
        $timestamp = date('Y-m-d H:i:s');
        $log_entry = sprintf(
            "[%s] [%s] %s - Context: %s\n",
            $timestamp,
            strtoupper($level),
            $message,
            json_encode($context)
        );
        
        error_log($log_entry, 3, $this->log_file);
        
        if ($level === self::ERROR_LEVEL_CRITICAL) {
            $this->notify_admin($message, $context);
        }
    }
}

2.2 Database Migration System

Current Issue: No database versioning or migration system
Files: Plugin lacks database management

Tasks:

  • Create migration manager class
  • Implement version tracking
  • Add schema management
  • Create upgrade routines

Implementation:

// Create includes/class-database-manager.php
class Email_Customizer_Database_Manager {
    const DB_VERSION = '1.0.0';
    const DB_VERSION_OPTION = 'wec_db_version';
    
    public function check_database_version() {
        $current_version = get_option(self::DB_VERSION_OPTION, '0.0.0');
        
        if (version_compare($current_version, self::DB_VERSION, '<')) {
            $this->run_migrations($current_version);
        }
    }
    
    private function run_migrations($from_version) {
        global $wpdb;
        
        $migrations = $this->get_pending_migrations($from_version);
        
        foreach ($migrations as $migration) {
            if ($this->run_migration($migration)) {
                update_option(self::DB_VERSION_OPTION, self::DB_VERSION);
            }
        }
    }
}

3. Internationalization Fixes

3.1 Missing Text Domains

Current Issue: Hardcoded strings without text domains
Files: admin/partials/wb-email-customizer-faq.php:38

Tasks:

  • Audit all hardcoded strings
  • Add missing text domains
  • Create translation templates
  • Add contextual translations

Implementation:

// Fix in admin/partials/wb-email-customizer-faq.php
// Current:
echo esc_html('contact page.');

// Fixed:
echo esc_html__('contact page.', 'email-customizer-for-woocommerce');

// Add context for ambiguous translations
echo esc_html_x('Draft', 'email template status', 'email-customizer-for-woocommerce');

// Handle pluralization
echo esc_html(sprintf(
    _n('You have %d email template.', 'You have %d email templates.', $count, 'email-customizer-for-woocommerce'),
    $count
));

3.2 RTL Language Support

Tasks:

  • Create RTL stylesheets
  • Add directional CSS properties
  • Implement RTL-specific JavaScript

Implementation:

// Add to enqueue_styles method
public function enqueue_styles() {
    wp_enqueue_style($this->plugin_name, /* ... */);
    
    if (is_rtl()) {
        wp_enqueue_style(
            $this->plugin_name . '-rtl',
            plugin_dir_url(__FILE__) . 'css/email-customizer-admin-rtl.css',
            array($this->plugin_name),
            $this->version
        );
    }
}

4. Performance Optimizations

4.1 Asset Loading Optimization

Current Issue: Scripts/styles loaded on all admin pages
Files: admin/class-email-customizer-for-woocommerce-admin.php:87

Tasks:

  • Implement conditional loading
  • Add script dependencies management
  • Minify assets for production
  • Add cache busting

Implementation:

public function enqueue_scripts($hook) {
    // Only load on plugin pages
    $plugin_pages = array(
        'wbcomplugins',
        'wb-email-customizer-settings',
        'woocommerce_page_wc-settings'
    );
    
    if (!in_array(get_current_screen()->id, $plugin_pages) && 
        strpos($hook, 'email-customizer') === false) {
        return;
    }
    
    $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
    
    wp_enqueue_script(
        $this->plugin_name,
        plugin_dir_url(__FILE__) . "js/email-customizer{$suffix}.js",
        array('jquery'),
        $this->version,
        true
    );
}

4.2 Database Query Optimization

Tasks:

  • Implement query result caching
  • Optimize settings retrieval
  • Add lazy loading for templates

Implementation:

// Create includes/class-cache-manager.php
class Email_Customizer_Cache_Manager {
    const CACHE_GROUP = 'email_customizer';
    const CACHE_EXPIRY = 3600;
    
    public function get_cached_styles($template_id) {
        $cache_key = "styles_{$template_id}";
        return wp_cache_get($cache_key, self::CACHE_GROUP);
    }
    
    public function set_cached_styles($template_id, $styles) {
        $cache_key = "styles_{$template_id}";
        return wp_cache_set($cache_key, $styles, self::CACHE_GROUP, self::CACHE_EXPIRY);
    }
    
    public function flush_cache($template_id = null) {
        if ($template_id) {
            wp_cache_delete("styles_{$template_id}", self::CACHE_GROUP);
        } else {
            wp_cache_flush_group(self::CACHE_GROUP);
        }
    }
}

5. Basic Subscription Email Support

5.1 WooCommerce Subscriptions Detection

Tasks:

  • Add subscription plugin detection
  • Create subscription email hooks
  • Implement basic subscription templates

Implementation:

// Create includes/class-subscription-handler.php
class Email_Customizer_Subscription_Handler {
    public function __construct() {
        if ($this->is_subscriptions_active()) {
            add_action('init', array($this, 'init_subscription_emails'));
        }
    }
    
    private function is_subscriptions_active() {
        return class_exists('WC_Subscriptions');
    }
    
    public function init_subscription_emails() {
        add_filter('woocommerce_email_classes', array($this, 'add_subscription_emails'));
        add_action('woocommerce_subscription_status_updated', array($this, 'send_status_change_email'), 10, 3);
    }
    
    public function add_subscription_emails($email_classes) {
        $email_classes['WC_Email_Subscription_Renewal'] = include('emails/class-wc-email-subscription-renewal.php');
        $email_classes['WC_Email_Subscription_Cancelled'] = include('emails/class-wc-email-subscription-cancelled.php');
        return $email_classes;
    }
}

6. Mobile Responsiveness

6.1 Responsive Email Styles

Tasks:

  • Create mobile-first email CSS
  • Add responsive controls to customizer
  • Implement touch-friendly buttons

Implementation:

// Create includes/class-responsive-manager.php
class Email_Customizer_Responsive_Manager {
    public function add_responsive_styles($styles) {
        $mobile_width = get_option('woocommerce_email_mobile_width', '320');
        
        $responsive_css = "
            @media only screen and (max-width: {$mobile_width}px) {
                #template_container,
                #template_header,
                #template_body,
                #template_footer {
                    width: 100% !important;
                    min-width: 100% !important;
                }
                
                #template_header h1 {
                    font-size: " . (get_option('woocommerce_email_header_font_size', '30') * 0.8) . "px !important;
                }
                
                .wc-email-button {
                    display: block !important;
                    width: 100% !important;
                    padding: 15px 20px !important;
                    font-size: 16px !important;
                }
            }
        ";
        
        return $styles . $responsive_css;
    }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions