Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在woocommerce__计算_总计挂钩之前,设置两次价格计算_Php_Wordpress_Woocommerce_Cart_Product - Fatal编程技术网

Php 在woocommerce__计算_总计挂钩之前,设置两次价格计算

Php 在woocommerce__计算_总计挂钩之前,设置两次价格计算,php,wordpress,woocommerce,cart,product,Php,Wordpress,Woocommerce,Cart,Product,我在我的网站上使用Woocommerce和活动门票插件,我必须硬编码一个选择字段,当客户购买门票时,根据他们的选择,价格会相应上涨 它的大部分似乎工作正常,然后选择被保存为购物车数据的一部分。然后,我尝试在他们单击“添加到购物车”按钮后更新产品价格,以便将新的价值添加到产品价格中 下面是我所拥有的,它似乎在更新价格,但令人恼火的是,它将$picku\u price值添加了两次(因此不是3而是6) 奇怪的是,如果我在basket阶段更改数量并进行更新,它会得到正确的值,而不是最初添加时的值 我做错

我在我的网站上使用Woocommerce和活动门票插件,我必须硬编码一个选择字段,当客户购买门票时,根据他们的选择,价格会相应上涨

它的大部分似乎工作正常,然后选择被保存为购物车数据的一部分。然后,我尝试在他们单击“添加到购物车”按钮后更新产品价格,以便将新的价值添加到产品价格中

下面是我所拥有的,它似乎在更新价格,但令人恼火的是,它将
$picku\u price
值添加了两次(因此不是3而是6)

奇怪的是,如果我在basket阶段更改数量并进行更新,它会得到正确的值,而不是最初添加时的值

我做错了什么,如何防止这个问题

这是我的密码:

add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 1 );
function add_pickup_cost( $cart_object, $cart_item_data ) {

     foreach ( $cart_object->get_cart() as $cart_item ) {

          $wc_product = $cart_item['data'];
          // My custom field which is returning the additional cost
          $pickup_price = $cart_item['pickupOptions'];

          $product_price = method_exists( $wc_product, 'get_price' ) ? floatval($wc_product->get_price()) : floatval($wc_product->price);
          $new_price = $product_price + $pickup_price;
          method_exists( $wc_product, 'set_price' ) ? $wc_product->set_price( $new_price ) : $wc_product->price = $new_price;
     }
}

您遗漏了一些小东西,我将您的代码简化了一点:

add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 2 );
function add_pickup_cost( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset( $cart_item['pickupOptions'] ) && ! empty( $cart_item['pickupOptions'] ) ){
        // WC_Product object instance
        $product = $cart_item['data'];

        // Get cart item price
        $price  = method_exists( $product, 'get_price' ) ? floatval($product->get_price()) : floatval($product->price);
        $price += (float) $cart_item['pickupOptions']; // Add "Pickup option to the price

        // Set the new price
        if( method_exists( $product, 'set_price' ) ) 
            $product->set_price( $price )
        else
            $product->price = $price;
        }
    }
}
代码位于活动子主题(或主题)的function.php文件或任何插件文件中


已测试并正常工作。

@LocicTheAztec感谢您的回复。我尝试过使用您的代码,但不幸的是,它仍然两次添加额外的“pickupOptions”值(因此,不是添加3英镑,而是添加6英镑)。@WillL对我来说,此代码工作正常。没有重复…因此可能是某个特定的地方导致了您的问题。@奇怪的是,当我单击购物车上的“更新购物车”按钮或刷新购物车时,价格会更新到正确的金额。但从最初添加到购物车,当它把我带到那里时,它显示它添加了两倍的价格。知道这是为什么吗?或者我可以在添加到购物车后强制更新/刷新吗?@will这个问题似乎很难解决,因为它可能与您的主题、某个特定插件或其他自定义代码有关。。。