programing

카트에 대한 조건부 추가 요금

muds 2023. 6. 15. 22:06
반응형

카트에 대한 조건부 추가 요금

컴퓨터 부품을 판매하는 웹 사이트가 있습니다. 이 웹 사이트에는 "PC 조립하기" 섹션이 있습니다. 사용자가 부품(메인보드 - CPU - RAM 등)을 선택하여 가격을 지불하고 조립된 제품을 받을 수 있습니다. 모든 것이 정상적으로 작동하지만 카트에 "조립 비용"을 추가하는 옵션이 필요합니다.이 수수료는 사용자가 "PC 조립" 마법사 과정을 거친 경우에만 추가되어야 합니다.저는 이 코드를 사용하고 있지만 모든 카트에 추가됩니다. 조건부가 아닙니다.

public function calculate_fees( $fees ){
    global $woocommerce;

    $cart_subtotal   = $woocommerce->cart->subtotal;
    $additional_fee = 0; // Additional fee
    $additional_fee_text = __('Assembling fee : ', 'dornaweb');

    if( $_POST['assembly_fee'] === 'flat_assembly_rate' ){
        $additional_fee = intval( dw_option('flat_assembly_rate') ) ?: 0; // flat assembly fee
        $additional_fee_text .= __(' ( assembly, no warranty )', 'dornaweb');
    } elseif( $_POST['assembly_fee'] === 'percentage_assembly_fee' ) {
        $additional_fee = dw_option('percentage_assembly_fee') ? ( ( intval( dw_option('percentage_assembly_fee') ) / 100 ) * $cart_subtotal ) : 0; // percentage assembly fee
        $additional_fee_text .= __(' ( assembly + one year warranty )', 'dornaweb');
    }

    $woocommerce->cart->add_fee( $additional_fee_text, intval( $additional_fee ), 1 );
}

그리고 위에constructor:

add_action( 'woocommerce_cart_calculate_fees', array( $this, 'calculate_fees' ) );

이 마법사에 대해 조금 더 설명하겠습니다(PC 조립): 이 섹션에는 3단계가 있습니다.

  • 1단계 : 사용자는 기존 제품 중 메인보드, 램, CPU 등을 선택합니다.
  • 2단계 : 목록을 보고 일부 제품의 수량을 변경할 수 있습니다(Ram 등).
  • 3단계: 사용자는 다음과 같은 몇 가지 옵션이 있는 최종 목록을 봅니다.
    조립비는 페이지 하단에서 선택합니다(1. 조립 없음, 목록만 구매). 2. 1년 보증이 적용된 조립 3. 보증이 적용되지 않은 조립). 그리고 그들이 "조립"을 했을 때, 선택된 모든 제품은 카트에 추가됩니다. 여기서 우리는 그 비용을 추가해야 하므로 고객이 이 진행을 사용하는 경우에만 이 비용이 추가되어야 합니다.

카트에 제품을 추가하는 동안 수수료도 추가하려고 했는데 이렇게 되지 않아요, 카트 페이지로 이동하면 이런 식으로 추가 수수료가 없습니다.

    /* User chooses list of products ( mainboard, ram, ... ) and can  choose quantity of each product 
and also can choose whether he/she wants to get an assembled computer
or just wants to buy the products individually,
then when he/she hits submit products get added to cart all together
in this step assembling fee should be added and calculated in cart total */
if( !empty( $_POST['action'] ) && $_POST['action'] == 'add' ){
      /**
       * Add each product to cart based on user choice
       */
      foreach( $_POST['products'] as $product_id => $data ) {
            WC()->cart->add_to_cart( $product_id, $data['qty'] );
      }

      /**
       * Add additional fees
       */
      WC()->cart->add_fee( 'Assembling fee', 10 ); // 10 is an example , the fee differs depending on user choice ( no assemble:0, assemlby+warranty:5% of the cart subtotal, assembly+no warranty: a flat fee eg. 20$ )
      WC()->cart->calculate_fees();

      /**
       * Redirect to cart
       */
      wp_safe_redirect( WC()->cart->get_cart_url() );
}

이것은 저에게 효과가 있었습니다. 누군가가 같은 문제를 가지고 있는 경우를 대비해서 말이죠. 저는 제품이 카트에 추가될 때 몇 가지 세션을 설정하고 카트가 지불되거나 비워질 때 해당 세션을 해제합니다.

if( !empty( $_POST['action'] ) && $_POST['action'] == 'add' ){
   /**
    * Add each product to cart based on user choice
    */
   foreach( $_POST['products'] as $product_id => $data ) {
        WC()->cart->add_to_cart( $product_id, $data['qty'] );
   }

   /**
    * We set sessions after products added to cart
   */
   WC()->session->set( 'MY_SESSION', 'My_value' );

   /**
    * Redirect to cart
    */
   wp_safe_redirect( WC()->cart->get_cart_url() );
}

이제 고객이 다른 페이지(이 경우 카트 페이지)로 리디렉션되면 해당 세션을 기준으로 카트의 추가 요금을 결정할 수 있습니다.

function dw_calculate_fees( $cart_object ){
    global $woocommerce;
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if( ! WC()->session->MY_SESSION ) return;

    $cart_subtotal   = $woocommerce->cart->subtotal;
    $additional_fee = null;

    if( WC()->session->MY_SESSION === 'example_a' ){
        $additional_fee = 1;
    } elseif( WC()->session->MY_SESSION === 'example_b' ) {
        $additional_fee = 2;
    } else{
        $additional_fee = 0;
    }

    if( ! is_null( $additional_fee ) ) {
        $woocommerce->cart->add_fee( 'Additional fee ', intval( $additional_fee ), 1 );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'dw_calculate_fees' );

카트가 결제되거나 비었을 때 해당 세션의 설정을 해제해야 합니다.

add_action( 'woocommerce_cart_emptied', 'dw_unset_fee_session' );
function dw_unset_fee_session(){
    unset( WC()->session->MY_SESSION );
}

이것은 저에게 효과가 있었습니다. 만약 잘못된 점이 있다면 저에게 공유해 주십시오.

언급URL : https://stackoverflow.com/questions/41853847/conditional-add-fees-to-cart

반응형