2017-01-25 20 views
7

私たちは、コンピュータ部品を販売するウェブサイトを持っています。このウェブサイトには、ユーザーが部品(メインボード - 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:ユーザーは、既存の 製品からメインボード、RAM、CPUなどを選択します。
  • ステップ2:リストを見て、いくつかの製品の数量を変更することができ
  • ( ラムなど)ステップ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()); 
} 
+0

@LoicTheAztec他のユーザーが利益を得ることができるように、オンサイトでのご質問についてディスカッションを続ける方が良いです。 –

+0

アセンブリに関する情報をセッションに保存し、その値を使用して、セッション全体でアセンブリ料金を追加するかどうかを決定します。 –

答えて

6

これがために働きました私には同じ問題がある場合があります: 商品がカートに追加されたときにセッションを設定し、カートが有料または空になったときにセッションを解除します。

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); 
} 

これは私にとってはうまくいきました。何か問題がある場合は、私に教えてください。

関連する問題