array(__CLASS__, 'sanitize_commission_rate') )); register_setting('wpdd_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'); add_settings_section( 'wpdd_general_settings', __('General Settings', 'wp-digital-download'), array(__CLASS__, 'general_section_callback'), 'wpdd_settings' ); add_settings_section( 'wpdd_paypal_settings', __('PayPal Settings', 'wp-digital-download'), array(__CLASS__, 'paypal_section_callback'), 'wpdd_settings' ); add_settings_section( 'wpdd_email_settings', __('Email Settings', 'wp-digital-download'), array(__CLASS__, 'email_section_callback'), 'wpdd_settings' ); add_settings_section( 'wpdd_download_settings', __('Download Settings', 'wp-digital-download'), array(__CLASS__, 'download_section_callback'), 'wpdd_settings' ); add_settings_section( 'wpdd_watermark_settings', __('Watermark Settings', 'wp-digital-download'), array(__CLASS__, 'watermark_section_callback'), 'wpdd_settings' ); self::add_general_fields(); self::add_paypal_fields(); self::add_email_fields(); self::add_download_fields(); self::add_watermark_fields(); } private static function add_general_fields() { add_settings_field( 'wpdd_currency', __('Currency', 'wp-digital-download'), array(__CLASS__, 'currency_field'), 'wpdd_settings', 'wpdd_general_settings', array( 'name' => 'wpdd_currency' ) ); add_settings_field( 'wpdd_enable_guest_checkout', __('Guest Checkout', 'wp-digital-download'), array(__CLASS__, 'checkbox_field'), 'wpdd_settings', 'wpdd_general_settings', array( 'name' => 'wpdd_enable_guest_checkout', 'label' => __('Allow guest customers to purchase without creating an account', 'wp-digital-download') ) ); add_settings_field( 'wpdd_commission_rate', __('Platform Commission Rate (%)', 'wp-digital-download'), array(__CLASS__, 'number_field'), 'wpdd_settings', 'wpdd_general_settings', array( 'name' => 'wpdd_commission_rate', 'description' => __('Platform commission rate from sales (0-100). Creators receive the remainder.', 'wp-digital-download'), 'min' => 0, 'max' => 100, 'step' => 0.01 ) ); add_settings_field( 'wpdd_payout_threshold', __('Automatic Payout Threshold ($)', 'wp-digital-download'), array(__CLASS__, 'number_field'), 'wpdd_settings', 'wpdd_general_settings', array( 'name' => 'wpdd_payout_threshold', 'description' => __('Minimum balance for automatic payouts (0 to disable)', 'wp-digital-download'), 'min' => 0, 'step' => 0.01 ) ); add_settings_field( 'wpdd_terms_page', __('Terms & Conditions Page', 'wp-digital-download'), array(__CLASS__, 'page_dropdown_field'), 'wpdd_settings', 'wpdd_general_settings', array('name' => 'wpdd_terms_page') ); add_settings_field( 'wpdd_privacy_page', __('Privacy Policy Page', 'wp-digital-download'), array(__CLASS__, 'page_dropdown_field'), 'wpdd_settings', 'wpdd_general_settings', array('name' => 'wpdd_privacy_page') ); } private static function add_paypal_fields() { add_settings_field( 'wpdd_paypal_mode', __('PayPal Mode', 'wp-digital-download'), array(__CLASS__, 'select_field'), 'wpdd_settings', 'wpdd_paypal_settings', array( 'name' => 'wpdd_paypal_mode', 'options' => array( 'sandbox' => __('Sandbox (Testing)', 'wp-digital-download'), 'live' => __('Live (Production)', 'wp-digital-download') ) ) ); add_settings_field( 'wpdd_paypal_client_id', __('PayPal Client ID', 'wp-digital-download'), array(__CLASS__, 'text_field'), 'wpdd_settings', 'wpdd_paypal_settings', array('name' => 'wpdd_paypal_client_id') ); add_settings_field( 'wpdd_paypal_secret', __('PayPal Secret', 'wp-digital-download'), array(__CLASS__, 'password_field'), 'wpdd_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() { add_settings_field( 'wpdd_admin_email', __('Admin Email', 'wp-digital-download'), array(__CLASS__, 'email_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_admin_email', 'description' => __('Email address for admin notifications', 'wp-digital-download') ) ); add_settings_field( 'wpdd_from_name', __('From Name', 'wp-digital-download'), array(__CLASS__, 'text_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_from_name', 'description' => __('Name shown in email headers', 'wp-digital-download') ) ); add_settings_field( 'wpdd_from_email', __('From Email', 'wp-digital-download'), array(__CLASS__, 'email_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_from_email', 'description' => __('Email address shown in email headers', 'wp-digital-download') ) ); add_settings_field( 'wpdd_smtp_enabled', __('Enable SMTP', 'wp-digital-download'), array(__CLASS__, 'checkbox_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_enabled', 'label' => __('Use SMTP for sending emails instead of PHP mail()', 'wp-digital-download') ) ); add_settings_field( 'wpdd_smtp_host', __('SMTP Host', 'wp-digital-download'), array(__CLASS__, 'text_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_host', 'description' => __('SMTP server hostname (e.g., smtp.gmail.com)', 'wp-digital-download') ) ); add_settings_field( 'wpdd_smtp_port', __('SMTP Port', 'wp-digital-download'), array(__CLASS__, 'number_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_port', 'description' => __('SMTP server port number (common ports: 25, 465, 587)', 'wp-digital-download'), 'min' => 1, 'max' => 65535 ) ); add_settings_field( 'wpdd_smtp_encryption', __('SMTP Encryption', 'wp-digital-download'), array(__CLASS__, 'select_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_encryption', 'options' => array( '' => __('None', 'wp-digital-download'), 'tls' => __('TLS', 'wp-digital-download'), 'ssl' => __('SSL', 'wp-digital-download') ), 'description' => __('Select encryption method - TLS is recommended for most providers', 'wp-digital-download') ) ); add_settings_field( 'wpdd_smtp_autodetect', __('Auto-Detect Settings', 'wp-digital-download'), array(__CLASS__, 'smtp_autodetect_field'), 'wpdd_settings', 'wpdd_email_settings', array() ); add_settings_field( 'wpdd_smtp_username', __('SMTP Username', 'wp-digital-download'), array(__CLASS__, 'text_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_username', 'description' => __('SMTP authentication username', 'wp-digital-download') ) ); add_settings_field( 'wpdd_smtp_password', __('SMTP Password', 'wp-digital-download'), array(__CLASS__, 'password_field'), 'wpdd_settings', 'wpdd_email_settings', array( 'name' => 'wpdd_smtp_password', 'description' => __('SMTP authentication password', 'wp-digital-download') ) ); } private static function add_download_fields() { add_settings_field( 'wpdd_default_download_limit', __('Default Download Limit', 'wp-digital-download'), array(__CLASS__, 'number_field'), 'wpdd_settings', 'wpdd_download_settings', array( 'name' => 'wpdd_default_download_limit', 'description' => __('Default number of downloads allowed per purchase (0 = unlimited)', 'wp-digital-download'), 'min' => 0 ) ); add_settings_field( 'wpdd_default_download_expiry', __('Default Download Expiry (days)', 'wp-digital-download'), array(__CLASS__, 'number_field'), 'wpdd_settings', 'wpdd_download_settings', array( 'name' => 'wpdd_default_download_expiry', 'description' => __('Default number of days downloads remain available (0 = never expires)', 'wp-digital-download'), 'min' => 0 ) ); add_settings_field( 'wpdd_file_access_method', __('File Access Method', 'wp-digital-download'), array(__CLASS__, 'select_field'), 'wpdd_settings', 'wpdd_download_settings', array( 'name' => 'wpdd_file_access_method', 'options' => array( 'direct' => __('Direct Download', 'wp-digital-download'), 'redirect' => __('Redirect to File', 'wp-digital-download'), 'force' => __('Force Download', 'wp-digital-download') ), 'description' => __('How files are delivered to customers', 'wp-digital-download') ) ); } private static function add_watermark_fields() { add_settings_field( 'wpdd_enable_watermark', __('Enable Watermarking', 'wp-digital-download'), array(__CLASS__, 'checkbox_field'), 'wpdd_settings', 'wpdd_watermark_settings', array( 'name' => 'wpdd_enable_watermark', 'label' => __('Enable watermarking for images and PDFs by default', 'wp-digital-download') ) ); add_settings_field( 'wpdd_watermark_text', __('Default Watermark Text', 'wp-digital-download'), array(__CLASS__, 'text_field'), 'wpdd_settings', 'wpdd_watermark_settings', array( 'name' => 'wpdd_watermark_text', 'description' => __('Available placeholders: {customer_name}, {customer_email}, {order_id}, {date}, {site_name}', 'wp-digital-download') ) ); } public static function render_settings_page() { $active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'general'; ?>
' . __('Configure basic plugin settings.', 'wp-digital-download') . ''; } public static function paypal_section_callback() { echo '' . __('Configure PayPal payment settings. You can get your API credentials from the PayPal Developer Dashboard.', 'wp-digital-download') . '
'; } public static function email_section_callback() { echo '' . __('Configure email settings for purchase notifications.', 'wp-digital-download') . '
'; } public static function download_section_callback() { echo '' . __('Configure default download and file protection settings.', 'wp-digital-download') . '
'; } public static function watermark_section_callback() { echo '' . __('Configure watermarking settings for images and PDF files.', 'wp-digital-download') . '
'; } public static function text_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); $description = isset($args['description']) ? $args['description'] : ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf( '', esc_attr($name), esc_attr($name), esc_attr($value) ); if ($description) { printf('%s
', esc_html($description)); } } public static function password_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); $description = isset($args['description']) ? $args['description'] : ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf( '', esc_attr($name), esc_attr($name), esc_attr($value) ); if ($description) { printf('%s
', esc_html($description)); } } public static function email_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); $description = isset($args['description']) ? $args['description'] : ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf( '', esc_attr($name), esc_attr($name), esc_attr($value) ); if ($description) { printf('%s
', esc_html($description)); } } public static function number_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); $description = isset($args['description']) ? $args['description'] : ''; $min = isset($args['min']) ? $args['min'] : 0; $max = isset($args['max']) ? $args['max'] : ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf( '', esc_attr($name), esc_attr($name), esc_attr($value), esc_attr($min), $max ? 'max="' . esc_attr($max) . '"' : '' ); if ($description) { printf('%s
', esc_html($description)); } } public static function checkbox_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, 0); $label = $args['label'] ?? ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf( '', esc_attr($name), esc_attr($name), checked($value, 1, false), esc_html($label) ); } public static function select_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); $options = $args['options'] ?? array(); $description = isset($args['description']) ? $args['description'] : ''; if (empty($name)) { echo 'Error: Field name not provided
'; return; } printf(''; if ($description) { printf('%s
', esc_html($description)); } } public static function currency_field($args) { $currencies = array( 'USD' => 'US Dollar ($)', 'EUR' => 'Euro (€)', 'GBP' => 'British Pound (£)', 'CAD' => 'Canadian Dollar (C$)', 'AUD' => 'Australian Dollar (A$)', 'JPY' => 'Japanese Yen (¥)' ); $args['options'] = $currencies; self::select_field($args); } public static function page_dropdown_field($args) { $name = $args['name'] ?? ''; $value = get_option($name, ''); if (empty($name)) { echo 'Error: Field name not provided
'; return; } wp_dropdown_pages(array( 'name' => $name, 'id' => $name, 'selected' => $value, 'show_option_none' => __('— Select —', 'wp-digital-download'), 'option_none_value' => '' )); } public static function smtp_autodetect_field($args) { ?>__('Plugin Constants', 'wp-digital-download'), 'value' => __('Not Loaded', 'wp-digital-download'), 'class' => 'wpdd-status-error' ); echo '