First Commit

This commit is contained in:
2025-08-28 19:35:28 -07:00
commit 5aa0777fd3
507 changed files with 158447 additions and 0 deletions

View File

@@ -0,0 +1,177 @@
<?php
if (!defined('ABSPATH')) {
exit;
}
class WPDD_Creator {
public static function init() {
add_action('show_user_profile', array(__CLASS__, 'add_profile_fields'));
add_action('edit_user_profile', array(__CLASS__, 'add_profile_fields'));
add_action('personal_options_update', array(__CLASS__, 'save_profile_fields'));
add_action('edit_user_profile_update', array(__CLASS__, 'save_profile_fields'));
add_action('user_register', array(__CLASS__, 'set_default_fields'));
add_action('wpdd_order_completed', array(__CLASS__, 'add_earnings_to_balance'));
}
public static function add_profile_fields($user) {
// Only show for creators and admins
if (!self::is_creator($user->ID) && !current_user_can('manage_options')) {
return;
}
?>
<h3><?php _e('Creator Payout Settings', 'wp-digital-download'); ?></h3>
<table class="form-table">
<tr>
<th><label for="wpdd_paypal_email"><?php _e('PayPal Email', 'wp-digital-download'); ?></label></th>
<td>
<input type="email" name="wpdd_paypal_email" id="wpdd_paypal_email"
value="<?php echo esc_attr(get_user_meta($user->ID, 'wpdd_paypal_email', true)); ?>"
class="regular-text" />
<p class="description"><?php _e('PayPal email address for receiving payouts', 'wp-digital-download'); ?></p>
</td>
</tr>
<?php if (current_user_can('manage_options')) : ?>
<tr>
<th><label><?php _e('Creator Balance', 'wp-digital-download'); ?></label></th>
<td>
<?php
$balance = self::get_creator_balance($user->ID);
$currency = get_option('wpdd_currency', 'USD');
echo '<strong>' . wpdd_format_price($balance, $currency) . '</strong>';
?>
<p class="description"><?php _e('Current unpaid earnings balance', 'wp-digital-download'); ?></p>
</td>
</tr>
<tr>
<th><label><?php _e('Total Earnings', 'wp-digital-download'); ?></label></th>
<td>
<?php
$total = self::get_creator_total_earnings($user->ID);
echo '<strong>' . wpdd_format_price($total, $currency) . '</strong>';
?>
<p class="description"><?php _e('Total lifetime earnings', 'wp-digital-download'); ?></p>
</td>
</tr>
<?php endif; ?>
</table>
<?php
}
public static function save_profile_fields($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return;
}
if (isset($_POST['wpdd_paypal_email'])) {
$email = sanitize_email($_POST['wpdd_paypal_email']);
if (!empty($email) && !is_email($email)) {
return;
}
update_user_meta($user_id, 'wpdd_paypal_email', $email);
}
}
public static function set_default_fields($user_id) {
if (self::is_creator($user_id)) {
update_user_meta($user_id, 'wpdd_creator_balance', 0);
update_user_meta($user_id, 'wpdd_total_earnings', 0);
}
}
public static function is_creator($user_id) {
$user = get_userdata($user_id);
return $user && in_array('wpdd_creator', (array) $user->roles);
}
public static function get_creator_balance($user_id) {
return floatval(get_user_meta($user_id, 'wpdd_creator_balance', true));
}
public static function get_creator_total_earnings($user_id) {
global $wpdb;
$total = $wpdb->get_var($wpdb->prepare(
"SELECT SUM(o.total)
FROM {$wpdb->prefix}wpdd_orders o
INNER JOIN {$wpdb->posts} p ON o.product_id = p.ID
WHERE p.post_author = %d
AND o.status = 'completed'",
$user_id
));
return floatval($total);
}
public static function get_creator_net_earnings($user_id) {
$total = self::get_creator_total_earnings($user_id);
$commission_rate = floatval(get_option('wpdd_commission_rate', 0));
$net = $total * (1 - ($commission_rate / 100));
return $net;
}
public static function add_earnings_to_balance($order_id) {
global $wpdb;
$order = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}wpdd_orders WHERE id = %d",
$order_id
));
if (!$order || $order->status !== 'completed') {
return;
}
$product = get_post($order->product_id);
if (!$product) {
return;
}
$creator_id = $product->post_author;
$commission_rate = floatval(get_option('wpdd_commission_rate', 0));
$creator_share = $order->total * (1 - ($commission_rate / 100));
// Update creator balance
$current_balance = self::get_creator_balance($creator_id);
update_user_meta($creator_id, 'wpdd_creator_balance', $current_balance + $creator_share);
// Log the earning
$wpdb->insert(
$wpdb->prefix . 'wpdd_creator_earnings',
array(
'creator_id' => $creator_id,
'order_id' => $order_id,
'product_id' => $order->product_id,
'sale_amount' => $order->total,
'commission_rate' => $commission_rate,
'creator_earning' => $creator_share,
'created_at' => current_time('mysql')
),
array('%d', '%d', '%d', '%f', '%f', '%f', '%s')
);
}
public static function get_creators_with_balance() {
global $wpdb;
$threshold = floatval(get_option('wpdd_payout_threshold', 0));
$query = "SELECT u.ID, u.display_name, u.user_email,
um1.meta_value as paypal_email,
um2.meta_value as balance
FROM {$wpdb->users} u
INNER JOIN {$wpdb->usermeta} um ON u.ID = um.user_id
LEFT JOIN {$wpdb->usermeta} um1 ON u.ID = um1.user_id AND um1.meta_key = 'wpdd_paypal_email'
LEFT JOIN {$wpdb->usermeta} um2 ON u.ID = um2.user_id AND um2.meta_key = 'wpdd_creator_balance'
WHERE um.meta_key = '{$wpdb->prefix}capabilities'
AND um.meta_value LIKE '%wpdd_creator%'
AND CAST(um2.meta_value AS DECIMAL(10,2)) > 0";
if ($threshold > 0) {
$query .= $wpdb->prepare(" AND CAST(um2.meta_value AS DECIMAL(10,2)) >= %f", $threshold);
}
return $wpdb->get_results($query);
}
}