source

카트 항목 메타 업데이트 방법 - woocommerce

nicesource 2023. 3. 15. 19:45
반응형

카트 항목 메타 업데이트 방법 - woocommerce

할 수 은 우커머스 아이템을 사용하는 으로 알고 .woocommerce_add_cart_item_data

기존 카트 아이템 메타 업데이트 방법이 있나요?

네, 하지만 카트에 직접 접속해야 할 것 같습니다.

global $woocommerce;
$woocommerce->cart->cart_contents[$cart_item_key]['whatever_meta'] = 'testing';
$woocommerce->cart->set_session();   // when in ajax calls, saves it.

(Phong Tran의 답변과 같이) 다른 메타데이터가 손실될 수 있으므로 제품을 삭제하고 다시 추가할 것을 권장합니다.

@Daniel Salcedos의 답변을 바탕으로 질문에 답변하는 데 필요한 최소한의 사항만 유지합니다.

오랜 시간이 흘렀지만 아직도 답이 안 나오고 땀도 많이 흘리고 피도 1파인트나 흘렸기 때문에 이 자리에서 해결책을 제시하겠습니다.

첫번째

메타데이터를 카트와 주문에 추가하는 방법을 알고 있을 것입니다.그렇지 않다면 pwnwbie의 솔루션을 볼 수 있지만 Wisdm labs의 전문 기사를 추천합니다.

Wisdm wis wis wis wis wis wis wis wis wis wis wis wis wis wisAjax는 PHP를 사용합니다. 번째, 감청, 감청woocommerce_add_cart_item_datafilter 를를를 filter filter filter filter 、 woocommerce oc filter filter 。

woocommerce_add_cart_item_data는, 「」, 「중간」, 「중간」, 「중간」의로 실행됩니다.add to cart들어 메인(메인)에를 추가하는 $wooocmmerce오브젝트는 어느 시점에서 카트 추가 이벤트로 저장됩니다.(일부)

아이디어

표준 카트 속성이 아닌 메타데이터를 편집하려면 어떻게 해야 합니까?이상적으로는 저장 중에 실행되는 필터나 액션을 얻는 것입니다. 한 도망갈 수 입니다.woocommerce_update_cart_action_cart_updated 및 후에 때문에 실행되지 .)

나의 접근법

셸에서는 필요한 만큼 가능한 한 적게 재구축합니다.카트 폼 OnSubmit 이벤트에 동기 Ajax 이벤트를 추가했습니다.(변경사항으로 UI를 업데이트하고 싶기 때문에 새로고침은 업데이트 후에 해야 합니다.)

AJAX:

var myFlag33322805 = true;
$('form').submit(function(e){
if(myFlag33322805){
    myFlag33322805 = false;
    e.preventDefault();     // Flag and prevent default to syncronize submits
    var kart = [];          // Will retrieve every cart item's meta

    $('.cartRow').each(function(){
    //This object will store your meta data and be pushed into kart array
    var kitm = {
        'p' : $(this).data('product_id'),
        'm' : $(this).find('select[name=myMetaData]').val(),
        'k' : $(this).data('key')
    };
    kart.push(kitm);
    });

    var data = {
    'action': 'Ajax_Update_My_MetaData_33322805',
    'k': kart
    };
    $.post(VKVAjax.ajaxurl, data, function (response) {
       // Might do something with the response here
    });
    $('form').submit();  // This time, the form will submit, but AJAX wont run because of myFlag33322805 = false
}
}); 

매직:

를 수신하는 php ajax를 합니다.$woocommerceobject: 메타 데이터를 삽입하고 세션에 저장합니다.

PHP:

function fn_Update_My_MetaData_33322805(){
global $woocommerce;
$cart = $woocommerce->cart->cart_contents;
$updt = Array();
foreach ($_POST['k'] AS $item){
    $product = new stdClass();
    $updtCL = new stdClass();
    $product->{'id'} = $item['p'];          //This is product id
    $product->{'mymeta'} = $item['m'];      //This is metadata
    $updtCL->{'krtkey'} = $item['k'];       //This is product key in cart
    $updtCL->{'meta'} = $product;
    $updt[] = $updtCL;
}

// cycle the cart replace the meta of the correspondant key
foreach ($cart as $key => $item) {
    foreach($updt as $updtitem){
        if($key == $updtitem->krtkey){      // if this kart item corresponds with the received, the meta data is updated
            // Update the content of the kart
            $woocommerce->cart->cart_contents[$key]['vkv_AlternCart_value'] = $updtitem->meta;
        }
    }
}

// This is the magic: With this function, the modified object gets saved.
$woocommerce->cart->set_session();

wp_die('{"e":"ok", "Updt": "'.count($arrupdt).'"}');
}

물론, 이것은 다른 아약스 이벤트와 마찬가지로 잠궈야 한다.

add_action('wp_ajax_nopriv_Ajax_Update_My_MetaData_33322805', 'fn_Ajax_Update_My_MetaData_33322805');
add_action('wp_ajax_Ajax_Update_My_MetaData_33322805',  'fn_Ajax_Update_My_MetaData_33322805');

