admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wpdd_payouts'), 'confirm_payout' => __('Are you sure you want to process this payout?', 'wp-digital-download'), 'confirm_bulk' => __('Are you sure you want to process all selected payouts?', 'wp-digital-download') )); } public static function render_page() { global $wpdb; // Get filter parameters $status_filter = isset($_GET['status']) ? sanitize_text_field($_GET['status']) : 'pending'; $creator_filter = isset($_GET['creator']) ? intval($_GET['creator']) : 0; // Get creators with balance $creators = WPDD_Creator::get_creators_with_balance(); $currency = get_option('wpdd_currency', 'USD'); $threshold = floatval(get_option('wpdd_payout_threshold', 0)); // Get payout history $query = "SELECT p.*, u.display_name, u.user_email FROM {$wpdb->prefix}wpdd_payouts p INNER JOIN {$wpdb->users} u ON p.creator_id = u.ID WHERE 1=1"; if ($status_filter && $status_filter !== 'all') { $query .= $wpdb->prepare(" AND p.status = %s", $status_filter); } if ($creator_filter) { $query .= $wpdb->prepare(" AND p.creator_id = %d", $creator_filter); } $query .= " ORDER BY p.created_at DESC LIMIT 100"; $payouts = $wpdb->get_results($query); ?>

ID); $net_earnings = WPDD_Creator::get_creator_net_earnings($creator->ID); $can_payout = !empty($creator->paypal_email) && floatval($creator->balance) > 0; $auto_eligible = $threshold > 0 && floatval($creator->balance) >= $threshold; ?> >
display_name); ?>
user_email); ?>
paypal_email)) : ?> paypal_email); ?> balance, $currency); ?>
ID, 'wpdd_nonce'); ?>
0) : ?>

processed_by ? get_userdata($payout->processed_by) : null; ?>
created_at))); ?> processed_at) : ?>
processed_at))); ?>
display_name); ?>
user_email); ?>
amount, $payout->currency); ?> paypal_email); ?> transaction_id ?: '-'); ?> notes) : ?>
notes); ?>
status) { case 'completed': $status_class = 'notice-success'; break; case 'failed': $status_class = 'notice-error'; break; case 'pending': $status_class = 'notice-warning'; break; } ?> status)); ?> payout_method)); ?> display_name); ?> payout_method === 'automatic' ? __('System', 'wp-digital-download') : '-'; ?>

0) { $creators = WPDD_Creator::get_creators_with_balance(); foreach ($creators as $creator) { if (floatval($creator->balance) >= $threshold && !empty($creator->paypal_email)) { self::create_payout($creator->ID); } } } } else { // Process selected creators $creator_ids = isset($_POST['creator_ids']) ? array_map('intval', $_POST['creator_ids']) : array(); foreach ($creator_ids as $creator_id) { self::create_payout($creator_id); } } wp_redirect(admin_url('edit.php?post_type=wpdd_product&page=wpdd-payouts&message=success')); exit; } public static function create_payout($creator_id, $method = 'manual') { global $wpdb; $balance = WPDD_Creator::get_creator_balance($creator_id); $paypal_email = get_user_meta($creator_id, 'wpdd_paypal_email', true); if ($balance <= 0 || empty($paypal_email)) { return false; } $currency = get_option('wpdd_currency', 'USD'); $current_user_id = get_current_user_id(); // Create payout record $wpdb->insert( $wpdb->prefix . 'wpdd_payouts', array( 'creator_id' => $creator_id, 'amount' => $balance, 'currency' => $currency, 'paypal_email' => $paypal_email, 'status' => 'pending', 'payout_method' => $method, 'processed_by' => $current_user_id, 'created_at' => current_time('mysql') ), array('%d', '%f', '%s', '%s', '%s', '%s', '%d', '%s') ); $payout_id = $wpdb->insert_id; // Try to process via PayPal API $result = WPDD_PayPal_Payouts::process_payout($payout_id); if ($result['success']) { // Update payout status $wpdb->update( $wpdb->prefix . 'wpdd_payouts', array( 'status' => 'completed', 'transaction_id' => $result['transaction_id'], 'processed_at' => current_time('mysql') ), array('id' => $payout_id), array('%s', '%s', '%s'), array('%d') ); // Reset creator balance update_user_meta($creator_id, 'wpdd_creator_balance', 0); return true; } else { // Update with error $wpdb->update( $wpdb->prefix . 'wpdd_payouts', array( 'status' => 'failed', 'notes' => $result['error'] ), array('id' => $payout_id), array('%s', '%s'), array('%d') ); return false; } } }