/**
 * Sets up and stores a new discount code
 *
 * @since 1.0
 * @param array $data Discount code data
 * @uses edd_store_discount()
 * @return void
 */
function edd_add_discount($data)
{
    if (!isset($data['edd-discount-nonce']) || !wp_verify_nonce($data['edd-discount-nonce'], 'edd_discount_nonce')) {
        return;
    }
    if (!current_user_can('manage_shop_discounts')) {
        wp_die(__('You do not have permission to create discount codes', 'easy-digital-downloads'), __('Error', 'easy-digital-downloads'), array('response' => 403));
    }
    // Setup the discount code details
    $posted = array();
    foreach ($data as $key => $value) {
        if ($key != 'edd-discount-nonce' && $key != 'edd-action' && $key != 'edd-redirect') {
            if (is_string($value) || is_int($value)) {
                $posted[$key] = strip_tags(addslashes($value));
            } elseif (is_array($value)) {
                $posted[$key] = array_map('absint', $value);
            }
        }
    }
    // Ensure this discount doesn't already exist
    if (!edd_get_discount_by_code($posted['code'])) {
        // Set the discount code's default status to active
        $posted['status'] = 'active';
        if (edd_store_discount($posted)) {
            wp_redirect(add_query_arg('edd-message', 'discount_added', $data['edd-redirect']));
            edd_die();
        } else {
            wp_redirect(add_query_arg('edd-message', 'discount_add_failed', $data['edd-redirect']));
            edd_die();
        }
    } else {
        wp_redirect(add_query_arg('edd-message', 'discount_exists', $data['edd-redirect']));
        edd_die();
    }
}
/**
 * Saves an edited discount
 *
 * @since 1.0
 * @param array $data Discount code data
 * @return void
 */
function edd_edit_discount($data)
{
    if (isset($data['edd-discount-nonce']) && wp_verify_nonce($data['edd-discount-nonce'], 'edd_discount_nonce')) {
        // Setup the discount code details
        $discount = array();
        foreach ($data as $key => $value) {
            if ($key != 'edd-discount-nonce' && $key != 'edd-action' && $key != 'discount-id' && $key != 'edd-redirect') {
                if (is_string($value) || is_int($value)) {
                    $discount[$key] = strip_tags(addslashes($value));
                } elseif (is_array($value)) {
                    $discount[$key] = array_map('absint', $value);
                }
            }
        }
        $old_discount = edd_get_discount_by_code($data['code']);
        $discount['uses'] = edd_get_discount_uses($old_discount->ID);
        if (edd_store_discount($discount, $data['discount-id'])) {
            wp_redirect(add_query_arg('edd-message', 'discount_updated', $data['edd-redirect']));
            edd_die();
        } else {
            wp_redirect(add_query_arg('edd-message', 'discount_update_failed', $data['edd-redirect']));
            edd_die();
        }
    }
}
/**
 * Sets up and stores a new discount code
 *
 * @since 1.0
 * @param array $data Discount code data
 * @uses edd_store_discount()
 * @return void
 */
function edd_add_discount($data)
{
    if (isset($data['edd-discount-nonce']) && wp_verify_nonce($data['edd-discount-nonce'], 'edd_discount_nonce')) {
        // Setup the discount code details
        $posted = array();
        foreach ($data as $key => $value) {
            if ($key != 'edd-discount-nonce' && $key != 'edd-action' && $key != 'edd-redirect') {
                if (is_string($value) || is_int($value)) {
                    $posted[$key] = strip_tags(addslashes($value));
                } elseif (is_array($value)) {
                    $posted[$key] = array_map('absint', $value);
                }
            }
        }
        // Ensure this discount doesn't already exist
        if (!edd_get_discount_by_code($posted['code'])) {
            // Set the discount code's default status to active
            $posted['status'] = 'active';
            if (edd_store_discount($posted)) {
                wp_redirect(add_query_arg('edd-message', 'discount_added', $data['edd-redirect']));
                edd_die();
            } else {
                wp_redirect(add_query_arg('edd-message', 'discount_add_failed', $data['edd-redirect']));
                edd_die();
            }
        } else {
            wp_redirect(add_query_arg('edd-message', 'discount_exists', $data['edd-redirect']));
            edd_die();
        }
    }
}
 public function generate_discount($email = '')
 {
     // Generate a 15 character code
     $code = substr(md5($email), 0, 15);
     if (edd_get_discount_by_code($code)) {
         return;
         // Discount already created
     }
     $details = array('name' => $email, 'code' => $code, 'max' => 1, 'amount' => '10', 'start' => '-1 day', 'expiration' => '+3 days', 'type' => 'percent', 'use_once' => true);
     $discount_id = edd_store_discount($details);
     return $code;
 }
