Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Woocommerce签出:将产品添加到购物车问题的复选框_Php_Jquery_Ajax_Session_Woocommerce - Fatal编程技术网

Php Woocommerce签出:将产品添加到购物车问题的复选框

Php Woocommerce签出:将产品添加到购物车问题的复选框,php,jquery,ajax,session,woocommerce,Php,Jquery,Ajax,Session,Woocommerce,基于应答代码,我的以下代码尝试非常有效:它允许客户通过单击复选框将特定产品添加到购物车中,然后通过AJAX进行更新,根据是否单击该产品来添加或删除该产品 我面临的问题是存在漏洞。如果客户刷新签出页面,复选框将恢复为未选中状态,并允许客户添加第二个或更多产品(如果他们继续刷新) 我还有一个功能,可以检查购物车中是否有特定的产品,而且工作正常。我似乎做不到的是 如果在签出加载时该特定产品在购物车中,则应选中自定义复选框的默认状态 下面的复选框代码: // ----------------------

基于应答代码,我的以下代码尝试非常有效:它允许客户通过单击复选框将特定产品添加到购物车中,然后通过AJAX进行更新,根据是否单击该产品来添加或删除该产品

我面临的问题是存在漏洞。如果客户刷新签出页面,复选框将恢复为未选中状态,并允许客户添加第二个或更多产品(如果他们继续刷新)

我还有一个功能,可以检查购物车中是否有特定的产品,而且工作正常。我似乎做不到的是

如果在签出加载时该特定产品在购物车中,则应选中自定义复选框的默认状态

下面的复选框代码:

// -----------------------------------------
// ADD A $5 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>&nbsp;&nbsp;<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\u custom\u jquery\u script()
函数中替换:

if( WC()->session->get('product_added_key') ){
    WC()->session->__unset('product_added_key');
}
作者:


它应该避免客户在重新加载结账页面时多次添加“惊喜产品”…

嘿,谢谢。它似乎在刷新时保持选中标记,但是在AJAX刷新后(页面加载后大约一秒钟),产品会将自己从购物车中移除,而选中标记保持选中状态。在第二段代码中,它中断了,我在日志中得到了错误:PHP解析错误:语法错误,unexpected'),expected'[”在C:\wamp64\www\soundpiece\wp content\themes\soundpiece\functions.php的第行3211@CharlieChaplin更新:所以请保留第一条建议…同时,当使用一些现有代码时,请在问题中始终提及您的代码。如果此答案回答了您的问题,您可以请回答,谢谢。
if( $cart_item_key = WC()->session->get('product_added_key') ){
    WC()->cart->remove_cart_item( $cart_item_key );
    WC()->session->__unset('product_added_key');
}