결론

하여 카트 항목의 할 수 있으며 는 Ajax에 .$woocommerce할 수 있습니다.$woocommerce->cart->set_session();★★★★★★ 。

각주

이상적인하는 것은 합니다.또한 이 방법을 사용하여$woocommerce 방법을 .더 나은 방법을 알고 싶습니다.

저는 초보이고 영어를 잘 못해서 답이 좀 헷갈릴 수도 있어요.

조언해 주셔서 감사합니다.

나의 접근법:

Daniel Salcedo와 마찬가지로 woocommerce_sessions를 편집하여 메타데이터를 변경하려고 하는데 문제가 있습니다.장바구니에 아이템을 추가할 때 woocommerce는 md5(product_id + ...)에 의해 해당 아이템에 대한 고유한 cart_item_key를 작성합니다.+ 메타데이터)에서 이 cart_item_key가 이미 존재하는지 확인합니다.사용 가능한 경우 이 항목은 수량이 갱신됩니다.그렇지 않으면 새 항목이 생성됩니다.

즉, 모자 제품의 메타 값을 파란색에서 빨간색으로 변경한 다음 모자 제품을 파란색으로 추가하면 새 아이템 블루 모자를 만드는 대신 빨간색 모자만 늘어나므로 카트를 올바르게 업데이트하려면 cart_item_key를 변경해야 합니다.

cart_item_key를 변경하는 것은 매우 위험합니다.대신 제품을 삭제하고 다시 추가할 수 있습니다.이것처럼.

// get cart_item_key of item you want to change
$cart_item_key_old = $_POST['cart_item_key']; 

// retrieve its information
$cart_item_old = WC()->cart->cart_contents[ $cart_item_key_old ];
$product_id_old = $cart_item_old['product_id'];
$quantity_old = $cart_item_old['quantity'];
$variation_id_old = $cart_item_old['variation_id'];
$variation_old = $cart_item_old['variation'];

// creating a cart_item_key with the same information except metadata
$cart_item_key_new = WC()->cart->generate_cart_id( $product_id_old, $variation_id_old, $variation_old, ['color'=>'red'] );
// check new cart_item_key already exists
$found = WC()->cart->find_product_in_cart( $cart_item_key_new );

// if true, update its quantity
if ($found != '') {
    $new_quantity = $cart_item_old['quantity'] + WC()->cart->cart_contents[ $cart_item_key_new ]['quantity'];
    WC()->cart->set_quantity( $cart_item_key_new, $new_quantity );
}
// else, re-add with new metadata
else {
    WC()->cart->add_to_cart($product_id_old, $quantity_old, $variation_id_old, $variation_old, ['color'=>'red'] );
}

// finally delete the old item
WC()->cart->remove_cart_item($cart_item_key_old);

wp_die();

주의: 위의 Ajax 실행 후 페이지 리프레쉬가 아닌 카트 폼을 제출하는 경우 woocommerce update_cart 시 set_quantity 메서드에 의해 아이템의 수량이 덮어쓰기 됩니다.이 경우 new_quantity를 반환하고 입력값을 js만큼 변경한 후 폼을 제출하면 됩니다.

풀코드:

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    ...
    ?>
    <!-- place it anywhere within the foreach -->
    <div class="box-type-field">
        <select class="box-type" name="box-type" cart_item_key="<?php echo $cart_item_key ?>">
            <option <?php echo $cart_item['box-type']=='boxes'?"selected":""; ?> value="boxes"><?php _e( 'Boxes', 'woocommerce' ); ?></option>
            <option <?php echo $cart_item['box-type']=='bags'?"selected":""; ?> value="bags"><?php _e( 'Bags', 'woocommerce' ); ?></option>
        </select>
    </div>
    <?php
    ...
}

AJAX:

$('.box-type-field .box-type').live('change', function () {
    var cartItemKey = $(this).attr("cart_item_key");
    var boxType = $(this).val();
    $.ajax({
        type : "post", 
        url : '<?php echo admin_url('admin-ajax.php');?>',
        datatype: 'json',
        data : {
            action : "update_cart_boxtype",
            cart_item_key : cartItemKey,
            box_type : boxType,
        },
        success: function(cartItem) {
            cartItemKey = cartItem[0];
            cartItemQty = cartItem[1];
            if (cartItem) $('input[name="cart['+cartItemKey+'][qty]"]').val(cartItemQty); // update quantity 

            $('.woocommerce-cart-form button[type="submit"]').click(); // submit form
        }
    })
})

PHP:

