当前位置: 首页 > 知识库问答 >
问题:

有条件地将费用添加到购物车

张玺
2023-03-14
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 );
}
add_action( 'woocommerce_cart_calculate_fees', array( $this, 'calculate_fees' ) );

让我更多地解释一下这个向导(组装您的PC):我们在本节中有3个步骤,

  • 步骤1:用户从现有产品中选择主板、Ram、Cpu等。
  • 步骤2:查看列表并可以更改某些产品的数量(如Ram)
  • 步骤3:用户在页面底部看到带有一些选项的最终列表,这些选项可以
    选择装配费用(1.不装配,只购买列表2.装配有一年保修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() );
}

共有1个答案

壤驷鸿祯
2023-03-14

这对我起作用了,以防有人有同样的问题:当产品添加到购物车时,我设置了一些会话,当购物车得到付款或清空时,我取消设置这些会话。

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 );
}
 类似资料:
  • WooCommerce插件添加到购物车每件物品更多的费用。 客户在购物车中选择以下内容: 产品A(大项目)-300美元 产品B(大项目)-500美元 产品C(普通项目)-30美元 产品D(普通商品)-10美元 让我们假设“大项目-正常项目”的规则如下: 大件商品-收费: 20美元/件 正常项目-收费:低于150美元,免费送货;超过150美元,将收取20美元的费用 如何让它自动当点击添加到购物车按钮

  • 我经营一家Woocommerce商店,该商店也提供免费产品(_常规价格=0)。客户必须选择数量并将其添加到购物车中,然后下订单才能收到产品。但这并不是Woocommerce的工作原理,它隐藏了所有价格为0的产品的“添加到购物车”链接。并且不会在购物车页面中显示它们。有没有解决这个问题的办法?非常感谢。

  • 在商品分类页面上,当有人点击“添加到购物车”时,WooCommerce通过Ajax在此按钮下方添加“查看购物车”。我发现处理这个的脚本是 /assets/js/frontend/add-to-cart.js 现在,我想添加"Procceed to check out",这样某人就可以立即去结账。 这是脚本的输出: 有没有人做过类似的事情?

  • 这真是个奇怪的问题。我使用的是Woocommerce,并且在结帐页面上为用户添加了一个选择退出/添加运输保险的选项。复选框连接到一个AJAX函数,该函数执行它应该执行的操作。费用加起来很好。每次以任何方式更改购物车时,费用都会被删除、重新计算并再次添加到购物车中。代码的这一部分工作正常。 问题是网站的实际总数不起作用。我使用以下代码访问总数: 这可以很好地计算其余费用,但忽略了代表运输保险的费用。

  • 我正在使用Woocommerce,正在搜索一种方法来隐藏单个产品页面上的“添加到购物车”按钮,如果该产品是免费的-我正在进行大型CSV导入,并且一些产品的价格设置为零-我只想隐藏这些产品上的“添加到购物车”按钮,因此这些产品不可购买。 已经在支持页面上问过了,但没有成功 问候

  • 问题内容: 我正在尝试使用指令根据某个属性的值将属性添加到指令。不幸的是,这对我不起作用。我设置了一个简单的示例来演示正在发生的事情。 柱塞示例 问题答案: 编辑 在阅读了Angular Repo中提到的GitHubIssue之后,我终于明白了。 您需要使用更高的指令设置一个属性,并将其属性设置为true(在编译我们的指令后,跳过所有其他指令的编译)。然后在函数中,我们将编译整个元素本身。但是在此