迷你卡中的自定​​义价格值仅在单个产品站点上是错误的

时间:2019-02-27 13:44:18

标签: php wordpress woocommerce

我具有更改购物车中产品价格的功能。

实际上一切正常。我可以将产品添加到购物车中,完成订单,到处都有我的custom_price。 当我通过存档页面添加产品时,一切正常(widget-cart和shopping-cart)。

但是,如果我通过单个产品站点添加产品,则小部件购物车中的价格不正确。但是总和再次是正确的。

Screenshot Archive Page

Screenshot Single Product Page

这是我的代码:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
add_action( 'woocommerce_before_mini_cart', 'add_custom_price' );

 function add_custom_price( $cart_object ) {

  if( !WC()->session->__isset( "reload_checkout" )) {

    foreach ( $cart_object->cart_contents as $key => $value ) {

        foreach( WC()->cart->get_cart() as $cart_item ){
                    $product_id = $cart_item['data']->get_id(); 
        }               

            $product_group = get_field( "produktegruppe", $product_id );
            $current_user_id = get_current_user_id();
            $usergroup = get_field($product_group,'user_'. $current_user_id);
            $value1 = $usergroup['rabatt'];
            $value2 = $usergroup['zusatzrabatt'];

            $orgPrice = floatval( $value['data']->get_price() );
            if ( $value2 ) {
                $discPrice = ($orgPrice / 100 * (100-$value1)) / 100 * (100-$value2);
            }
            else {
                $discPrice = $orgPrice / 100 * (100-$value1);               
            }    
            $value['data']->set_price($discPrice);

    }
  }
}

有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误和错误,例如,您正在另一个购物车商品循环中创建购物车商品循环,这实际上是不需要的。

要更改购物车项目的价格,只需使用woocommerce_before_calculate_totals钩子即可。

因此,请尝试以下操作:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetition (when using price calculations for example)
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $user_id = get_current_user_id();

    // Loop Through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['data']->get_id();

        $product_group = get_field( "produktegruppe", $product_id );
        $usergroup     = get_field( $product_group, 'user_'. $user_id );

        $value1 = $usergroup['rabatt'];
        $value2 = $usergroup['zusatzrabatt'];

        $price  = (float) $cart_item['data']->get_price();

        if ( $value2 ) {
            $new_price = ($price / 100 * (100 - $value1)) / 100 * (100 - $value2);
        }
        else {
            $new_price = $price / 100 * (100 - $price);
        }
        $cart_item['data']->set_price( $new_price );
    }
}

代码在您的活动子主题(或活动主题)的function.php文件上。应该可以。

我已经以固定价格测试了此挂钩,并且它可与存档页面和单个产品页面上的购物车小部件一起使用...


因此,如果它对您不起作用,那么问题可能出在其他方面(可能是您主题的另一种自定义,或者是您进行的自定义,或者是插件)。 它也可以来自缓存插件或托管缓存。

现在,您可以尝试另外添加以下代码,这些代码将仅在单个产品页面上强制刷新购物车片段:

add_action( 'wp_footer', 'single_product_page_refresh_fragments' );
function single_product_page_refresh_fragments() {
    if ( is_product() ):
    ?>
    <script type="text/javascript">
    jQuery( function($){
        $('body').trigger('wc_fragment_refresh');
        $('body').trigger('wc_fragments_refreshed');
    });
    </script>
    <?php
    endif;
}

代码在您的活动子主题(或活动主题)的function.php文件上。应该可以。