add_action( 'wp_ajax_update_cart_boxtype', 'update_cart_boxtype_init' );
add_action( 'wp_ajax_nopriv_update_cart_boxtype', 'update_cart_boxtype_init' );
function update_cart_boxtype_init() {
    if ( ! WC()->cart->is_empty() ) {
        $cart_item_key = (isset($_POST['cart_item_key']))?$_POST['cart_item_key'] : '';
        $cart_item = WC()->cart->cart_contents[ $cart_item_key ];
        $box_type = (isset($_POST['box_type']))?$_POST['box_type'] : '';
        $cart_updated = false;

        $cart_item_key_new = WC()->cart->generate_cart_id( $cart_item['product_id'], $cart_item['variation_id'], $cart_item['variation'], ['box-type'=>$box_type] );

        $found = WC()->cart->find_product_in_cart( $cart_item_key_new );

        if ($found != '') {
            $new_qty = $cart_item['quantity'] + WC()->cart->cart_contents[ $cart_item_key_new ]['quantity'];
            WC()->cart->remove_cart_item($cart_item_key);
            wp_send_json_success([$cart_item_key_new, $new_qty]);
        } else {
            WC()->cart->add_to_cart($cart_item['product_id'], $cart_item['quantity'], $cart_item['variation_id'], $cart_item['variation'], ['box-type' => $box_type]);
            $cart_updated = true;
            WC()->cart->remove_cart_item($cart_item_key);
            wp_send_json_success(false);
        }
    }
    wp_die();
}

순서 1: 커스텀 세션에서 데이터 추가, '카트에 추가' 버튼 클릭

WooCommerce를 사용해 보신 분들은 '카트에 추가' 버튼을 클릭하시면 제품 페이지가 새로 고쳐지고 사용자 데이터가 손실된다는 것을 아실 것입니다.따라서 제품 페이지의 커스텀 데이터를 Ajax를 사용하여 작성한 커스텀 세션에 추가해야 합니다.이 코드는 WooCommerce 세션이 생성되기 전에 호출됩니다.

<?php
add_action('wp_ajax_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback');
add_action('wp_ajax_nopriv_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback');

function wdm_add_user_custom_data_options_callback()
{
      //Custom data - Sent Via AJAX post method
      $product_id = $_POST['id']; //This is product ID
      $user_custom_data_values =  $_POST['user_data']; //This is User custom value sent via AJAX
      session_start();
      $_SESSION['wdm_user_custom_data'] = $user_custom_data_values;
      die();
}

순서 2: WooCommerce 세션에서 커스텀 데이터 추가

이 단계에서 WooCommerce 세션이 생성되어 커스텀 데이터를 추가할 수 있게 되었습니다.다음 코드를 사용하여 작성한 세션의 커스텀 데이터를 WooCommerce 세션에 추가합니다.이 단계에서는 세션 내의 데이터가 캡처되어 더 이상 필요하지 않기 때문에 세션도 설정 해제됩니다.

add_filter('woocommerce_add_cart_item_data','wdm_add_item_data',1,2);

if(!function_exists('wdm_add_item_data'))
{
    function wdm_add_item_data($cart_item_data,$product_id)
    {
        /*Here, We are adding item in WooCommerce session with, wdm_user_custom_data_value name*/
        global $woocommerce;
        session_start();    
        if (isset($_SESSION['wdm_user_custom_data'])) {
            $option = $_SESSION['wdm_user_custom_data'];       
            $new_value = array('wdm_user_custom_data_value' => $option);
        }
        if(empty($option))
            return $cart_item_data;
        else
        {    
            if(empty($cart_item_data))
                return $new_value;
            else
                return array_merge($cart_item_data,$new_value);
        }
        unset($_SESSION['wdm_user_custom_data']); 
        //Unset our custom session variable, as it is no longer needed.
    }
}

순서 3: WooCommerce 세션에서 커스텀 데이터를 추출하여 Cart 객체에 삽입합니다.

이 단계에서는 WooCommerce 세션의 커스텀 데이터와 함께 기본 제품 세부 정보가 있습니다.플러그인이 제공하는 기능으로 인해 기본 데이터가 카트 개체에 추가됩니다.단, WooCommerce 세션에서 커스텀 데이터를 명시적으로 추출하여 카트 오브젝트에 삽입해야 합니다.이것은, 다음의 코드로 실장할 수 있습니다.

add_filter('woocommerce_get_cart_item_from_session', 'wdm_get_cart_items_from_session', 1, 3 );
if(!function_exists('wdm_get_cart_items_from_session'))
{
    function wdm_get_cart_items_from_session($item,$values,$key)
    {
        if (array_key_exists( 'wdm_user_custom_data_value', $values ) )
        {
        $item['wdm_user_custom_data_value'] = $values['wdm_user_custom_data_value'];
        }       
        return $item;
    }
}

순서 4: 카트 및 체크아웃 페이지에 사용자 지정 데이터 표시

이제 카트 개체에 커스텀 데이터가 있으므로 이 데이터를 카트 및 체크아웃 페이지에 표시하기만 하면 됩니다.커스텀 데이터가 WooCommerce 세션에서 장바구니에 추가된 후 카트 페이지가 이렇게 표시됩니다.마이카트 페이지

언급URL : https://stackoverflow.com/questions/33322805/how-to-update-cart-item-meta-woocommerce

반응형