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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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;
}
}
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, 120Tasks:
Implementation:
1.2 Capability-Based Access Control
Current Issue: Missing capability checks in admin functions
Files:
admin/class-email-customizer-for-woocommerce-admin.php:285Tasks:
Implementation:
2. Code Structure Improvements
2.1 Error Handling System
Current Issue: No centralized error handling
Files: All PHP files lack proper error handling
Tasks:
Implementation:
2.2 Database Migration System
Current Issue: No database versioning or migration system
Files: Plugin lacks database management
Tasks:
Implementation:
3. Internationalization Fixes
3.1 Missing Text Domains
Current Issue: Hardcoded strings without text domains
Files:
admin/partials/wb-email-customizer-faq.php:38Tasks:
Implementation:
3.2 RTL Language Support
Tasks:
Implementation:
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:87Tasks:
Implementation:
4.2 Database Query Optimization
Tasks:
Implementation:
5. Basic Subscription Email Support
5.1 WooCommerce Subscriptions Detection
Tasks:
Implementation:
6. Mobile Responsiveness
6.1 Responsive Email Styles
Tasks:
Implementation: