Woocommerceチェックアウト:商品をカートの問題に追加するチェックボックス

チャーリー・チャップリン

Woocommerceチェックアウトページの回答コードで商品をカートに追加するチェックボックスフィールドに基づいて、次のコードの試みは完全に機能します。チェックボックスをクリックして特定の商品をカートに追加し、AJAXを介して更新して追加または削除することができます。クリックされたかどうかに基づいた製品。

私が抱えている問題は、抜け穴があるということです。顧客がチェックアウトページを更新すると、チェックボックスはオフに戻り、顧客は2番目以上の製品を追加できます(更新を続ける場合)。

特定の商品がカートに入っているかどうかをチェックする機能もあり、正常に動作します。私がやってのけることができないように見えるのはこれです...

チェックアウトが読み込まれたときにその特定の商品がカートに入っている場合は、カスタムチェックボックスのデフォルトの状態をチェックする必要があります。

以下のチェックボックスコード:

// -----------------------------------------
// 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;
}
LoicTheAztec

カスタムコードの代わりに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」を複数回追加できないようにする必要があります…

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Woocommerceチェックアウトページで商品をカートに追加するチェックボックスフィールド

分類Dev

WooCommerce:複数の商品の[カートに追加]ボタンのテキストを変更し、チェックアウトにリダイレクトします

分類Dev

カートに商品を追加する前に、Woocommerce必須チェックボックス

分類Dev

Woocommerceカートとチェックアウトに商品の商品カテゴリ名を表示する

分類Dev

WooCommerceのチェックアウトの問題に商品の販売価格を表示する

分類Dev

特定の商品カテゴリの[チェックアウトに進む]ボタンにカスタムURLを追加する方法[WooCommerce]

分類Dev

Woocommerceカートとチェックアウトに商品のサムネイルと属性を表示する

分類Dev

Woocommerceカートとチェックアウトに特定の親商品属性を表示する

分類Dev

カスタム「woocommerce_variation_option」に基づいてWooCommerceチェックアウトページにチェックボックスを追加します

分類Dev

Woocommerceのチェックアウトフィールドを表示/非表示にするチェックボックスを追加します

分類Dev

Woocommerceの商品カテゴリに基づいてカスタムチェックアウトフィールドを追加する

分類Dev

特定のカテゴリのWooCommerceチェックアウトでパーセンテージ割引を有効にするチェックボックス

分類Dev

Woocommerceでカスタムチェックアウトフィールドを追加するときに空白のチェックアウトページ

分類Dev

Woocommerceチェックアウトページの[アカウントの作成]チェックボックスを移動する方法

分類Dev

Woocommerceカートのチェックアウトと注文で特定の商品の商品名リンクを無効にする

分類Dev

WooCommerceのカスタムチェックアウト選択フィールドの追加と処理に関する問題

分類Dev

Woocommerceチェックアウトページに料金を追加するチェックボックスを表示します

分類Dev

WoocommerceのヨーロッパGDPR追加チェックアウト検証チェックボックス

分類Dev

Woocommerceチェックアウトで特定の商品カテゴリのVATを条件付きで無効にする

分類Dev

特定の商品がWoocommerceのカートに入っている場合は、カスタムチェックアウトフィールドを表示します

分類Dev

WooCommerceチェックアウトの[注文する]ボタンの下にテキストを追加します

分類Dev

WooCommerceカートページに料金を追加するカスタムチェックボックス

分類Dev

WooCommerce:特定の商品IDがカートに入っている場合、カスタムチェックアウトフィールドを表示します

分類Dev

WooCommerceのカスタムカートに追加ボタンでチェックアウトにリダイレクトする方法

分類Dev

ペイパルエクスプレスチェックアウトに複数の商品を追加する

分類Dev

ペイパルエクスプレスチェックアウトに複数の商品を追加する

分類Dev

WooCommerceのマイアカウント「アカウントの詳細」にチェックボックスを追加します

分類Dev

WooCommerceのチェックアウトページにカスタム商品フィールドを表示するにはどうすればよいですか?

分類Dev

カートアイテムの在庫問題で、WooCommerce注文チェックアウトボタンを無効にします

Related 関連記事

  1. 1

    Woocommerceチェックアウトページで商品をカートに追加するチェックボックスフィールド

  2. 2

    WooCommerce:複数の商品の[カートに追加]ボタンのテキストを変更し、チェックアウトにリダイレクトします

  3. 3

    カートに商品を追加する前に、Woocommerce必須チェックボックス

  4. 4

    Woocommerceカートとチェックアウトに商品の商品カテゴリ名を表示する

  5. 5

    WooCommerceのチェックアウトの問題に商品の販売価格を表示する

  6. 6

    特定の商品カテゴリの[チェックアウトに進む]ボタンにカスタムURLを追加する方法[WooCommerce]

  7. 7

    Woocommerceカートとチェックアウトに商品のサムネイルと属性を表示する

  8. 8

    Woocommerceカートとチェックアウトに特定の親商品属性を表示する

  9. 9

    カスタム「woocommerce_variation_option」に基づいてWooCommerceチェックアウトページにチェックボックスを追加します

  10. 10

    Woocommerceのチェックアウトフィールドを表示/非表示にするチェックボックスを追加します

  11. 11

    Woocommerceの商品カテゴリに基づいてカスタムチェックアウトフィールドを追加する

  12. 12

    特定のカテゴリのWooCommerceチェックアウトでパーセンテージ割引を有効にするチェックボックス

  13. 13

    Woocommerceでカスタムチェックアウトフィールドを追加するときに空白のチェックアウトページ

  14. 14

    Woocommerceチェックアウトページの[アカウントの作成]チェックボックスを移動する方法

  15. 15

    Woocommerceカートのチェックアウトと注文で特定の商品の商品名リンクを無効にする

  16. 16

    WooCommerceのカスタムチェックアウト選択フィールドの追加と処理に関する問題

  17. 17

    Woocommerceチェックアウトページに料金を追加するチェックボックスを表示します

  18. 18

    WoocommerceのヨーロッパGDPR追加チェックアウト検証チェックボックス

  19. 19

    Woocommerceチェックアウトで特定の商品カテゴリのVATを条件付きで無効にする

  20. 20

    特定の商品がWoocommerceのカートに入っている場合は、カスタムチェックアウトフィールドを表示します

  21. 21

    WooCommerceチェックアウトの[注文する]ボタンの下にテキストを追加します

  22. 22

    WooCommerceカートページに料金を追加するカスタムチェックボックス

  23. 23

    WooCommerce:特定の商品IDがカートに入っている場合、カスタムチェックアウトフィールドを表示します

  24. 24

    WooCommerceのカスタムカートに追加ボタンでチェックアウトにリダイレクトする方法

  25. 25

    ペイパルエクスプレスチェックアウトに複数の商品を追加する

  26. 26

    ペイパルエクスプレスチェックアウトに複数の商品を追加する

  27. 27

    WooCommerceのマイアカウント「アカウントの詳細」にチェックボックスを追加します

  28. 28

    WooCommerceのチェックアウトページにカスタム商品フィールドを表示するにはどうすればよいですか?

  29. 29

    カートアイテムの在庫問題で、WooCommerce注文チェックアウトボタンを無効にします

ホットタグ

アーカイブ