Woocommerce 结帐:将产品添加到购物车问题的复选框
Woocommerce checkout: Checkbox that adds a product to cart issue
基于 答案代码,我的以下代码尝试完美运行:它允许客户通过单击复选框将特定产品添加到购物车,这然后通过 AJAX 更新以根据产品是否被点击来添加或删除产品。
我遇到的问题是存在漏洞。如果客户刷新结帐页面,复选框将恢复为未选中状态并允许客户添加第二个或更多产品(如果他们不断刷新)。
我还有一个功能可以检查特定产品是否在购物车中,而且效果很好。我似乎无法完成的是这个...
如果加载结帐时该特定产品在购物车中,则应选中自定义复选框的默认状态。
复选框代码如下:
// -----------------------------------------
// ADD A product TO THE CHECKOUT PAGE
$surprise_product_activated = get_field( 'surprise_product_activated', 'options' );
$surprise_product = get_field( 'surprise_product', 'options' );
if ( $surprise_product_activated == true ) {
// Display a custom checkout field
add_action( 'woocommerce_before_order_notes', 'add_a_product' , 10, 2 );
}
function add_a_product() {
$value = WC()->session->get('add_a_product');
$surprise_product = get_field( 'surprise_product', 'options' );
$product = wc_get_product( $surprise_product );
$price = $product->get_price();
woocommerce_form_field( 'cb_add_product', array(
'type' => 'checkbox',
'label' => '<div class="specialty-container f-grey"><div class="custom-checkbox float-right">
<input type="checkbox" id="animated-checkbox" />
<svg viewBox="0 0 35.6 35.6">
<circle class="background" cx="17.8" cy="17.8" r="17.8"></circle>
<circle class="stroke" cx="17.8" cy="17.8" r="14.37"></circle>
<polyline class="check" points="11.78 18.12 15.55 22.23 25.17 12.87"></polyline>
</svg></div> <span class="specialty-product clearfix"><span class="special-offer">Special Offer</span><br>' . __('Add a <strong>Surprise product</strong> for just ') . '<strong class="f-purple">$' . $price . '?</strong></span></div>',
'class' => array('form-row-wide five-dollar-product'),
), $value == 'yes' ? true : false );
}
// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_custom_jquery_script' );
function checkout_custom_jquery_script() {
// Only checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// Remove "ship_different" custom WC session on load
if( WC()->session->get('add_a_product') ){
WC()->session->__unset('add_a_product');
}
if( WC()->session->get('product_added_key') ){
WC()->session->__unset('product_added_key');
}
// jQuery Ajax code
?>
<script type="text/javascript">
jQuery( function($){
if (typeof wc_checkout_params === 'undefined')
return false;
$('form.checkout').on( 'change', '#animated-checkbox', function(){
var value = $(this).prop('checked') === true ? 'yes' : 'no';
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'add_a_product',
'add_a_product': value,
},
success: function (result) {
$('body').trigger('update_checkout');
console.log(result);
}
});
});
});
</script>
<?php
endif;
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_add_a_product', 'checkout_ajax_add_a_product' );
add_action( 'wp_ajax_nopriv_add_a_product', 'checkout_ajax_add_a_product' );
function checkout_ajax_add_a_product() {
if ( isset($_POST['add_a_product']) ){
WC()->session->set('add_a_product', esc_attr($_POST['add_a_product']));
echo $_POST['add_a_product'];
}
die();
}
// Add remove free product
add_action( 'woocommerce_before_calculate_totals', 'adding_removing_specific_product' );
function adding_removing_specific_product( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$surprise_product = get_field( 'surprise_product', 'options' );
// HERE the specific Product ID
$product_id = $surprise_product;
if( WC()->session->get('add_a_product') == 'yes' && ! WC()->session->get('product_added_key') )
{
$cart_item_key = $cart->add_to_cart( $product_id );
WC()->session->set('product_added_key', $cart_item_key);
}
elseif( WC()->session->get('add_a_product') == 'no' && WC()->session->get('product_added_key') )
{
$cart_item_key = WC()->session->get('product_added_key');
$cart->remove_cart_item( $cart_item_key );
WC()->session->__unset('product_added_key');
}
}
并检查产品是否已在购物车中:
// -----------------------------------------
// CHECK IF PRODUCT ALREADY IN CART
// -----------------------------------------
function woo_in_cart($product_id) {
global $woocommerce;
foreach($woocommerce->cart->get_cart() as $key => $val ) {
$_product = $val['data'];
if($product_id == $_product->id ) {
return true;
}
}
return false;
}
由于您使用的是 ACF 而不是自定义代码,因此您的代码并不是真正可全局测试的。
为避免结帐重新加载问题,请尝试在 checkout_custom_jquery_script()
函数中替换:
if( WC()->session->get('product_added_key') ){
WC()->session->__unset('product_added_key');
}
作者:
if( $cart_item_key = WC()->session->get('product_added_key') ){
WC()->cart->remove_cart_item( $cart_item_key );
WC()->session->__unset('product_added_key');
}
它应该避免客户在重新加载结帐页面时能够多次添加“surprise_product”…
基于
我遇到的问题是存在漏洞。如果客户刷新结帐页面,复选框将恢复为未选中状态并允许客户添加第二个或更多产品(如果他们不断刷新)。
我还有一个功能可以检查特定产品是否在购物车中,而且效果很好。我似乎无法完成的是这个...
如果加载结帐时该特定产品在购物车中,则应选中自定义复选框的默认状态。
复选框代码如下:
// -----------------------------------------
// ADD A product TO THE CHECKOUT PAGE
$surprise_product_activated = get_field( 'surprise_product_activated', 'options' );
$surprise_product = get_field( 'surprise_product', 'options' );
if ( $surprise_product_activated == true ) {
// Display a custom checkout field
add_action( 'woocommerce_before_order_notes', 'add_a_product' , 10, 2 );
}
function add_a_product() {
$value = WC()->session->get('add_a_product');
$surprise_product = get_field( 'surprise_product', 'options' );
$product = wc_get_product( $surprise_product );
$price = $product->get_price();
woocommerce_form_field( 'cb_add_product', array(
'type' => 'checkbox',
'label' => '<div class="specialty-container f-grey"><div class="custom-checkbox float-right">
<input type="checkbox" id="animated-checkbox" />
<svg viewBox="0 0 35.6 35.6">
<circle class="background" cx="17.8" cy="17.8" r="17.8"></circle>
<circle class="stroke" cx="17.8" cy="17.8" r="14.37"></circle>
<polyline class="check" points="11.78 18.12 15.55 22.23 25.17 12.87"></polyline>
</svg></div> <span class="specialty-product clearfix"><span class="special-offer">Special Offer</span><br>' . __('Add a <strong>Surprise product</strong> for just ') . '<strong class="f-purple">$' . $price . '?</strong></span></div>',
'class' => array('form-row-wide five-dollar-product'),
), $value == 'yes' ? true : false );
}
// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_custom_jquery_script' );
function checkout_custom_jquery_script() {
// Only checkout page
if( is_checkout() && ! is_wc_endpoint_url() ):
// Remove "ship_different" custom WC session on load
if( WC()->session->get('add_a_product') ){
WC()->session->__unset('add_a_product');
}
if( WC()->session->get('product_added_key') ){
WC()->session->__unset('product_added_key');
}
// jQuery Ajax code
?>
<script type="text/javascript">
jQuery( function($){
if (typeof wc_checkout_params === 'undefined')
return false;
$('form.checkout').on( 'change', '#animated-checkbox', function(){
var value = $(this).prop('checked') === true ? 'yes' : 'no';
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'add_a_product',
'add_a_product': value,
},
success: function (result) {
$('body').trigger('update_checkout');
console.log(result);
}
});
});
});
</script>
<?php
endif;
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_add_a_product', 'checkout_ajax_add_a_product' );
add_action( 'wp_ajax_nopriv_add_a_product', 'checkout_ajax_add_a_product' );
function checkout_ajax_add_a_product() {
if ( isset($_POST['add_a_product']) ){
WC()->session->set('add_a_product', esc_attr($_POST['add_a_product']));
echo $_POST['add_a_product'];
}
die();
}
// Add remove free product
add_action( 'woocommerce_before_calculate_totals', 'adding_removing_specific_product' );
function adding_removing_specific_product( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$surprise_product = get_field( 'surprise_product', 'options' );
// HERE the specific Product ID
$product_id = $surprise_product;
if( WC()->session->get('add_a_product') == 'yes' && ! WC()->session->get('product_added_key') )
{
$cart_item_key = $cart->add_to_cart( $product_id );
WC()->session->set('product_added_key', $cart_item_key);
}
elseif( WC()->session->get('add_a_product') == 'no' && WC()->session->get('product_added_key') )
{
$cart_item_key = WC()->session->get('product_added_key');
$cart->remove_cart_item( $cart_item_key );
WC()->session->__unset('product_added_key');
}
}
并检查产品是否已在购物车中:
// -----------------------------------------
// CHECK IF PRODUCT ALREADY IN CART
// -----------------------------------------
function woo_in_cart($product_id) {
global $woocommerce;
foreach($woocommerce->cart->get_cart() as $key => $val ) {
$_product = $val['data'];
if($product_id == $_product->id ) {
return true;
}
}
return false;
}
由于您使用的是 ACF 而不是自定义代码,因此您的代码并不是真正可全局测试的。
为避免结帐重新加载问题,请尝试在 checkout_custom_jquery_script()
函数中替换:
if( WC()->session->get('product_added_key') ){
WC()->session->__unset('product_added_key');
}
作者:
if( $cart_item_key = WC()->session->get('product_added_key') ){
WC()->cart->remove_cart_item( $cart_item_key );
WC()->session->__unset('product_added_key');
}
它应该避免客户在重新加载结帐页面时能够多次添加“surprise_product”…