/**
 * Get Discount By Code
 *
 * Retrieves a discount code ID from the code.
 *
 * @since       1.0
 * @param       $code string The discount code to retrieve an ID for
 * @return      int
 */
function edd_get_discount_id_by_code($code)
{
    $discount = edd_get_discount_by_code($code);
    if ($discount) {
        return $discount->ID;
    }
    return false;
}
/**
 * Validates the supplied discount sent via AJAX.
 *
 * @since 1.0
 * @return void
 */
function edd_ajax_apply_discount()
{
    if (isset($_POST['code'])) {
        $discount_code = sanitize_text_field($_POST['code']);
        $return = array('msg' => '', 'code' => $discount_code);
        $user = '';
        if (is_user_logged_in()) {
            $user = get_current_user_id();
        } else {
            parse_str($_POST['form'], $form);
            if (!empty($form['edd_email'])) {
                $user = urldecode($form['edd_email']);
            }
        }
        if (edd_is_discount_valid($discount_code, $user)) {
            $discount = edd_get_discount_by_code($discount_code);
            $amount = edd_format_discount_rate(edd_get_discount_type($discount->ID), edd_get_discount_amount($discount->ID));
            $discounts = edd_set_cart_discount($discount_code);
            $total = edd_get_cart_total($discounts);
            $return = array('msg' => 'valid', 'amount' => $amount, 'total_plain' => $total, 'total' => html_entity_decode(edd_currency_filter(edd_format_amount($total)), ENT_COMPAT, 'UTF-8'), 'code' => $discount_code, 'html' => edd_get_cart_discounts_html($discounts));
        } else {
            $errors = edd_get_errors();
            $return['msg'] = $errors['edd-discount-error'];
            edd_unset_error('edd-discount-error');
        }
        // Allow for custom discount code handling
        $return = apply_filters('edd_ajax_discount_response', $return);
        echo json_encode($return);
    }
    edd_die();
}
/**
 * Validates the supplied discount sent via AJAX.
 *
 * @since 1.0
 * @return void
 */
function edd_ajax_apply_discount()
{
    if (isset($_POST['code']) && check_ajax_referer('edd_checkout_nonce', 'nonce')) {
        $user = isset($_POST['user']) ? $_POST['user'] : $_POST['email'];
        $return = array('msg' => '', 'code' => $_POST['code']);
        if (edd_is_discount_used($_POST['code'], $user)) {
            // Called twice if discount is not used (again by edd_is_discount_valid) but allows for beter usr msg and less execution if discount is used.
            $return['msg'] = __('This discount code has been used already', 'edd');
        } else {
            if (edd_is_discount_valid($_POST['code'], $user)) {
                $discount = edd_get_discount_by_code($_POST['code']);
                $amount = edd_format_discount_rate(edd_get_discount_type($discount->ID), edd_get_discount_amount($discount->ID));
                $discounts = edd_set_cart_discount($_POST['code']);
                $total = edd_get_cart_total($discounts);
                $return = array('msg' => 'valid', 'amount' => $amount, 'total' => html_entity_decode(edd_currency_filter(edd_format_amount($total)), ENT_COMPAT, 'UTF-8'), 'code' => $_POST['code'], 'html' => edd_get_cart_discounts_html($discounts));
            } else {
                $return['msg'] = __('The discount you entered is invalid', 'edd');
            }
        }
        echo json_encode($return);
    }
    edd_die();
}
/**
 * Get Discount By Code
 *
 * Retrieves a discount code ID from the code.
 *
 * @access      public
 * @since       1.0
 * @param        $code string The discount code to retrieve an ID for
 * @return      int
 */
function edd_get_discount_id_by_code($code)
{
    return edd_get_discount_by_code($code)->ID;
}
/**
 * Validates the supplied discount sent via AJAX.
 *
 * @since 1.0
 * @return void
 */
function edd_ajax_apply_discount()
{
    if (isset($_POST['code'])) {
        $discount_code = $_POST['code'];
        $return = array('msg' => '', 'code' => $discount_code);
        if (edd_is_discount_valid($discount_code)) {
            $discount = edd_get_discount_by_code($discount_code);
            $amount = edd_format_discount_rate(edd_get_discount_type($discount->ID), edd_get_discount_amount($discount->ID));
            $discounts = edd_set_cart_discount($discount_code);
            $total = edd_get_cart_total($discounts);
            $return = array('msg' => 'valid', 'amount' => $amount, 'total_plain' => $total, 'total' => html_entity_decode(edd_currency_filter(edd_format_amount($total)), ENT_COMPAT, 'UTF-8'), 'code' => $_POST['code'], 'html' => edd_get_cart_discounts_html($discounts));
        } else {
            $errors = edd_get_errors();
            $return['msg'] = $errors['edd-discount-error'];
            edd_unset_error('edd-discount-error');
        }
        // Allow for custom discount code handling
        $return = apply_filters('edd_ajax_discount_response', $return);
        echo json_encode($return);
    }
    edd_die();
}
/**
 * Insert Payment
 *
 * @since 1.0
 * @param array $payment_data
 * @return bool true if payment is inserted, false otherwise
 */
