fix: remap add-to-cart→product_id for AJAX, fallback zone detection for guest FSN amount
This commit is contained in:
@@ -113,7 +113,17 @@
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$btn.addClass( 'loading' ).data( 'cgkit-fc-handled', true );
|
$btn.addClass( 'loading' ).data( 'cgkit-fc-handled', true );
|
||||||
|
|
||||||
$.post( ajaxUrl, $form.serialize() )
|
// WC's wc-ajax=add_to_cart reads $_POST['product_id'], but the
|
||||||
|
// single-product form submits the ID as field name 'add-to-cart'.
|
||||||
|
// Append the correctly-named field so the endpoint finds it.
|
||||||
|
var serialized = $form.serialize();
|
||||||
|
var productId = $form.find( '[name="add-to-cart"]' ).val() ||
|
||||||
|
$form.find( '[name="product_id"]' ).val() || '';
|
||||||
|
if ( productId && serialized.indexOf( 'product_id=' ) === -1 ) {
|
||||||
|
serialized += '&product_id=' + encodeURIComponent( productId );
|
||||||
|
}
|
||||||
|
|
||||||
|
$.post( ajaxUrl, serialized )
|
||||||
.done( function ( response ) {
|
.done( function ( response ) {
|
||||||
if ( ! response ) {
|
if ( ! response ) {
|
||||||
self.formFallback( $form, $btn );
|
self.formFallback( $form, $btn );
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* Plugin Name: CommerceKit Floating Cart
|
* Plugin Name: CommerceKit Floating Cart
|
||||||
* Plugin URI: https://www.commercegurus.com
|
* Plugin URI: https://www.commercegurus.com
|
||||||
* Description: Adds a floating cart icon (bottom-right) and auto-opens the CommerceKit minicart after add to cart. Requires CommerceGurus CommerceKit and WooCommerce.
|
* Description: Adds a floating cart icon (bottom-right) and auto-opens the CommerceKit minicart after add to cart. Requires CommerceGurus CommerceKit and WooCommerce.
|
||||||
* Version: 1.1.0
|
* Version: 1.1.1
|
||||||
* Author: CommerceGurus
|
* Author: CommerceGurus
|
||||||
* Author URI: https://www.commercegurus.com
|
* Author URI: https://www.commercegurus.com
|
||||||
* License: GPLv3
|
* License: GPLv3
|
||||||
@@ -19,7 +19,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
define( 'CGKIT_FC_VERSION', '1.1.0' );
|
define( 'CGKIT_FC_VERSION', '1.1.1' );
|
||||||
define( 'CGKIT_FC_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
define( 'CGKIT_FC_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
||||||
define( 'CGKIT_FC_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
define( 'CGKIT_FC_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
||||||
|
|
||||||
@@ -56,6 +56,61 @@ add_filter( 'option_commercekit', function ( $options ) {
|
|||||||
return $options;
|
return $options;
|
||||||
}, 1 );
|
}, 1 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fallback free-shipping amount for guests / users without a shipping address.
|
||||||
|
*
|
||||||
|
* CommerceKit bails with `if (!$free_amount) return ''` BEFORE it reaches the
|
||||||
|
* `fsn_before_ship` check. The bail happens because for guests WooCommerce zone
|
||||||
|
* detection falls back to "Rest of World" (empty destination in session), which
|
||||||
|
* often has no free_shipping method → amount stays 0.
|
||||||
|
*
|
||||||
|
* Fix: if the amount is still 0 after CommerceKit's own lookup, redo the zone
|
||||||
|
* detection using the shop's base country/state so we always resolve against
|
||||||
|
* the same zone as a logged-in customer in the store's home country.
|
||||||
|
*/
|
||||||
|
add_filter( 'commercekit_fsn_get_cart_options', function ( array $options ): array {
|
||||||
|
// Amount already resolved — nothing to do.
|
||||||
|
if ( $options['amount'] > 0 ) {
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-run zone detection with the store base location.
|
||||||
|
$fake_package = [
|
||||||
|
'destination' => [
|
||||||
|
'country' => WC()->countries->get_base_country(),
|
||||||
|
'state' => WC()->countries->get_base_state(),
|
||||||
|
'postcode' => '',
|
||||||
|
'city' => '',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$zone = wc_get_shipping_zone( $fake_package );
|
||||||
|
$th_sep = wc_get_price_thousand_separator();
|
||||||
|
$dc_sep = wc_get_price_decimal_separator();
|
||||||
|
|
||||||
|
foreach ( $zone->get_shipping_methods( true ) as $method ) {
|
||||||
|
if ( 'free_shipping' !== $method->id ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$instance = $method->instance_settings ?? [];
|
||||||
|
$amount = isset( $instance['min_amount'] ) ? $instance['min_amount'] : 0;
|
||||||
|
$requires = isset( $instance['requires'] ) ? $instance['requires'] : '';
|
||||||
|
$amount = floatval( str_replace( $dc_sep, '.', str_replace( $th_sep, '', $amount ) ) );
|
||||||
|
|
||||||
|
// Only use this fallback when the method just needs a minimum order
|
||||||
|
// amount — coupon-gated thresholds can't be shown without a coupon.
|
||||||
|
if ( $amount > 0 && 'min_amount' === $requires ) {
|
||||||
|
$options['amount'] = $amount;
|
||||||
|
$options['requires'] = $requires;
|
||||||
|
$options['shipping'] = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $options;
|
||||||
|
}, 10 );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main plugin class.
|
* Main plugin class.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user