Version Description
- Fix: Disable 3.0 payment gateway API gateways. Will be re-enabled after more vigorous testing.
- Fix: Check that $wpsc_cart->cart_items is an array, not an object.
- Fix: Improve shipping method property checks in wpsc_cart class. See #1683.
- Fix: Add asterix class to required fields for PayPal Pro 2.0.
- Fix: Ensure taxable checkbox can be unchecked. 3.9 regression. See #1685.
- Fix: Only show completed purchases in the user account area.
- Fix: Use is_email(), rather than a faulty regex, for checkout email field validation.
- Fix: More than a handful of faulty variables were referenced in wpsc_coupons.
- Fix: Function
wpsc_string_to_booleanwas essentially non functional. - Fix: Send country and state through to PayPal only if they actually exist.
- Fix: Broken theme-engine activation routine. Would always fail, running 1.0 engine.
Download this release
Release Info
| Developer | JustinSainton |
| Plugin | |
| Version | 3.9.1 |
| Comparing to | |
| See all releases | |
Code changes from version 3.9 to 3.9.1
- readme.txt +15 -1
- wp-shopping-cart.php +1 -1
- wpsc-admin/includes/display-items-functions.php +3 -0
- wpsc-admin/includes/product-functions.php +18 -9
- wpsc-components/merchant-core-v2/helpers/admin.php +4 -3
- wpsc-components/merchant-core-v3/classes/payment-gateway.php +3 -2
- wpsc-components/merchant-core-v3/gateways/paypal-express-checkout.php +1 -1
- wpsc-components/merchant-core-v3/gateways/paypal-pro.php +1 -1
- wpsc-components/theme-engine-v1/helpers/ajax.php +4 -2
- wpsc-components/theme-engine-v1/templates/functions/wpsc-user_log_functions.php +1 -1
- wpsc-core/js/wp-e-commerce.js +20 -16
- wpsc-core/wpsc-constants.php +3 -3
- wpsc-includes/cart-item.class.php +3 -3
- wpsc-includes/cart.class.php +13 -8
- wpsc-includes/checkout.class.php +4 -4
- wpsc-includes/coupons.class.php +55 -55
- wpsc-includes/purchase-log.helpers.php +6 -2
- wpsc-includes/wpsc-theme-engine-bootstrap.php +4 -2
- wpsc-merchants/paypal-pro.merchant.php +4 -4
- wpsc-merchants/paypal-standard.merchant.php +2 -2
readme.txt
CHANGED
|
@@ -4,7 +4,7 @@ Donate link: https://wpecommerce.org
|
|
| 4 |
Tags: e-commerce, wp-e-commerce, shop, cart, paypal, authorize, stock control, ecommerce, shipping, tax
|
| 5 |
Requires at least: 3.9
|
| 6 |
Tested up to: 4.1
|
| 7 |
-
Stable tag: 3.9
|
| 8 |
|
| 9 |
WP eCommerce is a free, powerful plugin that empowers you to sell anything online, quickly and easily.
|
| 10 |
|
|
@@ -36,6 +36,20 @@ After upgrading from earlier versions look for link "Update Store". This will up
|
|
| 36 |
|
| 37 |
== Changelog ==
|
| 38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
= 3.9 =
|
| 40 |
|
| 41 |
* Fix: Eliminate most usage of number-based inputs in product UI.
|
| 4 |
Tags: e-commerce, wp-e-commerce, shop, cart, paypal, authorize, stock control, ecommerce, shipping, tax
|
| 5 |
Requires at least: 3.9
|
| 6 |
Tested up to: 4.1
|
| 7 |
+
Stable tag: 3.9.1
|
| 8 |
|
| 9 |
WP eCommerce is a free, powerful plugin that empowers you to sell anything online, quickly and easily.
|
| 10 |
|
| 36 |
|
| 37 |
== Changelog ==
|
| 38 |
|
| 39 |
+
= 3.9.1 =
|
| 40 |
+
|
| 41 |
+
* Fix: Disable 3.0 payment gateway API gateways. Will be re-enabled after more vigorous testing.
|
| 42 |
+
* Fix: Check that $wpsc_cart->cart_items is an array, not an object.
|
| 43 |
+
* Fix: Improve shipping method property checks in wpsc_cart class. See [#1683](https://github.com/wp-e-commerce/WP-e-Commerce/issues/1683).
|
| 44 |
+
* Fix: Add asterix class to required fields for PayPal Pro 2.0.
|
| 45 |
+
* Fix: Ensure taxable checkbox can be unchecked. 3.9 regression. See [#1685](https://github.com/wp-e-commerce/WP-e-Commerce/issues/1685).
|
| 46 |
+
* Fix: Only show completed purchases in the user account area.
|
| 47 |
+
* Fix: Use is_email(), rather than a faulty regex, for checkout email field validation.
|
| 48 |
+
* Fix: More than a [handful of faulty variables](https://github.com/wp-e-commerce/WP-e-Commerce/commit/58f2d3ad9698ef496a27a701e5a926e412d55c05) were referenced in wpsc_coupons.
|
| 49 |
+
* Fix: Function `wpsc_string_to_boolean` was essentially non functional.
|
| 50 |
+
* Fix: Send country and state through to PayPal only if they actually exist.
|
| 51 |
+
* Fix: Broken theme-engine activation routine. Would always fail, running 1.0 engine.
|
| 52 |
+
|
| 53 |
= 3.9 =
|
| 54 |
|
| 55 |
* Fix: Eliminate most usage of number-based inputs in product UI.
|
wp-shopping-cart.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
* Plugin Name: WP eCommerce
|
| 4 |
* Plugin URI: http://wpecommerce.org/
|
| 5 |
* Description: A plugin that provides a WordPress Shopping Cart. See also: <a href="http://wpecommerce.org" target="_blank">WPeCommerce.org</a> | <a href="https://wordpress.org/support/plugin/wp-e-commerce/" target="_blank">Support Forum</a> | <a href="http://docs.wpecommerce.org/" target="_blank">Documentation</a>
|
| 6 |
-
* Version: 3.9
|
| 7 |
* Author: WP eCommerce
|
| 8 |
* Author URI: http://wpecommerce.org/
|
| 9 |
**/
|
| 3 |
* Plugin Name: WP eCommerce
|
| 4 |
* Plugin URI: http://wpecommerce.org/
|
| 5 |
* Description: A plugin that provides a WordPress Shopping Cart. See also: <a href="http://wpecommerce.org" target="_blank">WPeCommerce.org</a> | <a href="https://wordpress.org/support/plugin/wp-e-commerce/" target="_blank">Support Forum</a> | <a href="http://docs.wpecommerce.org/" target="_blank">Documentation</a>
|
| 6 |
+
* Version: 3.9.1
|
| 7 |
* Author: WP eCommerce
|
| 8 |
* Author URI: http://wpecommerce.org/
|
| 9 |
**/
|
wpsc-admin/includes/display-items-functions.php
CHANGED
|
@@ -472,6 +472,9 @@ function wpsc_product_taxes_forms() {
|
|
| 472 |
}
|
| 473 |
|
| 474 |
echo $output;
|
|
|
|
|
|
|
|
|
|
| 475 |
}
|
| 476 |
|
| 477 |
function wpsc_product_variation_forms() {
|
| 472 |
}
|
| 473 |
|
| 474 |
echo $output;
|
| 475 |
+
|
| 476 |
+
wp_nonce_field( 'update', 'wpsc_product_tax_nonce' );
|
| 477 |
+
|
| 478 |
}
|
| 479 |
|
| 480 |
function wpsc_product_variation_forms() {
|
wpsc-admin/includes/product-functions.php
CHANGED
|
@@ -18,13 +18,10 @@ function wpsc_get_max_upload_size(){
|
|
| 18 |
* @return nothing
|
| 19 |
*/
|
| 20 |
function wpsc_admin_submit_product( $post_ID, $post ) {
|
| 21 |
-
if ( ! is_admin() )
|
| 22 |
-
return;
|
| 23 |
-
|
| 24 |
-
global $wpdb;
|
| 25 |
|
| 26 |
-
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_type != 'wpsc-product' )
|
| 27 |
return;
|
|
|
|
| 28 |
|
| 29 |
//Type-casting ( not so much sanitization, which would be good to do )
|
| 30 |
$post_data = stripslashes_deep( $_POST );
|
|
@@ -36,6 +33,7 @@ function wpsc_admin_submit_product( $post_ID, $post ) {
|
|
| 36 |
$post_data['meta'] = (array) $_POST['meta'];
|
| 37 |
}
|
| 38 |
|
|
|
|
| 39 |
if ( isset( $post_data['meta']['_wpsc_price'] ) )
|
| 40 |
$post_data['meta']['_wpsc_price'] = wpsc_string_to_float( $post_data['meta']['_wpsc_price'] );
|
| 41 |
|
|
@@ -138,10 +136,19 @@ function wpsc_admin_submit_product( $post_ID, $post ) {
|
|
| 138 |
$post_data['meta']['_wpsc_product_metadata']['shipping']['international'] = wpsc_string_to_float( $post_data['meta']['_wpsc_product_metadata']['shipping']['international'] );
|
| 139 |
}
|
| 140 |
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
// External Link Options
|
| 147 |
if ( isset( $_POST['wpsc_product_external_link_nonce'] ) && wp_verify_nonce( $_POST['wpsc_product_external_link_nonce'], 'update' ) ) {
|
|
@@ -188,6 +195,7 @@ function wpsc_admin_submit_product( $post_ID, $post ) {
|
|
| 188 |
'engraved' => 0,
|
| 189 |
'can_have_uploaded_image' => 0
|
| 190 |
) );
|
|
|
|
| 191 |
$post_data['meta']['_wpsc_product_metadata'] = wp_parse_args( $post_data['meta']['_wpsc_product_metadata'], $default_meta_values );
|
| 192 |
|
| 193 |
$post_data['files'] = $_FILES;
|
|
@@ -238,6 +246,7 @@ function wpsc_admin_submit_product( $post_ID, $post ) {
|
|
| 238 |
// and the custom meta
|
| 239 |
wpsc_update_custom_meta($product_id, $post_data);
|
| 240 |
|
|
|
|
| 241 |
// Update the alternative currencies
|
| 242 |
if ( isset( $post_data['wpsc-update-currency-layers'] ) && wp_verify_nonce( $post_data['wpsc-update-currency-layers'], 'update-options' ) ) {
|
| 243 |
|
| 18 |
* @return nothing
|
| 19 |
*/
|
| 20 |
function wpsc_admin_submit_product( $post_ID, $post ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
+
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_type != 'wpsc-product' ) {
|
| 23 |
return;
|
| 24 |
+
}
|
| 25 |
|
| 26 |
//Type-casting ( not so much sanitization, which would be good to do )
|
| 27 |
$post_data = stripslashes_deep( $_POST );
|
| 33 |
$post_data['meta'] = (array) $_POST['meta'];
|
| 34 |
}
|
| 35 |
|
| 36 |
+
|
| 37 |
if ( isset( $post_data['meta']['_wpsc_price'] ) )
|
| 38 |
$post_data['meta']['_wpsc_price'] = wpsc_string_to_float( $post_data['meta']['_wpsc_price'] );
|
| 39 |
|
| 136 |
$post_data['meta']['_wpsc_product_metadata']['shipping']['international'] = wpsc_string_to_float( $post_data['meta']['_wpsc_product_metadata']['shipping']['international'] );
|
| 137 |
}
|
| 138 |
|
| 139 |
+
// Update product taxes
|
| 140 |
+
if ( isset( $_POST['wpsc_product_tax_nonce'] ) && wp_verify_nonce( $_POST['wpsc_product_tax_nonce'], 'update' ) ) {
|
| 141 |
+
|
| 142 |
+
$post_data['meta']['_wpsc_product_metadata'] = wp_parse_args( $post_data['meta']['_wpsc_product_metadata'], array(
|
| 143 |
+
'wpec_taxes_taxable_amount' => '',
|
| 144 |
+
'wpec_taxes_taxable' => ''
|
| 145 |
+
) );
|
| 146 |
+
if ( ! empty( $post_data['meta']['_wpsc_product_metadata']['wpec_taxes_taxable_amount'] ) ) {
|
| 147 |
+
$post_data['meta']['_wpsc_product_metadata']['wpec_taxes_taxable_amount'] = wpsc_string_to_float($post_data['meta']['_wpsc_product_metadata']['wpec_taxes_taxable_amount'] );
|
| 148 |
+
}
|
| 149 |
+
$post_data['meta']['_wpsc_product_metadata']['wpec_taxes_taxable'] = $post_data['meta']['_wpsc_product_metadata']['wpec_taxes_taxable'];
|
| 150 |
+
|
| 151 |
+
}
|
| 152 |
|
| 153 |
// External Link Options
|
| 154 |
if ( isset( $_POST['wpsc_product_external_link_nonce'] ) && wp_verify_nonce( $_POST['wpsc_product_external_link_nonce'], 'update' ) ) {
|
| 195 |
'engraved' => 0,
|
| 196 |
'can_have_uploaded_image' => 0
|
| 197 |
) );
|
| 198 |
+
|
| 199 |
$post_data['meta']['_wpsc_product_metadata'] = wp_parse_args( $post_data['meta']['_wpsc_product_metadata'], $default_meta_values );
|
| 200 |
|
| 201 |
$post_data['files'] = $_FILES;
|
| 246 |
// and the custom meta
|
| 247 |
wpsc_update_custom_meta($product_id, $post_data);
|
| 248 |
|
| 249 |
+
|
| 250 |
// Update the alternative currencies
|
| 251 |
if ( isset( $post_data['wpsc-update-currency-layers'] ) && wp_verify_nonce( $post_data['wpsc-update-currency-layers'], 'update-options' ) ) {
|
| 252 |
|
wpsc-components/merchant-core-v2/helpers/admin.php
CHANGED
|
@@ -30,6 +30,7 @@ add_filter(
|
|
| 30 |
* Filters deprecated gateways out of available gateways list.
|
| 31 |
*
|
| 32 |
* Only occurs if there is a 3.0 API replacement for the gateway and it is not currently active.
|
|
|
|
| 33 |
*
|
| 34 |
* @since 3.9.0
|
| 35 |
*
|
|
@@ -39,9 +40,9 @@ add_filter(
|
|
| 39 |
function wpsc_filter_deprecated_v2_gateways( $gateways ) {
|
| 40 |
|
| 41 |
$deprecated_gateways = array(
|
| 42 |
-
'
|
| 43 |
-
'
|
| 44 |
-
'
|
| 45 |
);
|
| 46 |
|
| 47 |
// Loops through available gateways, checks if available gateway is both inactive and deprecated, and removes it.
|
| 30 |
* Filters deprecated gateways out of available gateways list.
|
| 31 |
*
|
| 32 |
* Only occurs if there is a 3.0 API replacement for the gateway and it is not currently active.
|
| 33 |
+
* Note: Pro Hosted and Pro are not the same thing.
|
| 34 |
*
|
| 35 |
* @since 3.9.0
|
| 36 |
*
|
| 40 |
function wpsc_filter_deprecated_v2_gateways( $gateways ) {
|
| 41 |
|
| 42 |
$deprecated_gateways = array(
|
| 43 |
+
'manual',
|
| 44 |
+
'paypal-pro',
|
| 45 |
+
'paypal-express-checkout'
|
| 46 |
);
|
| 47 |
|
| 48 |
// Loops through available gateways, checks if available gateway is both inactive and deprecated, and removes it.
|
wpsc-components/merchant-core-v3/classes/payment-gateway.php
CHANGED
|
@@ -222,8 +222,9 @@ final class WPSC_Payment_Gateways {
|
|
| 222 |
}
|
| 223 |
|
| 224 |
/**
|
| 225 |
-
* Updates the payment gateway cache when it's changed.
|
| 226 |
-
*
|
|
|
|
| 227 |
*
|
| 228 |
* @access public
|
| 229 |
* @static
|
| 222 |
}
|
| 223 |
|
| 224 |
/**
|
| 225 |
+
* Updates the payment gateway cache when it's changed.
|
| 226 |
+
*
|
| 227 |
+
* This function is hooked into WordPress' wp_loaded action
|
| 228 |
*
|
| 229 |
* @access public
|
| 230 |
* @static
|
wpsc-components/merchant-core-v3/gateways/paypal-express-checkout.php
CHANGED
|
@@ -552,7 +552,7 @@ class WPSC_Payment_Gateway_Paypal_Express_Checkout extends WPSC_Payment_Gateway
|
|
| 552 |
</tr>
|
| 553 |
|
| 554 |
<!-- Currency Conversion -->
|
| 555 |
-
<?php if ( ! $this->is_currency_supported() ): ?>
|
| 556 |
<tr>
|
| 557 |
<td colspan="2">
|
| 558 |
<h4><?php _e( 'Currency Conversion', 'wpsc' ); ?></h4>
|
| 552 |
</tr>
|
| 553 |
|
| 554 |
<!-- Currency Conversion -->
|
| 555 |
+
<?php if ( ! $this->is_currency_supported() ) : ?>
|
| 556 |
<tr>
|
| 557 |
<td colspan="2">
|
| 558 |
<h4><?php _e( 'Currency Conversion', 'wpsc' ); ?></h4>
|
wpsc-components/merchant-core-v3/gateways/paypal-pro.php
CHANGED
|
@@ -18,7 +18,7 @@ class WPSC_Payment_Gateway_Paypal_Pro extends WPSC_Payment_Gateway {
|
|
| 18 |
public function __construct( $options ) {
|
| 19 |
parent::__construct();
|
| 20 |
|
| 21 |
-
$this->title = __( 'PayPal Pro
|
| 22 |
|
| 23 |
require_once( 'php-merchant/gateways/paypal-pro.php' );
|
| 24 |
|
| 18 |
public function __construct( $options ) {
|
| 19 |
parent::__construct();
|
| 20 |
|
| 21 |
+
$this->title = __( 'PayPal Pro Hosted', 'wpsc' );
|
| 22 |
|
| 23 |
require_once( 'php-merchant/gateways/paypal-pro.php' );
|
| 24 |
|
wpsc-components/theme-engine-v1/helpers/ajax.php
CHANGED
|
@@ -425,10 +425,12 @@ function wpsc_update_product_price() {
|
|
| 425 |
}
|
| 426 |
|
| 427 |
if ( $change_price ) {
|
| 428 |
-
$old_price
|
| 429 |
-
$you_save_amount
|
| 430 |
$you_save_percentage = wpsc_you_save( array( 'product_id' => $product_id, 'variations' => $variations ) );
|
|
|
|
| 431 |
$price = wpsc_calculate_price( $product_id, $variations, true );
|
|
|
|
| 432 |
$response += array(
|
| 433 |
'old_price' => wpsc_currency_display( $old_price, array( 'display_as_html' => false ) ),
|
| 434 |
'numeric_old_price' => (float) $old_price,
|
| 425 |
}
|
| 426 |
|
| 427 |
if ( $change_price ) {
|
| 428 |
+
$old_price = wpsc_calculate_price( $product_id, $variations, false );
|
| 429 |
+
$you_save_amount = wpsc_you_save( array( 'product_id' => $product_id, 'type' => 'amount', 'variations' => $variations ) );
|
| 430 |
$you_save_percentage = wpsc_you_save( array( 'product_id' => $product_id, 'variations' => $variations ) );
|
| 431 |
+
|
| 432 |
$price = wpsc_calculate_price( $product_id, $variations, true );
|
| 433 |
+
|
| 434 |
$response += array(
|
| 435 |
'old_price' => wpsc_currency_display( $old_price, array( 'display_as_html' => false ) ),
|
| 436 |
'numeric_old_price' => (float) $old_price,
|
wpsc-components/theme-engine-v1/templates/functions/wpsc-user_log_functions.php
CHANGED
|
@@ -166,7 +166,7 @@ function wpsc_has_purchases() {
|
|
| 166 |
if ( $earliest_record[0]['date'] != null ) {
|
| 167 |
$form_sql = "SELECT * FROM `" . WPSC_TABLE_CHECKOUT_FORMS . "` WHERE `active` = '1' AND `display_log` = '1';";
|
| 168 |
$col_count = 4; //+ count( $form_data );
|
| 169 |
-
$sql = "SELECT * FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `user_ID` IN ('" . $user_ID . "') ORDER BY `date` DESC";
|
| 170 |
$purchase_log = $wpdb->get_results( $sql, ARRAY_A );
|
| 171 |
|
| 172 |
return true;
|
| 166 |
if ( $earliest_record[0]['date'] != null ) {
|
| 167 |
$form_sql = "SELECT * FROM `" . WPSC_TABLE_CHECKOUT_FORMS . "` WHERE `active` = '1' AND `display_log` = '1';";
|
| 168 |
$col_count = 4; //+ count( $form_data );
|
| 169 |
+
$sql = "SELECT * FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `user_ID` IN ('" . $user_ID . "') AND `processed` IN (3,4,5) ORDER BY `date` DESC";
|
| 170 |
$purchase_log = $wpdb->get_results( $sql, ARRAY_A );
|
| 171 |
|
| 172 |
return true;
|
wpsc-core/js/wp-e-commerce.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
///////////////////////////////////////////////////////////////////////////////////////////////
|
| 2 |
// This section is used to create the globals that were originally defined in the
|
| 3 |
// dynamic-js file pre 3.8.14. Note that variables also also exist in the "wpsc_ajax" structure.
|
|
@@ -23,13 +24,13 @@
|
|
| 23 |
*
|
| 24 |
*/
|
| 25 |
if ( typeof wpsc_vars !== 'undefined' ) {
|
| 26 |
-
var wpsc_ajax = wpsc_vars
|
| 27 |
-
var base_url = wpsc_vars
|
| 28 |
-
var WPSC_URL = wpsc_vars
|
| 29 |
-
var WPSC_IMAGE_URL = wpsc_vars
|
| 30 |
-
var WPSC_IMAGE_URL = wpsc_vars
|
| 31 |
-
var WPSC_CORE_IMAGES_URL = wpsc_vars
|
| 32 |
-
var fileThickboxLoadingImage = wpsc_vars
|
| 33 |
}
|
| 34 |
// end of variable definitions
|
| 35 |
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
@@ -134,8 +135,8 @@ function wpsc_var_set( name, value ) {
|
|
| 134 |
// if you are going to user it always check to be sure it is not false
|
| 135 |
var wpsc_visitor_id = false;
|
| 136 |
|
| 137 |
-
if (
|
| 138 |
-
if (
|
| 139 |
// create a cookie to signal that we have attempted validation. If we find the cookie is set
|
| 140 |
// we don't re-attempt validation. This means will only try to validate once and not slow down
|
| 141 |
// subsequent page views.
|
|
@@ -191,7 +192,9 @@ function wpsc_update_customer_data( meta_key, meta_value, response_callback ) {
|
|
| 191 |
var ajax_data = {action: 'wpsc_customer_updated_data', meta_key : meta_key, meta_value : meta_value };
|
| 192 |
wpsc_do_ajax_request( ajax_data, response_callback );
|
| 193 |
} catch ( err ) {
|
| 194 |
-
|
|
|
|
|
|
|
| 195 |
}
|
| 196 |
|
| 197 |
}
|
|
@@ -210,7 +213,9 @@ function wpsc_get_customer_data( response_callback ) {
|
|
| 210 |
var ajax_data = {action: 'wpsc_get_customer_meta' };
|
| 211 |
wpsc_do_ajax_request( ajax_data, response_callback );
|
| 212 |
} catch ( err ) {
|
| 213 |
-
|
|
|
|
|
|
|
| 214 |
}
|
| 215 |
}
|
| 216 |
|
|
@@ -251,7 +256,6 @@ function wpsc_update_customer_meta( response ) {
|
|
| 251 |
// the value of other meta, specifically the billing or shipping country.
|
| 252 |
// rather than enforce a field order in the response we will take care of it by doing
|
| 253 |
// a second pass through the updates looking for only the region drop downs
|
| 254 |
-
;
|
| 255 |
} else if ( jQuery(this).hasClass('wpsc-country-dropdown') ) {
|
| 256 |
var current_value = jQuery( this ).val();
|
| 257 |
if ( current_value != meta_value ) {
|
|
@@ -389,7 +393,7 @@ function wpsc_update_checkout_info( checkout_info ) {
|
|
| 389 |
*/
|
| 390 |
function wpsc_meta_item_change_response( response ) {
|
| 391 |
|
| 392 |
-
jQuery( ".wpsc-visitor-meta").off(
|
| 393 |
|
| 394 |
if ( response.hasOwnProperty('success') && response.success && response.hasOwnProperty('data') ) {
|
| 395 |
|
|
@@ -455,10 +459,10 @@ function wpsc_get_element_meta_key( element ) {
|
|
| 455 |
|
| 456 |
var meta_key = element.attr( "data-wpsc-meta-key" );
|
| 457 |
|
| 458 |
-
if ( meta_key
|
| 459 |
meta_key = element.attr( "title" );
|
| 460 |
|
| 461 |
-
if ( meta_key
|
| 462 |
meta_key = element.attr( "id" );
|
| 463 |
}
|
| 464 |
}
|
|
@@ -677,7 +681,7 @@ function wpsc_update_regions_list_to_match_country( country_select ) {
|
|
| 677 |
}
|
| 678 |
|
| 679 |
function wpsc_string_to_boolean( string ) {
|
| 680 |
-
return
|
| 681 |
}
|
| 682 |
|
| 683 |
/*
|
| 1 |
+
/* globals jQuery */
|
| 2 |
///////////////////////////////////////////////////////////////////////////////////////////////
|
| 3 |
// This section is used to create the globals that were originally defined in the
|
| 4 |
// dynamic-js file pre 3.8.14. Note that variables also also exist in the "wpsc_ajax" structure.
|
| 24 |
*
|
| 25 |
*/
|
| 26 |
if ( typeof wpsc_vars !== 'undefined' ) {
|
| 27 |
+
var wpsc_ajax = wpsc_vars.wpsc_ajax;
|
| 28 |
+
var base_url = wpsc_vars.base_url;
|
| 29 |
+
var WPSC_URL = wpsc_vars.WPSC_URL;
|
| 30 |
+
var WPSC_IMAGE_URL = wpsc_vars.WPSC_IMAGE_URL;
|
| 31 |
+
var WPSC_IMAGE_URL = wpsc_vars.WPSC_IMAGE_URL;
|
| 32 |
+
var WPSC_CORE_IMAGES_URL = wpsc_vars.WPSC_CORE_IMAGES_URL;
|
| 33 |
+
var fileThickboxLoadingImage = wpsc_vars.fileThickboxLoadingImage;
|
| 34 |
}
|
| 35 |
// end of variable definitions
|
| 36 |
///////////////////////////////////////////////////////////////////////////////////////////////
|
| 135 |
// if you are going to user it always check to be sure it is not false
|
| 136 |
var wpsc_visitor_id = false;
|
| 137 |
|
| 138 |
+
if ( document.cookie.indexOf("wpsc_customer_cookie") < 0 ) {
|
| 139 |
+
if ( document.cookie.indexOf("wpsc_attempted_validate") < 0 ) {
|
| 140 |
// create a cookie to signal that we have attempted validation. If we find the cookie is set
|
| 141 |
// we don't re-attempt validation. This means will only try to validate once and not slow down
|
| 142 |
// subsequent page views.
|
| 192 |
var ajax_data = {action: 'wpsc_customer_updated_data', meta_key : meta_key, meta_value : meta_value };
|
| 193 |
wpsc_do_ajax_request( ajax_data, response_callback );
|
| 194 |
} catch ( err ) {
|
| 195 |
+
if ( window.console && window.console.log ) {
|
| 196 |
+
console.log( err );
|
| 197 |
+
}
|
| 198 |
}
|
| 199 |
|
| 200 |
}
|
| 213 |
var ajax_data = {action: 'wpsc_get_customer_meta' };
|
| 214 |
wpsc_do_ajax_request( ajax_data, response_callback );
|
| 215 |
} catch ( err ) {
|
| 216 |
+
if ( window.console && window.console.log ) {
|
| 217 |
+
console.log( err );
|
| 218 |
+
}
|
| 219 |
}
|
| 220 |
}
|
| 221 |
|
| 256 |
// the value of other meta, specifically the billing or shipping country.
|
| 257 |
// rather than enforce a field order in the response we will take care of it by doing
|
| 258 |
// a second pass through the updates looking for only the region drop downs
|
|
|
|
| 259 |
} else if ( jQuery(this).hasClass('wpsc-country-dropdown') ) {
|
| 260 |
var current_value = jQuery( this ).val();
|
| 261 |
if ( current_value != meta_value ) {
|
| 393 |
*/
|
| 394 |
function wpsc_meta_item_change_response( response ) {
|
| 395 |
|
| 396 |
+
jQuery( ".wpsc-visitor-meta").off( 'change', wpsc_meta_item_change );
|
| 397 |
|
| 398 |
if ( response.hasOwnProperty('success') && response.success && response.hasOwnProperty('data') ) {
|
| 399 |
|
| 459 |
|
| 460 |
var meta_key = element.attr( "data-wpsc-meta-key" );
|
| 461 |
|
| 462 |
+
if ( meta_key === undefined ) {
|
| 463 |
meta_key = element.attr( "title" );
|
| 464 |
|
| 465 |
+
if ( meta_key === undefined ) {
|
| 466 |
meta_key = element.attr( "id" );
|
| 467 |
}
|
| 468 |
}
|
| 681 |
}
|
| 682 |
|
| 683 |
function wpsc_string_to_boolean( string ) {
|
| 684 |
+
return string.trim() !== '';
|
| 685 |
}
|
| 686 |
|
| 687 |
/*
|
wpsc-core/wpsc-constants.php
CHANGED
|
@@ -53,15 +53,15 @@ function wpsc_core_constants() {
|
|
| 53 |
|
| 54 |
// Define Plugin version
|
| 55 |
if ( ! defined( 'WPSC_VERSION' ) ) {
|
| 56 |
-
define( 'WPSC_VERSION' , '3.9' );
|
| 57 |
}
|
| 58 |
|
| 59 |
if ( ! defined( 'WPSC_MINOR_VERSION' ) ) {
|
| 60 |
-
define( 'WPSC_MINOR_VERSION' , '
|
| 61 |
}
|
| 62 |
|
| 63 |
if ( ! defined( 'WPSC_PRESENTABLE_VERSION' ) ) {
|
| 64 |
-
define( 'WPSC_PRESENTABLE_VERSION', '3.9' );
|
| 65 |
}
|
| 66 |
|
| 67 |
// Define a salt to use when we hash, WPSC_SALT may be defined for us in our config file, so check first
|
| 53 |
|
| 54 |
// Define Plugin version
|
| 55 |
if ( ! defined( 'WPSC_VERSION' ) ) {
|
| 56 |
+
define( 'WPSC_VERSION' , '3.9.1' );
|
| 57 |
}
|
| 58 |
|
| 59 |
if ( ! defined( 'WPSC_MINOR_VERSION' ) ) {
|
| 60 |
+
define( 'WPSC_MINOR_VERSION' , '66518b9' );
|
| 61 |
}
|
| 62 |
|
| 63 |
if ( ! defined( 'WPSC_PRESENTABLE_VERSION' ) ) {
|
| 64 |
+
define( 'WPSC_PRESENTABLE_VERSION', '3.9.1' );
|
| 65 |
}
|
| 66 |
|
| 67 |
// Define a salt to use when we hash, WPSC_SALT may be defined for us in our config file, so check first
|
wpsc-includes/cart-item.class.php
CHANGED
|
@@ -5,7 +5,6 @@
|
|
| 5 |
* This is the class for WP eCommerce Cart Items,
|
| 6 |
* The Cart Items class handles the same, but for cart items themselves.
|
| 7 |
*
|
| 8 |
-
*
|
| 9 |
* @package wp-e-commerce
|
| 10 |
* @since 3.8
|
| 11 |
* @subpackage wpsc-cart-classes
|
|
@@ -96,7 +95,8 @@ class wpsc_cart_item {
|
|
| 96 |
}
|
| 97 |
|
| 98 |
/**
|
| 99 |
-
*
|
|
|
|
| 100 |
* @access public
|
| 101 |
* @param meta key name
|
| 102 |
* @param meta key value
|
|
@@ -163,7 +163,7 @@ class wpsc_cart_item {
|
|
| 163 |
*
|
| 164 |
* @param integer the product ID
|
| 165 |
* @param array parameters
|
| 166 |
-
* @param
|
| 167 |
* @return boolean true on sucess, false on failure
|
| 168 |
*/
|
| 169 |
function __construct( $product_id, $parameters, $cart ) {
|
| 5 |
* This is the class for WP eCommerce Cart Items,
|
| 6 |
* The Cart Items class handles the same, but for cart items themselves.
|
| 7 |
*
|
|
|
|
| 8 |
* @package wp-e-commerce
|
| 9 |
* @since 3.8
|
| 10 |
* @subpackage wpsc-cart-classes
|
| 95 |
}
|
| 96 |
|
| 97 |
/**
|
| 98 |
+
* Update or add cart item meta value
|
| 99 |
+
*
|
| 100 |
* @access public
|
| 101 |
* @param meta key name
|
| 102 |
* @param meta key value
|
| 163 |
*
|
| 164 |
* @param integer the product ID
|
| 165 |
* @param array parameters
|
| 166 |
+
* @param object the cart object
|
| 167 |
* @return boolean true on sucess, false on failure
|
| 168 |
*/
|
| 169 |
function __construct( $product_id, $parameters, $cart ) {
|
wpsc-includes/cart.class.php
CHANGED
|
@@ -119,6 +119,8 @@ class wpsc_cart {
|
|
| 119 |
|
| 120 |
public function update_location() {
|
| 121 |
|
|
|
|
|
|
|
| 122 |
$delivery_country = wpsc_get_customer_meta( 'shippingcountry' );
|
| 123 |
$billing_country = wpsc_get_customer_meta( 'billingcountry' );
|
| 124 |
$delivery_region = wpsc_get_customer_meta( 'shippingregion' );
|
|
@@ -142,7 +144,7 @@ class wpsc_cart {
|
|
| 142 |
public function wpsc_refresh_cart_items() {
|
| 143 |
global $wpsc_cart;
|
| 144 |
|
| 145 |
-
if ( is_object( $wpsc_cart ) &&
|
| 146 |
foreach ( $wpsc_cart->cart_items as $cart_item ) {
|
| 147 |
$cart_item->refresh_item();
|
| 148 |
}
|
|
@@ -429,16 +431,18 @@ class wpsc_cart {
|
|
| 429 |
function get_shipping_option() {
|
| 430 |
global $wpdb, $wpsc_shipping_modules;
|
| 431 |
|
| 432 |
-
if ( ( count( $this->shipping_quotes ) < 1 ) &&
|
|
|
|
|
|
|
| 433 |
$this->shipping_quotes = $wpsc_shipping_modules[$this->selected_shipping_method]->getQuote();
|
| 434 |
}
|
| 435 |
|
| 436 |
if ( ! isset( $wpsc_shipping_modules[$this->selected_shipping_method] ) ) {
|
| 437 |
-
$
|
| 438 |
}
|
| 439 |
|
| 440 |
if ( count( $this->shipping_quotes ) < 1 ) {
|
| 441 |
-
$this->selected_shipping_option =
|
| 442 |
}
|
| 443 |
|
| 444 |
// if the current shipping option is not valid, go back to no shipping option
|
|
@@ -693,7 +697,8 @@ class wpsc_cart {
|
|
| 693 |
*
|
| 694 |
* @param integer a product ID key
|
| 695 |
* @param array variations on the product
|
| 696 |
-
*
|
|
|
|
| 697 |
*/
|
| 698 |
function get_remaining_quantity( $product_id, $variations = array(), $quantity = 1 ) {
|
| 699 |
return wpsc_get_remaining_quantity( $product_id, $variations, $quantity );
|
|
@@ -1188,7 +1193,7 @@ class wpsc_cart {
|
|
| 1188 |
function rewind_shipping_methods() {
|
| 1189 |
$this->current_shipping_method = - 1;
|
| 1190 |
if ( $this->shipping_method_count > 0 ) {
|
| 1191 |
-
$this->shipping_method = $this->shipping_methods
|
| 1192 |
}
|
| 1193 |
}
|
| 1194 |
|
|
@@ -1202,8 +1207,8 @@ class wpsc_cart {
|
|
| 1202 |
if ( $this->shipping_method == null ) {
|
| 1203 |
$this->get_shipping_method();
|
| 1204 |
}
|
| 1205 |
-
if ( isset( $wpsc_shipping_modules
|
| 1206 |
-
$unprocessed_shipping_quotes = $wpsc_shipping_modules
|
| 1207 |
}
|
| 1208 |
$num = 0;
|
| 1209 |
if ( ! empty( $unprocessed_shipping_quotes ) ) {
|
| 119 |
|
| 120 |
public function update_location() {
|
| 121 |
|
| 122 |
+
$this->clear_cache();
|
| 123 |
+
|
| 124 |
$delivery_country = wpsc_get_customer_meta( 'shippingcountry' );
|
| 125 |
$billing_country = wpsc_get_customer_meta( 'billingcountry' );
|
| 126 |
$delivery_region = wpsc_get_customer_meta( 'shippingregion' );
|
| 144 |
public function wpsc_refresh_cart_items() {
|
| 145 |
global $wpsc_cart;
|
| 146 |
|
| 147 |
+
if ( is_object( $wpsc_cart ) && is_array( $wpsc_cart->cart_items ) ) {
|
| 148 |
foreach ( $wpsc_cart->cart_items as $cart_item ) {
|
| 149 |
$cart_item->refresh_item();
|
| 150 |
}
|
| 431 |
function get_shipping_option() {
|
| 432 |
global $wpdb, $wpsc_shipping_modules;
|
| 433 |
|
| 434 |
+
if ( ( count( $this->shipping_quotes ) < 1 ) &&
|
| 435 |
+
isset( $wpsc_shipping_modules[$this->selected_shipping_method] ) &&
|
| 436 |
+
is_callable( array( $wpsc_shipping_modules[$this->selected_shipping_method], 'getQuote' ) ) ) {
|
| 437 |
$this->shipping_quotes = $wpsc_shipping_modules[$this->selected_shipping_method]->getQuote();
|
| 438 |
}
|
| 439 |
|
| 440 |
if ( ! isset( $wpsc_shipping_modules[$this->selected_shipping_method] ) ) {
|
| 441 |
+
$this->selected_shipping_option = null;
|
| 442 |
}
|
| 443 |
|
| 444 |
if ( count( $this->shipping_quotes ) < 1 ) {
|
| 445 |
+
$this->selected_shipping_option = null;
|
| 446 |
}
|
| 447 |
|
| 448 |
// if the current shipping option is not valid, go back to no shipping option
|
| 697 |
*
|
| 698 |
* @param integer a product ID key
|
| 699 |
* @param array variations on the product
|
| 700 |
+
*
|
| 701 |
+
* @return int Number of product remaining.
|
| 702 |
*/
|
| 703 |
function get_remaining_quantity( $product_id, $variations = array(), $quantity = 1 ) {
|
| 704 |
return wpsc_get_remaining_quantity( $product_id, $variations, $quantity );
|
| 1193 |
function rewind_shipping_methods() {
|
| 1194 |
$this->current_shipping_method = - 1;
|
| 1195 |
if ( $this->shipping_method_count > 0 ) {
|
| 1196 |
+
$this->shipping_method = $this->shipping_methods[0];
|
| 1197 |
}
|
| 1198 |
}
|
| 1199 |
|
| 1207 |
if ( $this->shipping_method == null ) {
|
| 1208 |
$this->get_shipping_method();
|
| 1209 |
}
|
| 1210 |
+
if ( isset( $wpsc_shipping_modules[$this->shipping_method] ) && is_callable( array( $wpsc_shipping_modules [$this->shipping_method], 'getQuote' ) ) ) {
|
| 1211 |
+
$unprocessed_shipping_quotes = $wpsc_shipping_modules[$this->shipping_method]->getQuote();
|
| 1212 |
}
|
| 1213 |
$num = 0;
|
| 1214 |
if ( ! empty( $unprocessed_shipping_quotes ) ) {
|
wpsc-includes/checkout.class.php
CHANGED
|
@@ -493,7 +493,7 @@ class wpsc_checkout {
|
|
| 493 |
switch ( $form_data->type ) {
|
| 494 |
case 'email':
|
| 495 |
|
| 496 |
-
if ( !
|
| 497 |
$any_bad_inputs = true;
|
| 498 |
$bad_input = true;
|
| 499 |
}
|
|
@@ -534,9 +534,9 @@ class wpsc_checkout {
|
|
| 534 |
}
|
| 535 |
}
|
| 536 |
|
| 537 |
-
wpsc_update_customer_meta( 'checkout_error_messages'
|
| 538 |
-
wpsc_update_customer_meta( 'gateway_error_messages'
|
| 539 |
-
wpsc_update_customer_meta( 'registration_error_messages'
|
| 540 |
|
| 541 |
$filtered_checkout_details = apply_filters( 'wpsc_update_customer_checkout_details', $wpsc_customer_checkout_details );
|
| 542 |
|
| 493 |
switch ( $form_data->type ) {
|
| 494 |
case 'email':
|
| 495 |
|
| 496 |
+
if ( ! is_email( $value ) ) {
|
| 497 |
$any_bad_inputs = true;
|
| 498 |
$bad_input = true;
|
| 499 |
}
|
| 534 |
}
|
| 535 |
}
|
| 536 |
|
| 537 |
+
wpsc_update_customer_meta( 'checkout_error_messages' , $wpsc_checkout_error_messages );
|
| 538 |
+
wpsc_update_customer_meta( 'gateway_error_messages' , $wpsc_gateway_error_messages );
|
| 539 |
+
wpsc_update_customer_meta( 'registration_error_messages', $wpsc_registration_error_messages );
|
| 540 |
|
| 541 |
$filtered_checkout_details = apply_filters( 'wpsc_update_customer_checkout_details', $wpsc_customer_checkout_details );
|
| 542 |
|
wpsc-includes/coupons.class.php
CHANGED
|
@@ -1,11 +1,11 @@
|
|
| 1 |
<?php
|
| 2 |
-
/**
|
| 3 |
* The Coupons Class
|
| 4 |
-
*
|
| 5 |
-
* Holds the main coupon class amd other important coupon functions
|
| 6 |
-
*
|
| 7 |
* @package wp-e-commerce
|
| 8 |
-
*/
|
| 9 |
|
| 10 |
/**
|
| 11 |
* uses coupons function, no parameters
|
|
@@ -37,10 +37,7 @@ function wpsc_coupons_error(){
|
|
| 37 |
/**
|
| 38 |
* Coupons class.
|
| 39 |
*
|
| 40 |
-
*
|
| 41 |
-
*
|
| 42 |
-
* TODO: Implement 'ANY' logic of conditional coupons.
|
| 43 |
-
*
|
| 44 |
* @package wp-e-commerce
|
| 45 |
* @since 3.7
|
| 46 |
*/
|
|
@@ -118,7 +115,7 @@ class wpsc_coupons {
|
|
| 118 |
*
|
| 119 |
* Checks if the current coupon is valid to use (Expiry date, Active, Used).
|
| 120 |
*
|
| 121 |
-
* @return bool True if coupon is not
|
| 122 |
*/
|
| 123 |
function validate_coupon() {
|
| 124 |
|
|
@@ -210,7 +207,7 @@ class wpsc_coupons {
|
|
| 210 |
break;
|
| 211 |
|
| 212 |
case 'ends'://Checks if the product name ends with condition value
|
| 213 |
-
return preg_match( "/" . preg_quote( $
|
| 214 |
break;
|
| 215 |
}
|
| 216 |
|
|
@@ -228,6 +225,7 @@ class wpsc_coupons {
|
|
| 228 |
*/
|
| 229 |
public function _callback_condition_item_quantity( $condition, $cart_item ) {
|
| 230 |
$value = (int) $condition['value'];
|
|
|
|
| 231 |
switch( $condition['logic'] ) {
|
| 232 |
case 'equal': //Checks if the quantity of a product in the cart equals condition value
|
| 233 |
return $cart_item->quantity == $value;
|
|
@@ -254,7 +252,7 @@ class wpsc_coupons {
|
|
| 254 |
break;
|
| 255 |
|
| 256 |
case 'ends'://Checks if the product name ends with condition value
|
| 257 |
-
return preg_match( "/" . $value . "$/",$
|
| 258 |
break;
|
| 259 |
}
|
| 260 |
|
|
@@ -271,8 +269,9 @@ class wpsc_coupons {
|
|
| 271 |
* @return boolean
|
| 272 |
*/
|
| 273 |
public function _callback_condition_total_quantity( $condition, $cart_item ) {
|
|
|
|
| 274 |
$total_quantity = wpsc_cart_item_count();
|
| 275 |
-
$value
|
| 276 |
|
| 277 |
switch( $condition['logic'] ) {
|
| 278 |
case 'equal'://Checks if the quantity of products in the cart equals condition value
|
|
@@ -485,7 +484,7 @@ class wpsc_coupons {
|
|
| 485 |
// if "Apply on all products" is not checked and the coupon is percentage, the discount
|
| 486 |
// amount should be based on the eligible cart item with lowest unit price
|
| 487 |
if ( $this->is_percentage() ) {
|
| 488 |
-
$field = apply_filters( 'wpsc_coupon_select_item_field'
|
| 489 |
$item = array_shift( $items );
|
| 490 |
return $item->$field * $this->value / 100;
|
| 491 |
}
|
|
@@ -599,48 +598,52 @@ class wpsc_coupons {
|
|
| 599 |
* @return float
|
| 600 |
*/
|
| 601 |
public function calculate_discount() {
|
| 602 |
-
global $
|
| 603 |
|
| 604 |
$wpsc_cart->clear_cache();
|
| 605 |
|
| 606 |
-
if ( $this->has_conditions() )
|
| 607 |
return $this->calculate_discount_conditions();
|
|
|
|
|
|
|
|
|
|
| 608 |
|
| 609 |
-
return $this->calculate_discount_without_conditions();
|
| 610 |
}
|
| 611 |
|
| 612 |
/**
|
| 613 |
* Comparing logic with the product information
|
| 614 |
*
|
| 615 |
-
* Checks if the product
|
|
|
|
|
|
|
| 616 |
*
|
| 617 |
* @return bool True if all conditions are matched, False otherwise.
|
| 618 |
*/
|
| 619 |
-
function compare_logic($
|
| 620 |
global $wpdb;
|
| 621 |
|
| 622 |
-
if ( 'item_name' == $
|
| 623 |
-
$product_data = $wpdb->get_results( "SELECT * FROM " . $wpdb->posts . " WHERE id='{$
|
| 624 |
$product_data = $product_data[0];
|
| 625 |
|
| 626 |
-
switch( $
|
| 627 |
case 'equal': //Checks if the product name is exactly the same as the condition value
|
| 628 |
-
if ( $product_data->post_title == $
|
| 629 |
return true;
|
| 630 |
break;
|
| 631 |
|
| 632 |
case 'greater'://Checks if the product name is not the same as the condition value
|
| 633 |
-
if ( $product_data->post_title > $
|
| 634 |
return true;
|
| 635 |
break;
|
| 636 |
|
| 637 |
case 'less'://Checks if the product name is not the same as the condition value
|
| 638 |
-
if ( $product_data->post_title < $
|
| 639 |
return true;
|
| 640 |
break;
|
| 641 |
|
| 642 |
case 'contains'://Checks if the product name contains the condition value
|
| 643 |
-
preg_match( "/(.*)" . preg_quote( $
|
| 644 |
|
| 645 |
if ( ! empty( $match ) )
|
| 646 |
return true;
|
|
@@ -653,26 +656,26 @@ class wpsc_coupons {
|
|
| 653 |
$categories = wpsc_get_product_terms( $product_data->ID, 'wpsc_product_category' );
|
| 654 |
}
|
| 655 |
foreach ( $categories as $cat ) {
|
| 656 |
-
if ( strtolower( $cat->name ) == strtolower( $
|
| 657 |
return true;
|
| 658 |
}
|
| 659 |
break;
|
| 660 |
|
| 661 |
case 'not_contain'://Checks if the product name contains the condition value
|
| 662 |
-
preg_match( "/(.*)" . preg_quote( $
|
| 663 |
|
| 664 |
if ( empty( $match ) )
|
| 665 |
return true;
|
| 666 |
break;
|
| 667 |
|
| 668 |
case 'begins'://Checks if the product name begins with condition value
|
| 669 |
-
preg_match( "/^" . preg_quote( $
|
| 670 |
if ( ! empty( $match ) )
|
| 671 |
return true;
|
| 672 |
break;
|
| 673 |
|
| 674 |
case 'ends'://Checks if the product name ends with condition value
|
| 675 |
-
preg_match( "/" . preg_quote( $
|
| 676 |
if ( ! empty( $match ) )
|
| 677 |
return true;
|
| 678 |
break;
|
|
@@ -680,65 +683,65 @@ class wpsc_coupons {
|
|
| 680 |
default:
|
| 681 |
return false;
|
| 682 |
}
|
| 683 |
-
} else if ( 'item_quantity' == $
|
| 684 |
|
| 685 |
-
switch( $
|
| 686 |
case 'equal'://Checks if the quantity of a product in the cart equals condition value
|
| 687 |
-
if ( $
|
| 688 |
return true;
|
| 689 |
break;
|
| 690 |
|
| 691 |
case 'greater'://Checks if the quantity of a product is greater than the condition value
|
| 692 |
-
if ( $
|
| 693 |
return true;
|
| 694 |
break;
|
| 695 |
|
| 696 |
case 'less'://Checks if the quantity of a product is less than the condition value
|
| 697 |
-
if ( $
|
| 698 |
return true;
|
| 699 |
break;
|
| 700 |
|
| 701 |
case 'contains'://Checks if the product name contains the condition value
|
| 702 |
-
preg_match( "/(.*)" . $
|
| 703 |
if ( ! empty( $match ) )
|
| 704 |
return true;
|
| 705 |
break;
|
| 706 |
|
| 707 |
case 'not_contain'://Checks if the product name contains the condition value
|
| 708 |
-
preg_match("/(.*)".$
|
| 709 |
if ( empty( $match ) )
|
| 710 |
return true;
|
| 711 |
break;
|
| 712 |
|
| 713 |
case 'begins'://Checks if the product name begins with condition value
|
| 714 |
-
preg_match("/^".$
|
| 715 |
if ( ! empty( $match ) )
|
| 716 |
return true;
|
| 717 |
break;
|
| 718 |
|
| 719 |
case 'ends'://Checks if the product name ends with condition value
|
| 720 |
-
preg_match( "/" . $
|
| 721 |
if ( ! empty( $match ) )
|
| 722 |
return true;
|
| 723 |
break;
|
| 724 |
default:
|
| 725 |
return false;
|
| 726 |
}
|
| 727 |
-
} else if ($
|
| 728 |
$total_quantity = wpsc_cart_item_count();
|
| 729 |
-
switch($
|
| 730 |
case 'equal'://Checks if the quantity of products in the cart equals condition value
|
| 731 |
-
if ($total_quantity == $
|
| 732 |
return true;
|
| 733 |
break;
|
| 734 |
|
| 735 |
case 'greater'://Checks if the quantity in the cart is greater than the condition value
|
| 736 |
-
if ($total_quantity > $
|
| 737 |
return true;
|
| 738 |
break;
|
| 739 |
|
| 740 |
case 'less'://Checks if the quantity in the cart is less than the condition value
|
| 741 |
-
if ($total_quantity < $
|
| 742 |
return true;
|
| 743 |
break;
|
| 744 |
|
|
@@ -746,21 +749,21 @@ class wpsc_coupons {
|
|
| 746 |
return false;
|
| 747 |
}
|
| 748 |
|
| 749 |
-
} else if ($
|
| 750 |
$subtotal = wpsc_cart_total(false);
|
| 751 |
-
switch($
|
| 752 |
case 'equal'://Checks if the subtotal of products in the cart equals condition value
|
| 753 |
-
if ($subtotal == $
|
| 754 |
return true;
|
| 755 |
break;
|
| 756 |
|
| 757 |
case 'greater'://Checks if the subtotal of the cart is greater than the condition value
|
| 758 |
-
if ($subtotal > $
|
| 759 |
return true;
|
| 760 |
break;
|
| 761 |
|
| 762 |
case 'less'://Checks if the subtotal of the cart is less than the condition value
|
| 763 |
-
if ($subtotal < $
|
| 764 |
return true;
|
| 765 |
}else{
|
| 766 |
return false;
|
|
@@ -772,7 +775,7 @@ class wpsc_coupons {
|
|
| 772 |
return false;
|
| 773 |
}
|
| 774 |
} else {
|
| 775 |
-
return apply_filters( 'wpsc_coupon_compare_logic', false, $
|
| 776 |
}
|
| 777 |
}
|
| 778 |
|
|
@@ -785,9 +788,6 @@ class wpsc_coupons {
|
|
| 785 |
|
| 786 |
$num_active_coupons = $wpdb->get_var("SELECT COUNT(id) as c FROM `".WPSC_TABLE_COUPON_CODES."` WHERE active='1'");
|
| 787 |
|
| 788 |
-
return ( $num_active_coupons > 0 );
|
| 789 |
}
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
}
|
| 793 |
-
?>
|
| 1 |
<?php
|
| 2 |
+
/**
|
| 3 |
* The Coupons Class
|
| 4 |
+
*
|
| 5 |
+
* Holds the main coupon class amd other important coupon functions
|
| 6 |
+
*
|
| 7 |
* @package wp-e-commerce
|
| 8 |
+
*/
|
| 9 |
|
| 10 |
/**
|
| 11 |
* uses coupons function, no parameters
|
| 37 |
/**
|
| 38 |
* Coupons class.
|
| 39 |
*
|
| 40 |
+
* @todo Cleanup early in 4.0 / PHP5
|
|
|
|
|
|
|
|
|
|
| 41 |
* @package wp-e-commerce
|
| 42 |
* @since 3.7
|
| 43 |
*/
|
| 115 |
*
|
| 116 |
* Checks if the current coupon is valid to use (Expiry date, Active, Used).
|
| 117 |
*
|
| 118 |
+
* @return bool True if coupon is not expired, used and still active, False otherwise.
|
| 119 |
*/
|
| 120 |
function validate_coupon() {
|
| 121 |
|
| 207 |
break;
|
| 208 |
|
| 209 |
case 'ends'://Checks if the product name ends with condition value
|
| 210 |
+
return preg_match( "/" . preg_quote( $condition['value'], '/' ) . "$/", $product_data->post_title );
|
| 211 |
break;
|
| 212 |
}
|
| 213 |
|
| 225 |
*/
|
| 226 |
public function _callback_condition_item_quantity( $condition, $cart_item ) {
|
| 227 |
$value = (int) $condition['value'];
|
| 228 |
+
|
| 229 |
switch( $condition['logic'] ) {
|
| 230 |
case 'equal': //Checks if the quantity of a product in the cart equals condition value
|
| 231 |
return $cart_item->quantity == $value;
|
| 252 |
break;
|
| 253 |
|
| 254 |
case 'ends'://Checks if the product name ends with condition value
|
| 255 |
+
return preg_match( "/" . $value . "$/",$cart_item->quantity );
|
| 256 |
break;
|
| 257 |
}
|
| 258 |
|
| 269 |
* @return boolean
|
| 270 |
*/
|
| 271 |
public function _callback_condition_total_quantity( $condition, $cart_item ) {
|
| 272 |
+
|
| 273 |
$total_quantity = wpsc_cart_item_count();
|
| 274 |
+
$value = (int) $condition['value'];
|
| 275 |
|
| 276 |
switch( $condition['logic'] ) {
|
| 277 |
case 'equal'://Checks if the quantity of products in the cart equals condition value
|
| 484 |
// if "Apply on all products" is not checked and the coupon is percentage, the discount
|
| 485 |
// amount should be based on the eligible cart item with lowest unit price
|
| 486 |
if ( $this->is_percentage() ) {
|
| 487 |
+
$field = apply_filters( 'wpsc_coupon_select_item_field', 'unit_price' );
|
| 488 |
$item = array_shift( $items );
|
| 489 |
return $item->$field * $this->value / 100;
|
| 490 |
}
|
| 598 |
* @return float
|
| 599 |
*/
|
| 600 |
public function calculate_discount() {
|
| 601 |
+
global $wpsc_cart;
|
| 602 |
|
| 603 |
$wpsc_cart->clear_cache();
|
| 604 |
|
| 605 |
+
if ( $this->has_conditions() ) {
|
| 606 |
return $this->calculate_discount_conditions();
|
| 607 |
+
} else {
|
| 608 |
+
return $this->calculate_discount_without_conditions();
|
| 609 |
+
}
|
| 610 |
|
|
|
|
| 611 |
}
|
| 612 |
|
| 613 |
/**
|
| 614 |
* Comparing logic with the product information
|
| 615 |
*
|
| 616 |
+
* Checks if the product matches the logic
|
| 617 |
+
*
|
| 618 |
+
* @todo Is this ever even used?
|
| 619 |
*
|
| 620 |
* @return bool True if all conditions are matched, False otherwise.
|
| 621 |
*/
|
| 622 |
+
function compare_logic( $condition, $product ) {
|
| 623 |
global $wpdb;
|
| 624 |
|
| 625 |
+
if ( 'item_name' == $condition['property'] ) {
|
| 626 |
+
$product_data = $wpdb->get_results( "SELECT * FROM " . $wpdb->posts . " WHERE id='{$product->product_id}'" );
|
| 627 |
$product_data = $product_data[0];
|
| 628 |
|
| 629 |
+
switch( $condition['logic'] ) {
|
| 630 |
case 'equal': //Checks if the product name is exactly the same as the condition value
|
| 631 |
+
if ( $product_data->post_title == $condition['value'] )
|
| 632 |
return true;
|
| 633 |
break;
|
| 634 |
|
| 635 |
case 'greater'://Checks if the product name is not the same as the condition value
|
| 636 |
+
if ( $product_data->post_title > $condition['value'] )
|
| 637 |
return true;
|
| 638 |
break;
|
| 639 |
|
| 640 |
case 'less'://Checks if the product name is not the same as the condition value
|
| 641 |
+
if ( $product_data->post_title < $condition['value'] )
|
| 642 |
return true;
|
| 643 |
break;
|
| 644 |
|
| 645 |
case 'contains'://Checks if the product name contains the condition value
|
| 646 |
+
preg_match( "/(.*)" . preg_quote( $condition['value'], '/' ) . "(.*)/", $product_data->post_title, $match );
|
| 647 |
|
| 648 |
if ( ! empty( $match ) )
|
| 649 |
return true;
|
| 656 |
$categories = wpsc_get_product_terms( $product_data->ID, 'wpsc_product_category' );
|
| 657 |
}
|
| 658 |
foreach ( $categories as $cat ) {
|
| 659 |
+
if ( strtolower( $cat->name ) == strtolower( $condition['value'] ) )
|
| 660 |
return true;
|
| 661 |
}
|
| 662 |
break;
|
| 663 |
|
| 664 |
case 'not_contain'://Checks if the product name contains the condition value
|
| 665 |
+
preg_match( "/(.*)" . preg_quote( $condition['value'], '/' ) . "(.*)/", $product_data->post_title, $match );
|
| 666 |
|
| 667 |
if ( empty( $match ) )
|
| 668 |
return true;
|
| 669 |
break;
|
| 670 |
|
| 671 |
case 'begins'://Checks if the product name begins with condition value
|
| 672 |
+
preg_match( "/^" . preg_quote( $condition['value'], '/' ) . "/", $product_data->post_title, $match );
|
| 673 |
if ( ! empty( $match ) )
|
| 674 |
return true;
|
| 675 |
break;
|
| 676 |
|
| 677 |
case 'ends'://Checks if the product name ends with condition value
|
| 678 |
+
preg_match( "/" . preg_quote( $condition['value'], '/' ) . "$/", $product_data->post_title, $match );
|
| 679 |
if ( ! empty( $match ) )
|
| 680 |
return true;
|
| 681 |
break;
|
| 683 |
default:
|
| 684 |
return false;
|
| 685 |
}
|
| 686 |
+
} else if ( 'item_quantity' == $condition['property'] ) {
|
| 687 |
|
| 688 |
+
switch( $condition['logic'] ) {
|
| 689 |
case 'equal'://Checks if the quantity of a product in the cart equals condition value
|
| 690 |
+
if ( $product->quantity == (int) $condition['value'] )
|
| 691 |
return true;
|
| 692 |
break;
|
| 693 |
|
| 694 |
case 'greater'://Checks if the quantity of a product is greater than the condition value
|
| 695 |
+
if ( $product->quantity > $condition['value'] )
|
| 696 |
return true;
|
| 697 |
break;
|
| 698 |
|
| 699 |
case 'less'://Checks if the quantity of a product is less than the condition value
|
| 700 |
+
if ( $product->quantity < $condition['value'] )
|
| 701 |
return true;
|
| 702 |
break;
|
| 703 |
|
| 704 |
case 'contains'://Checks if the product name contains the condition value
|
| 705 |
+
preg_match( "/(.*)" . $condition['value'] . "(.*)/", $product->quantity, $match );
|
| 706 |
if ( ! empty( $match ) )
|
| 707 |
return true;
|
| 708 |
break;
|
| 709 |
|
| 710 |
case 'not_contain'://Checks if the product name contains the condition value
|
| 711 |
+
preg_match("/(.*)".$condition['value']."(.*)/",$product->quantity, $match );
|
| 712 |
if ( empty( $match ) )
|
| 713 |
return true;
|
| 714 |
break;
|
| 715 |
|
| 716 |
case 'begins'://Checks if the product name begins with condition value
|
| 717 |
+
preg_match("/^".$condition['value']."/", $product->quantity, $match );
|
| 718 |
if ( ! empty( $match ) )
|
| 719 |
return true;
|
| 720 |
break;
|
| 721 |
|
| 722 |
case 'ends'://Checks if the product name ends with condition value
|
| 723 |
+
preg_match( "/" . $condition['value'] . "$/", $product->quantity, $match );
|
| 724 |
if ( ! empty( $match ) )
|
| 725 |
return true;
|
| 726 |
break;
|
| 727 |
default:
|
| 728 |
return false;
|
| 729 |
}
|
| 730 |
+
} else if ($condition['property'] == 'total_quantity') {
|
| 731 |
$total_quantity = wpsc_cart_item_count();
|
| 732 |
+
switch($condition['logic']) {
|
| 733 |
case 'equal'://Checks if the quantity of products in the cart equals condition value
|
| 734 |
+
if ($total_quantity == $condition['value'])
|
| 735 |
return true;
|
| 736 |
break;
|
| 737 |
|
| 738 |
case 'greater'://Checks if the quantity in the cart is greater than the condition value
|
| 739 |
+
if ($total_quantity > $condition['value'])
|
| 740 |
return true;
|
| 741 |
break;
|
| 742 |
|
| 743 |
case 'less'://Checks if the quantity in the cart is less than the condition value
|
| 744 |
+
if ($total_quantity < $condition['value'])
|
| 745 |
return true;
|
| 746 |
break;
|
| 747 |
|
| 749 |
return false;
|
| 750 |
}
|
| 751 |
|
| 752 |
+
} else if ( $condition['property'] == 'subtotal_amount' ) {
|
| 753 |
$subtotal = wpsc_cart_total(false);
|
| 754 |
+
switch($condition['logic']) {
|
| 755 |
case 'equal'://Checks if the subtotal of products in the cart equals condition value
|
| 756 |
+
if ($subtotal == $condition['value'])
|
| 757 |
return true;
|
| 758 |
break;
|
| 759 |
|
| 760 |
case 'greater'://Checks if the subtotal of the cart is greater than the condition value
|
| 761 |
+
if ($subtotal > $condition['value'])
|
| 762 |
return true;
|
| 763 |
break;
|
| 764 |
|
| 765 |
case 'less'://Checks if the subtotal of the cart is less than the condition value
|
| 766 |
+
if ($subtotal < $condition['value']){
|
| 767 |
return true;
|
| 768 |
}else{
|
| 769 |
return false;
|
| 775 |
return false;
|
| 776 |
}
|
| 777 |
} else {
|
| 778 |
+
return apply_filters( 'wpsc_coupon_compare_logic', false, $condition, $product );
|
| 779 |
}
|
| 780 |
}
|
| 781 |
|
| 788 |
|
| 789 |
$num_active_coupons = $wpdb->get_var("SELECT COUNT(id) as c FROM `".WPSC_TABLE_COUPON_CODES."` WHERE active='1'");
|
| 790 |
|
| 791 |
+
return apply_filters( 'wpsc_uses_coupons', ( $num_active_coupons > 0 ) );
|
| 792 |
}
|
| 793 |
+
}
|
|
|
|
|
|
|
|
|
wpsc-includes/purchase-log.helpers.php
CHANGED
|
@@ -216,11 +216,14 @@ function wpsc_send_customer_email( $purchase_log ) {
|
|
| 216 |
}
|
| 217 |
|
| 218 |
function wpsc_send_admin_email( $purchase_log, $force = false ) {
|
| 219 |
-
|
|
|
|
| 220 |
$purchase_log = new WPSC_Purchase_Log( $purchase_log );
|
|
|
|
| 221 |
|
| 222 |
-
if ( $purchase_log->get( 'email_sent' ) && ! $force )
|
| 223 |
return;
|
|
|
|
| 224 |
|
| 225 |
$email = new WPSC_Purchase_Log_Admin_Notification( $purchase_log );
|
| 226 |
$email_sent = $email->send();
|
|
@@ -231,6 +234,7 @@ function wpsc_send_admin_email( $purchase_log, $force = false ) {
|
|
| 231 |
}
|
| 232 |
|
| 233 |
do_action( 'wpsc_transaction_send_email_to_admin', $email, $email_sent );
|
|
|
|
| 234 |
return $email_sent;
|
| 235 |
}
|
| 236 |
|
| 216 |
}
|
| 217 |
|
| 218 |
function wpsc_send_admin_email( $purchase_log, $force = false ) {
|
| 219 |
+
|
| 220 |
+
if ( ! is_object( $purchase_log ) ) {
|
| 221 |
$purchase_log = new WPSC_Purchase_Log( $purchase_log );
|
| 222 |
+
}
|
| 223 |
|
| 224 |
+
if ( $purchase_log->get( 'email_sent' ) && ! $force ) {
|
| 225 |
return;
|
| 226 |
+
}
|
| 227 |
|
| 228 |
$email = new WPSC_Purchase_Log_Admin_Notification( $purchase_log );
|
| 229 |
$email_sent = $email->send();
|
| 234 |
}
|
| 235 |
|
| 236 |
do_action( 'wpsc_transaction_send_email_to_admin', $email, $email_sent );
|
| 237 |
+
|
| 238 |
return $email_sent;
|
| 239 |
}
|
| 240 |
|
wpsc-includes/wpsc-theme-engine-bootstrap.php
CHANGED
|
@@ -73,7 +73,9 @@ function _wpsc_theme_engine_v1_has_actions() {
|
|
| 73 |
if ( is_array( $core_exceptions[ $action ] ) ) {
|
| 74 |
|
| 75 |
foreach ( $core_exceptions[ $action ] as $core_hook ) {
|
| 76 |
-
|
|
|
|
|
|
|
| 77 |
}
|
| 78 |
|
| 79 |
} else {
|
|
@@ -96,7 +98,7 @@ function _wpsc_theme_engine_v1_has_actions() {
|
|
| 96 |
* Minimally redundant, though the comparable functions are only loaded in the 1.0 engine.
|
| 97 |
*
|
| 98 |
* @since 3.9
|
| 99 |
-
* @return
|
| 100 |
*/
|
| 101 |
function _wpsc_theme_engine_v2_has_old_templates() {
|
| 102 |
|
| 73 |
if ( is_array( $core_exceptions[ $action ] ) ) {
|
| 74 |
|
| 75 |
foreach ( $core_exceptions[ $action ] as $core_hook ) {
|
| 76 |
+
// Admitted hack until we build a better detection API.
|
| 77 |
+
$priority = ( '_wpsc_calculate_shipping_quotes_before_product_page' == $core_hook ) ? 1 : 10;
|
| 78 |
+
remove_action( $action, $core_hook, $priority );
|
| 79 |
}
|
| 80 |
|
| 81 |
} else {
|
| 98 |
* Minimally redundant, though the comparable functions are only loaded in the 1.0 engine.
|
| 99 |
*
|
| 100 |
* @since 3.9
|
| 101 |
+
* @return bool Whether or not the active theme directory has old templates.
|
| 102 |
*/
|
| 103 |
function _wpsc_theme_engine_v2_has_old_templates() {
|
| 104 |
|
wpsc-merchants/paypal-pro.merchant.php
CHANGED
|
@@ -520,13 +520,13 @@ if ( in_array( 'wpsc_merchant_paypal_pro', (array)get_option( 'custom_gateway_op
|
|
| 520 |
|
| 521 |
$output = "
|
| 522 |
<tr>
|
| 523 |
-
<td class='wpsc_CC_details'>" . __( 'Credit Card Number
|
| 524 |
<td>
|
| 525 |
<input type='text' value='' name='card_number' />
|
| 526 |
</td>
|
| 527 |
</tr>
|
| 528 |
<tr>
|
| 529 |
-
<td class='wpsc_CC_details'>" . __( 'Credit Card Expiry
|
| 530 |
<td>
|
| 531 |
<select class='wpsc_ccBox' name='expiry[month]'>
|
| 532 |
" . $months . "
|
|
@@ -549,12 +549,12 @@ if ( in_array( 'wpsc_merchant_paypal_pro', (array)get_option( 'custom_gateway_op
|
|
| 549 |
</td>
|
| 550 |
</tr>
|
| 551 |
<tr>
|
| 552 |
-
<td class='wpsc_CC_details'>" . __( 'CVV
|
| 553 |
<td><input type='text' size='4' value='' maxlength='4' name='card_code' />
|
| 554 |
</td>
|
| 555 |
</tr>
|
| 556 |
<tr>
|
| 557 |
-
<td class='wpsc_CC_details'>" . __( 'Card Type
|
| 558 |
<td>
|
| 559 |
<select class='wpsc_ccBox' name='cctype'>";
|
| 560 |
|
| 520 |
|
| 521 |
$output = "
|
| 522 |
<tr>
|
| 523 |
+
<td class='wpsc_CC_details'>" . __( 'Credit Card Number <span class="asterix">*</span>', 'wpsc' ) . "</td>
|
| 524 |
<td>
|
| 525 |
<input type='text' value='' name='card_number' />
|
| 526 |
</td>
|
| 527 |
</tr>
|
| 528 |
<tr>
|
| 529 |
+
<td class='wpsc_CC_details'>" . __( 'Credit Card Expiry <span class="asterix">*</span>', 'wpsc' ) . "</td>
|
| 530 |
<td>
|
| 531 |
<select class='wpsc_ccBox' name='expiry[month]'>
|
| 532 |
" . $months . "
|
| 549 |
</td>
|
| 550 |
</tr>
|
| 551 |
<tr>
|
| 552 |
+
<td class='wpsc_CC_details'>" . __( 'CVV <span class="asterix">*</span>', 'wpsc' ) . "</td>
|
| 553 |
<td><input type='text' size='4' value='' maxlength='4' name='card_code' />
|
| 554 |
</td>
|
| 555 |
</tr>
|
| 556 |
<tr>
|
| 557 |
+
<td class='wpsc_CC_details'>" . __( 'Card Type <span class="asterix">*</span>', 'wpsc' ) . "</td>
|
| 558 |
<td>
|
| 559 |
<select class='wpsc_ccBox' name='cctype'>";
|
| 560 |
|
wpsc-merchants/paypal-standard.merchant.php
CHANGED
|
@@ -143,9 +143,9 @@ class wpsc_merchant_paypal_standard extends wpsc_merchant {
|
|
| 143 |
'last_name' => $this->cart_data['billing_address']['last_name'],
|
| 144 |
'address1' => $this->cart_data['billing_address']['address'],
|
| 145 |
'city' => $this->cart_data['billing_address']['city'],
|
| 146 |
-
'state' => $this->cart_data['billing_address']['state'],
|
| 147 |
'zip' => $this->cart_data['billing_address']['post_code'],
|
| 148 |
-
'country' => $this->cart_data['billing_address']['country'],
|
| 149 |
);
|
| 150 |
|
| 151 |
// Shipping
|
| 143 |
'last_name' => $this->cart_data['billing_address']['last_name'],
|
| 144 |
'address1' => $this->cart_data['billing_address']['address'],
|
| 145 |
'city' => $this->cart_data['billing_address']['city'],
|
| 146 |
+
'state' => isset( $this->cart_data['billing_address']['state'] ) ? $this->cart_data['billing_address']['state'] : '',
|
| 147 |
'zip' => $this->cart_data['billing_address']['post_code'],
|
| 148 |
+
'country' => isset( $this->cart_data['billing_address']['country'] ) ? $this->cart_data['billing_address']['country'] : '',
|
| 149 |
);
|
| 150 |
|
| 151 |
// Shipping
|