function edd_insert_payment($payment_data = array())
{
    if (empty($payment_data)) {
        return false;
    }
    // Construct the payment title
    if (isset($payment_data['user_info']['first_name']) || isset($payment_data['user_info']['last_name'])) {
        $payment_title = $payment_data['user_info']['first_name'] . ' ' . $payment_data['user_info']['last_name'];
    } else {
        $payment_title = $payment_data['user_email'];
    }
    // Retrieve the ID of the discount used, if any
    if ($payment_data['user_info']['discount'] != 'none') {
        $discount = edd_get_discount_by_code($payment_data['user_info']['discount']);
    }
    $args = apply_filters('edd_insert_payment_args', array('post_title' => $payment_title, 'post_status' => isset($payment_data['status']) ? $payment_data['status'] : 'pending', 'post_type' => 'edd_payment', 'post_parent' => isset($payment_data['parent']) ? $payment_data['parent'] : null, 'post_date' => isset($payment_data['post_date']) ? $payment_data['post_date'] : null, 'post_date_gmt' => isset($payment_data['post_date']) ? $payment_data['post_date'] : null), $payment_data);
    // Create a blank payment
    $payment = wp_insert_post($args);
    if ($payment) {
        $payment_meta = array('currency' => $payment_data['currency'], 'downloads' => serialize($payment_data['downloads']), 'user_info' => serialize($payment_data['user_info']), 'cart_details' => serialize($payment_data['cart_details']), 'tax' => edd_is_cart_taxed() ? edd_get_cart_tax() : 0);
        $mode = edd_is_test_mode() ? 'test' : 'live';
        $gateway = isset($_POST['edd-gateway']) ? $_POST['edd-gateway'] : '';
        // Record the payment details
        update_post_meta($payment, '_edd_payment_meta', apply_filters('edd_payment_meta', $payment_meta, $payment_data));
        update_post_meta($payment, '_edd_payment_user_id', $payment_data['user_info']['id']);
        update_post_meta($payment, '_edd_payment_user_email', $payment_data['user_email']);
        update_post_meta($payment, '_edd_payment_user_ip', edd_get_ip());
        update_post_meta($payment, '_edd_payment_purchase_key', $payment_data['purchase_key']);
        update_post_meta($payment, '_edd_payment_total', $payment_data['price']);
        update_post_meta($payment, '_edd_payment_mode', $mode);
        update_post_meta($payment, '_edd_payment_gateway', $gateway);
        if (!empty($discount)) {
            update_post_meta($payment, '_edd_payment_discount_id', $discount->ID);
        }
        // Clear the user's purchased cache
        delete_transient('edd_user_' . $payment_data['user_info']['id'] . '_purchases');
        do_action('edd_insert_payment', $payment, $payment_data);
        return $payment;
        // Return the ID
    }
    // Return false if no payment was inserted
    return false;
}
Example #11
0
 /**
  * Create the NOD discount.
  *
  * This function generates the EDD Discount for the NOD offer using the preferences
  * that admin has defined in settings for expiry etc.
  * 
  * @params	int		$purchase_id	Required: The EDD purchase ID
  *
  * @return	obj|bool		The discount (WP_Post) object if successful, false on failure.
  */
 public function generate_discount($purchase_id)
 {
     $code = $this->generate_code();
     // Make sure the code does not already exist, otherwise create another
     if (edd_get_discount_by('code', $code)) {
         $code = $this->generate_code();
     }
     // Create the meta for the discount code
     $details = apply_filters('nod_discount_args', array('code' => $code, 'name' => __('NOD Discount for purchase ID ' . $purchase_id), 'status' => 'active', 'uses' => '', 'max' => '1', 'amount' => EDD_NOD()->settings->rate, 'start' => date('m/d/Y H:i:s'), 'expiration' => date('m/d/Y', strtotime("+" . EDD_NOD()->settings->expires)), 'type' => EDD_NOD()->settings->type, 'min_price' => '', 'product' => array(), 'product_condition' => '', 'excluded_products' => array(), 'not_global' => false, 'use_once' => '1'), $code, $purchase_id);
     // Before adding the new NOD discount code
     do_action('nod_before_nod_discount_code', $details);
     // Create the discount code. Return if unsuccessful.
     if (!edd_store_discount($details)) {
         return;
     }
     $discount = edd_get_discount_by_code($code);
     // After adding the new NOD discount code
     do_action('nod_after_nod_discount_code', $discount, $details);
     return !empty($discount) ? $discount : false;
 }