Major improvements: Fix download limits, enhance license display, fix software filenames
Some checks failed
Create Release / build (push) Failing after 3s

🔧 Bug Fixes:
- Fixed download limits defaulting to 5 instead of 0 for unlimited downloads
- Fixed software license filename sanitization (spaces→dashes, dots→underscores, proper .zip extension)
- Software downloads now show as "Test-Plugin-v2-2-0.zip" instead of "Test Plugin v2.2.0"

 UI/UX Enhancements:
- Redesigned license key display to span full table width with FontAwesome copy icons
- Added responsive CSS styling for license key rows
- Integrated FontAwesome CDN for modern copy icons

🏗️ Architecture Improvements:
- Added comprehensive filename sanitization in both download handler and API paths
- Enhanced software license product handling for local package files
- Improved error handling and logging throughout download processes

📦 Infrastructure:
- Added Gitea workflows for automated releases on push to main
- Created comprehensive .gitignore excluding test files and browser automation
- Updated documentation with all recent improvements and technical insights

🔍 Technical Details:
- Software license products served from wp-content/uploads/wpdd-packages/
- Download flow: token → process_download_by_token() → process_download() → deliver_file()
- Dual path coverage for both API downloads and regular file delivery
- Version placeholder system for automated deployment

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-09 19:16:57 -07:00
parent 6d86d5ef4f
commit 4731637f33
28 changed files with 3709 additions and 156 deletions

View File

