post_type !== 'wpdd_product') { return false; } $price = get_post_meta($product_id, '_wpdd_price', true); $sale_price = get_post_meta($product_id, '_wpdd_sale_price', true); $is_free = get_post_meta($product_id, '_wpdd_is_free', true); $amount = $is_free ? 0 : (($sale_price && $sale_price < $price) ? $sale_price : $price); $order_number = 'WPDD-' . strtoupper(uniqid()); $customer_id = 0; if (is_user_logged_in()) { $current_user = wp_get_current_user(); $customer_id = $current_user->ID; $customer_email = $current_user->user_email; $customer_name = $current_user->display_name; } else { $customer_email = $customer_data['email']; $customer_name = $customer_data['name']; } $result = $wpdb->insert( $wpdb->prefix . 'wpdd_orders', array( 'order_number' => $order_number, 'product_id' => $product_id, 'customer_id' => $customer_id, 'creator_id' => $product->post_author, 'status' => ($payment_method === 'free' || $amount == 0) ? 'completed' : 'pending', 'payment_method' => $payment_method, 'amount' => $amount, 'currency' => 'USD', 'customer_email' => $customer_email, 'customer_name' => $customer_name, 'purchase_date' => current_time('mysql') ), array('%s', '%d', '%d', '%d', '%s', '%s', '%f', '%s', '%s', '%s', '%s') ); if ($result) { $order_id = $wpdb->insert_id; if ($payment_method === 'free' || $amount == 0) { self::complete_order($order_id); } return $order_id; } return false; } public static function complete_order($order_id, $transaction_id = null) { global $wpdb; $order = self::get_order($order_id); if (!$order) { return false; } $update_data = array( 'status' => 'completed' ); if ($transaction_id) { $update_data['transaction_id'] = $transaction_id; } $result = $wpdb->update( $wpdb->prefix . 'wpdd_orders', $update_data, array('id' => $order_id), array('%s', '%s'), array('%d') ); if ($result) { self::generate_download_link($order_id); self::send_order_emails($order_id); update_post_meta( $order->product_id, '_wpdd_sales_count', intval(get_post_meta($order->product_id, '_wpdd_sales_count', true)) + 1 ); do_action('wpdd_order_completed', $order_id); return true; } return false; } public static function get_order($order_id) { global $wpdb; if (is_numeric($order_id)) { return $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wpdd_orders WHERE id = %d", $order_id )); } else { return $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wpdd_orders WHERE order_number = %s", $order_id )); } } public static function get_orders($args = array()) { global $wpdb; $defaults = array( 'status' => '', 'customer_id' => 0, 'creator_id' => 0, 'product_id' => 0, 'limit' => 20, 'offset' => 0, 'orderby' => 'purchase_date', 'order' => 'DESC' ); $args = wp_parse_args($args, $defaults); $where = array('1=1'); if ($args['status']) { $where[] = $wpdb->prepare("status = %s", $args['status']); } if ($args['customer_id']) { $where[] = $wpdb->prepare("customer_id = %d", $args['customer_id']); } if ($args['creator_id']) { $where[] = $wpdb->prepare("creator_id = %d", $args['creator_id']); } if ($args['product_id']) { $where[] = $wpdb->prepare("product_id = %d", $args['product_id']); } $where_clause = implode(' AND ', $where); $query = $wpdb->prepare( "SELECT o.*, p.post_title as product_name, u.display_name as customer_display_name, c.display_name as creator_display_name FROM {$wpdb->prefix}wpdd_orders o LEFT JOIN {$wpdb->posts} p ON o.product_id = p.ID LEFT JOIN {$wpdb->users} u ON o.customer_id = u.ID LEFT JOIN {$wpdb->users} c ON o.creator_id = c.ID WHERE {$where_clause} ORDER BY {$args['orderby']} {$args['order']} LIMIT %d OFFSET %d", $args['limit'], $args['offset'] ); return $wpdb->get_results($query); } private static function generate_download_link($order_id) { global $wpdb; // Get the order to find the product $order = $wpdb->get_row($wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wpdd_orders WHERE id = %d", $order_id )); if (!$order) { return false; } // Get download limit from product settings $download_limit = get_post_meta($order->product_id, '_wpdd_download_limit', true); $download_limit = $download_limit ?: 0; // Default to 0 (unlimited) if not set // Get download expiry from product settings $download_expiry = get_post_meta($order->product_id, '_wpdd_download_expiry', true); $download_expiry = $download_expiry ?: 30; // Default to 30 days if not set $token = wp_hash(uniqid() . $order_id . time()); $expires_at = date('Y-m-d H:i:s', strtotime('+' . $download_expiry . ' days')); $wpdb->insert( $wpdb->prefix . 'wpdd_download_links', array( 'order_id' => $order_id, 'token' => $token, 'expires_at' => $expires_at, 'max_downloads' => $download_limit, 'created_at' => current_time('mysql') ), array('%d', '%s', '%s', '%d', '%s') ); return $token; } private static function send_order_emails($order_id) { $order = self::get_order($order_id); if (!$order) { return; } self::send_customer_email($order); self::send_creator_email($order); self::send_admin_email($order); } private static function send_customer_email($order) { global $wpdb; $product = get_post($order->product_id); $download_link = $wpdb->get_var($wpdb->prepare( "SELECT token FROM {$wpdb->prefix}wpdd_download_links WHERE order_id = %d ORDER BY id DESC LIMIT 1", $order->id )); $download_url = add_query_arg(array( 'wpdd_download_token' => $download_link ), home_url()); $subject = sprintf( __('Your purchase of %s from %s', 'wp-digital-download'), $product->post_title, get_bloginfo('name') ); $message = sprintf( __("Hi %s,\n\nThank you for your purchase!\n\n", 'wp-digital-download'), $order->customer_name ); $message .= sprintf(__("Order Number: %s\n", 'wp-digital-download'), $order->order_number); $message .= sprintf(__("Product: %s\n", 'wp-digital-download'), $product->post_title); if ($order->amount > 0) { $message .= sprintf(__("Amount: $%s\n", 'wp-digital-download'), number_format($order->amount, 2)); } $message .= "\n" . __("Download your product here:\n", 'wp-digital-download'); $message .= $download_url . "\n\n"; $message .= __("This download link will expire in 7 days.\n\n", 'wp-digital-download'); if ($order->customer_id) { $purchases_url = get_permalink(get_option('wpdd_purchases_page_id')); $message .= sprintf( __("You can also access your downloads anytime from your account:\n%s\n\n", 'wp-digital-download'), $purchases_url ); } $message .= sprintf(__("Best regards,\n%s", 'wp-digital-download'), get_bloginfo('name')); wp_mail($order->customer_email, $subject, $message); } private static function send_creator_email($order) { $creator = get_userdata($order->creator_id); if (!$creator) { return; } $product = get_post($order->product_id); $subject = sprintf( __('New sale: %s', 'wp-digital-download'), $product->post_title ); $message = sprintf( __("Hi %s,\n\nYou have a new sale!\n\n", 'wp-digital-download'), $creator->display_name ); $message .= sprintf(__("Product: %s\n", 'wp-digital-download'), $product->post_title); $message .= sprintf(__("Customer: %s\n", 'wp-digital-download'), $order->customer_name); $message .= sprintf(__("Amount: $%s\n", 'wp-digital-download'), number_format($order->amount, 2)); $message .= sprintf(__("Order Number: %s\n", 'wp-digital-download'), $order->order_number); $message .= "\n" . sprintf( __("View your sales dashboard:\n%s\n", 'wp-digital-download'), admin_url() ); wp_mail($creator->user_email, $subject, $message); } private static function send_admin_email($order) { $admin_email = get_option('wpdd_admin_email', get_option('admin_email')); if (!$admin_email) { return; } $product = get_post($order->product_id); $subject = sprintf( __('[%s] New Digital Download Sale', 'wp-digital-download'), get_bloginfo('name') ); $message = __("A new digital download sale has been completed.\n\n", 'wp-digital-download'); $message .= sprintf(__("Order Number: %s\n", 'wp-digital-download'), $order->order_number); $message .= sprintf(__("Product: %s\n", 'wp-digital-download'), $product->post_title); $message .= sprintf(__("Customer: %s (%s)\n", 'wp-digital-download'), $order->customer_name, $order->customer_email); $message .= sprintf(__("Amount: $%s\n", 'wp-digital-download'), number_format($order->amount, 2)); $message .= sprintf(__("Payment Method: %s\n", 'wp-digital-download'), $order->payment_method); if ($order->transaction_id) { $message .= sprintf(__("Transaction ID: %s\n", 'wp-digital-download'), $order->transaction_id); } wp_mail($admin_email, $subject, $message); } }