@@ -9,6 +9,54 @@ class WPDD_Settings {
public static function init() {
add_action('admin_menu', array(__CLASS__, 'add_settings_page'));
add_action('admin_init', array(__CLASS__, 'register_settings'));
// Ensure default settings are set
self::ensure_default_settings();
}
public static function ensure_default_settings() {
$defaults = array(
'wpdd_paypal_mode' => 'sandbox',
'wpdd_currency' => 'USD',
'wpdd_commission_rate' => 0,
'wpdd_payout_threshold' => 0,
'wpdd_earnings_holding_days' => 15,
'wpdd_enable_guest_checkout' => 1,
'wpdd_default_download_limit' => 5,
'wpdd_default_download_expiry' => 7,
'wpdd_enable_watermark' => 0,
'wpdd_file_access_method' => 'direct',
'wpdd_smtp_enabled' => 0,
'wpdd_smtp_port' => 587,
'wpdd_smtp_encryption' => 'tls'
);
foreach ($defaults as $option_name => $default_value) {
if (get_option($option_name) === false) {
add_option($option_name, $default_value);
}
}
// Ensure critical settings exist (but don't set default values)
$critical_settings = array(
'wpdd_paypal_client_id',
'wpdd_paypal_secret',
'wpdd_admin_email',
'wpdd_from_name',
'wpdd_from_email',
'wpdd_smtp_host',
'wpdd_smtp_username',
'wpdd_smtp_password',
'wpdd_watermark_text',
'wpdd_terms_page',
'wpdd_privacy_page'
);
foreach ($critical_settings as $setting) {
if (get_option($setting) === false) {
add_option($setting, '');
}
}
}
public static function add_settings_page() {
@@ -23,69 +71,80 @@ class WPDD_Settings {
}
public static function register_settings() {
register_setting('wpdd_settings', 'wpdd_paypal_mode');
register_setting('wpdd_settings', 'wpdd_paypal_client_id');
register_setting('wpdd_settings', 'wpdd_paypal_secret');
register_setting('wpdd_settings', 'wpdd_paypal_payout_email');
register_setting('wpdd_settings', 'wpdd_admin_email');
register_setting('wpdd_settings', 'wpdd_from_name');
register_setting('wpdd_settings', 'wpdd_from_email');
register_setting('wpdd_settings', 'wpdd_smtp_enabled');
register_setting('wpdd_settings', 'wpdd_smtp_host');
register_setting('wpdd_settings', 'wpdd_smtp_port');
register_setting('wpdd_settings', 'wpdd_smtp_username');
register_setting('wpdd_settings', 'wpdd_smtp_password');
register_setting('wpdd_settings', 'wpdd_smtp_encryption');
register_setting('wpdd_settings', 'wpdd_currency');
register_setting('wpdd_settings', 'wpdd_enable_guest_checkout');
register_setting('wpdd_settings', 'wpdd_default_download_limit');
register_setting('wpdd_settings', 'wpdd_default_download_expiry');
register_setting('wpdd_settings', 'wpdd_enable_watermark');
register_setting('wpdd_settings', 'wpdd_watermark_text');
register_setting('wpdd_settings', 'wpdd_terms_page');
register_setting('wpdd_settings', 'wpdd_privacy_page');
register_setting('wpdd_settings', 'wpdd_commission_rate', array(
// General Settings
register_setting('wpdd_general_settings', 'wpdd_currency');
register_setting('wpdd_general_settings', 'wpdd_enable_guest_checkout');
register_setting('wpdd_general_settings', 'wpdd_commission_rate', array(
'sanitize_callback' => array(__CLASS__, 'sanitize_commission_rate')
));
register_setting('wpdd_settings', 'wpdd_payout_threshold', array(
register_setting('wpdd_general_settings', 'wpdd_payout_threshold', array(
'sanitize_callback' => array(__CLASS__, 'sanitize_payout_threshold')
));
register_setting('wpdd_settings', 'wpdd_file_access_method');
register_setting('wpdd_settings', 'wpdd_disable_admin_bar');
register_setting('wpdd_general_settings', 'wpdd_earnings_holding_days', array(
'sanitize_callback' => array(__CLASS__, 'sanitize_holding_days')
));
register_setting('wpdd_general_settings', 'wpdd_terms_page');
register_setting('wpdd_general_settings', 'wpdd_privacy_page');
// PayPal Settings
register_setting('wpdd_paypal_settings', 'wpdd_paypal_mode');
register_setting('wpdd_paypal_settings', 'wpdd_paypal_client_id');
register_setting('wpdd_paypal_settings', 'wpdd_paypal_secret');
// Email Settings
register_setting('wpdd_email_settings', 'wpdd_admin_email');
register_setting('wpdd_email_settings', 'wpdd_from_name');
register_setting('wpdd_email_settings', 'wpdd_from_email');
register_setting('wpdd_email_settings', 'wpdd_smtp_enabled');
register_setting('wpdd_email_settings', 'wpdd_smtp_host');
register_setting('wpdd_email_settings', 'wpdd_smtp_port');
register_setting('wpdd_email_settings', 'wpdd_smtp_username');
register_setting('wpdd_email_settings', 'wpdd_smtp_password');
register_setting('wpdd_email_settings', 'wpdd_smtp_encryption');
// Download Settings
register_setting('wpdd_download_settings', 'wpdd_default_download_limit');
register_setting('wpdd_download_settings', 'wpdd_default_download_expiry');
register_setting('wpdd_download_settings', 'wpdd_file_access_method');
register_setting('wpdd_download_settings', 'wpdd_disable_admin_bar');
// Watermark Settings
register_setting('wpdd_watermark_settings', 'wpdd_enable_watermark');
register_setting('wpdd_watermark_settings', 'wpdd_watermark_text');
add_settings_section(
'wpdd_general_settings',
__('General Settings', 'wp-digital-download'),
array(__CLASS__, 'general_section_callback'),
'wpdd_settings'
'wpdd_general_settings'
);
add_settings_section(
'wpdd_paypal_settings',
__('PayPal Settings', 'wp-digital-download'),
array(__CLASS__, 'paypal_section_callback'),
'wpdd_settings'
'wpdd_paypal_settings'
);
add_settings_section(
'wpdd_email_settings',
__('Email Settings', 'wp-digital-download'),
array(__CLASS__, 'email_section_callback'),
'wpdd_settings'
'wpdd_email_settings'
);
add_settings_section(
'wpdd_download_settings',
__('Download Settings', 'wp-digital-download'),
array(__CLASS__, 'download_section_callback'),
'wpdd_settings'
'wpdd_download_settings'
);
add_settings_section(
'wpdd_watermark_settings',
__('Watermark Settings', 'wp-digital-download'),
array(__CLASS__, 'watermark_section_callback'),
'wpdd_settings'
'wpdd_watermark_settings'
);
self::add_general_fields();
@@ -100,7 +159,7 @@ class WPDD_Settings {
'wpdd_currency',
__('Currency', 'wp-digital-download'),
array(__CLASS__, 'currency_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array(
'name' => 'wpdd_currency'
@@ -111,7 +170,7 @@ class WPDD_Settings {
'wpdd_enable_guest_checkout',
__('Guest Checkout', 'wp-digital-download'),
array(__CLASS__, 'checkbox_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array(
'name' => 'wpdd_enable_guest_checkout',
@@ -123,7 +182,7 @@ class WPDD_Settings {
'wpdd_commission_rate',
__('Platform Commission Rate (%)', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array(
'name' => 'wpdd_commission_rate',
@@ -138,7 +197,7 @@ class WPDD_Settings {
'wpdd_payout_threshold',
__('Automatic Payout Threshold ($)', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array(
'name' => 'wpdd_payout_threshold',
@@ -148,11 +207,27 @@ class WPDD_Settings {
)
);
add_settings_field(
'wpdd_earnings_holding_days',
__('Earnings Holding Period (Days)', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_general_settings',
'wpdd_general_settings',
array(
'name' => 'wpdd_earnings_holding_days',
'description' => __('Number of days to hold earnings before making them available for payout (0 for immediate, 15 recommended for fraud protection)', 'wp-digital-download'),
'min' => 0,
'max' => 365,
'step' => 1,
'default' => 15
)
);
add_settings_field(
'wpdd_terms_page',
__('Terms & Conditions Page', 'wp-digital-download'),
array(__CLASS__, 'page_dropdown_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array('name' => 'wpdd_terms_page')
);
@@ -161,7 +236,7 @@ class WPDD_Settings {
'wpdd_privacy_page',
__('Privacy Policy Page', 'wp-digital-download'),
array(__CLASS__, 'page_dropdown_field'),
'wpdd_settings',
'wpdd_general_settings',
'wpdd_general_settings',
array('name' => 'wpdd_privacy_page')
);
@@ -172,7 +247,7 @@ class WPDD_Settings {
'wpdd_paypal_mode',
__('PayPal Mode', 'wp-digital-download'),
array(__CLASS__, 'select_field'),
'wpdd_settings',
'wpdd_paypal_settings',
'wpdd_paypal_settings',
array(
'name' => 'wpdd_paypal_mode',
@@ -187,7 +262,7 @@ class WPDD_Settings {
'wpdd_paypal_client_id',
__('PayPal Client ID', 'wp-digital-download'),
array(__CLASS__, 'text_field'),
'wpdd_settings',
'wpdd_paypal_settings',
'wpdd_paypal_settings',
array('name' => 'wpdd_paypal_client_id')
);
@@ -196,22 +271,11 @@ class WPDD_Settings {
'wpdd_paypal_secret',
__('PayPal Secret', 'wp-digital-download'),
array(__CLASS__, 'password_field'),
'wpdd_settings',
'wpdd_paypal_settings',
'wpdd_paypal_settings',
array('name' => 'wpdd_paypal_secret')
);
add_settings_field(
'wpdd_paypal_payout_email',
__('PayPal Payout Account Email', 'wp-digital-download'),
array(__CLASS__, 'email_field'),
'wpdd_settings',
'wpdd_paypal_settings',
array(
'name' => 'wpdd_paypal_payout_email',
'description' => __('PayPal account email that will send payouts to creators', 'wp-digital-download')
)
);
}
private static function add_email_fields() {
@@ -219,7 +283,7 @@ class WPDD_Settings {
'wpdd_admin_email',
__('Admin Email', 'wp-digital-download'),
array(__CLASS__, 'email_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_admin_email',
@@ -231,7 +295,7 @@ class WPDD_Settings {
'wpdd_from_name',
__('From Name', 'wp-digital-download'),
array(__CLASS__, 'text_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_from_name',
@@ -243,7 +307,7 @@ class WPDD_Settings {
'wpdd_from_email',
__('From Email', 'wp-digital-download'),
array(__CLASS__, 'email_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_from_email',
@@ -255,7 +319,7 @@ class WPDD_Settings {
'wpdd_smtp_enabled',
__('Enable SMTP', 'wp-digital-download'),
array(__CLASS__, 'checkbox_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_enabled',
@@ -267,7 +331,7 @@ class WPDD_Settings {
'wpdd_smtp_host',
__('SMTP Host', 'wp-digital-download'),
array(__CLASS__, 'text_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_host',
@@ -279,7 +343,7 @@ class WPDD_Settings {
'wpdd_smtp_port',
__('SMTP Port', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_port',
@@ -293,7 +357,7 @@ class WPDD_Settings {
'wpdd_smtp_encryption',
__('SMTP Encryption', 'wp-digital-download'),
array(__CLASS__, 'select_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_encryption',
@@ -310,7 +374,7 @@ class WPDD_Settings {
'wpdd_smtp_autodetect',
__('Auto-Detect Settings', 'wp-digital-download'),
array(__CLASS__, 'smtp_autodetect_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array()
);
@@ -319,7 +383,7 @@ class WPDD_Settings {
'wpdd_smtp_username',
__('SMTP Username', 'wp-digital-download'),
array(__CLASS__, 'text_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_username',
@@ -331,7 +395,7 @@ class WPDD_Settings {
'wpdd_smtp_password',
__('SMTP Password', 'wp-digital-download'),
array(__CLASS__, 'password_field'),
'wpdd_settings',
'wpdd_email_settings',
'wpdd_email_settings',
array(
'name' => 'wpdd_smtp_password',
@@ -345,7 +409,7 @@ class WPDD_Settings {
'wpdd_default_download_limit',
__('Default Download Limit', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_settings',
'wpdd_download_settings',
'wpdd_download_settings',
array(
'name' => 'wpdd_default_download_limit',
@@ -358,7 +422,7 @@ class WPDD_Settings {
'wpdd_default_download_expiry',
__('Default Download Expiry (days)', 'wp-digital-download'),
array(__CLASS__, 'number_field'),
'wpdd_settings',
'wpdd_download_settings',
'wpdd_download_settings',
array(
'name' => 'wpdd_default_download_expiry',
@@ -371,7 +435,7 @@ class WPDD_Settings {
'wpdd_file_access_method',
__('File Access Method', 'wp-digital-download'),
array(__CLASS__, 'select_field'),
'wpdd_settings',
'wpdd_download_settings',
'wpdd_download_settings',
array(
'name' => 'wpdd_file_access_method',
@@ -390,7 +454,7 @@ class WPDD_Settings {
'wpdd_enable_watermark',
__('Enable Watermarking', 'wp-digital-download'),
array(__CLASS__, 'checkbox_field'),
'wpdd_settings',
'wpdd_watermark_settings',
'wpdd_watermark_settings',
array(
'name' => 'wpdd_enable_watermark',
@@ -402,7 +466,7 @@ class WPDD_Settings {
'wpdd_watermark_text',
__('Default Watermark Text', 'wp-digital-download'),
array(__CLASS__, 'text_field'),
'wpdd_settings',
'wpdd_watermark_settings',
'wpdd_watermark_settings',
array(
'name' => 'wpdd_watermark_text',
@@ -434,25 +498,30 @@ class WPDD_Settings {
<div class="wpdd-settings-content">
<form method="post" action="options.php" class="wpdd-settings-form">
<?php
settings_fields('wpdd_settings');
// Use appropriate settings group for each tab
switch ($active_tab) {
case 'general':
settings_fields('wpdd_general_settings');
self::render_general_tab();
break;
case 'paypal':
settings_fields('wpdd_paypal_settings');
self::render_paypal_tab();
break;
case 'email':
settings_fields('wpdd_email_settings');
self::render_email_tab();
break;
case 'downloads':
settings_fields('wpdd_download_settings');
self::render_downloads_tab();
break;
case 'watermark':
settings_fields('wpdd_watermark_settings');
self::render_watermark_tab();
break;
default:
settings_fields('wpdd_general_settings');
self::render_general_tab();
}
@@ -951,22 +1020,22 @@ class WPDD_Settings {
private static function do_settings_sections_for_tab($section_id) {
global $wp_settings_sections, $wp_settings_fields;
if (!isset($wp_settings_sections['wpdd_settings'][$section_id])) {
if (!isset($wp_settings_sections[$section_id][$section_id])) {
return;
}
$section = $wp_settings_sections['wpdd_settings'][$section_id];
$section = $wp_settings_sections[$section_id][$section_id];
if (isset($section['callback']) && $section['callback']) {
call_user_func($section['callback'], $section);
}
if (!isset($wp_settings_fields['wpdd_settings'][$section_id])) {
if (!isset($wp_settings_fields[$section_id][$section_id])) {
return;
}
echo '<table class="form-table" role="presentation">';
do_settings_fields('wpdd_settings', $section_id);
do_settings_fields($section_id, $section_id);
echo '</table>';
}
@@ -990,4 +1059,16 @@ class WPDD_Settings {
}
return $value;
}
public static function sanitize_holding_days($input) {
$value = intval($input);
if ($value < 0) {
$value = 15;
add_settings_error('wpdd_earnings_holding_days', 'invalid_holding_days', __('Holding days cannot be negative. Set to 15 (recommended).', 'wp-digital-download'));
} elseif ($value > 365) {
$value = 365;
add_settings_error('wpdd_earnings_holding_days', 'invalid_holding_days', __('Holding days cannot exceed 365. Set to maximum (365).', 'wp-digital-download'));
}
return $value;
}
}