php 使用woocommerce_product_get_price挂钩查看与购物车价格不同的价格

uurity8g  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(139)

我正在运行WooCommerce(WordPress 6.1.1和WooCommerce 7.3.0),我试图根据用户角色设置价格。为此,我使用插件在产品定义中引入了一个名为Webprice(precio_web)的新字段:“高级自定义字段”。客户用户和未登录的用户必须使用这个特殊的价格。我也添加了这个代码在我的functions.php子主题:

add_filter('woocommerce_product_get_price', 'ui_custom_price_role', 99, 2);
add_filter('woocommerce_product_get_regular_price', 'ui_custom_price_role', 99, 2);
add_filter('woocommerce_product_variation_get_regular_price', 'ui_custom_price_role', 99, 2);
add_filter('woocommerce_product_variation_get_price', 'ui_custom_price_role', 99, 2);

function ui_custom_price_role($price, $product) {
    $price = ui_custom_price_handling($price, $product);
    return $price;
}
Variable add_filter('woocommerce_variation_prices_price', 'ui_custom_variable_price', 99, 3);
add_filter('woocommerce_variation_prices_regular_price', 'ui_custom_variable_price', 99, 3);

function ui_custom_variable_price($price, $variation, $product) {
    $price = ui_custom_price_handling($price, $product);
    return $price;

    function ui_custom_price_handling($price, $product) {

        //get our current user

        $current_user = wp_get_current_user();

        //check if the user role is the role we want or is not logged

        if ((!is_user_logged_in()) || (isset($current_user - \ > roles\[0\]) && '' != $current_user - \ > roles\[0\] && in_array('customer', $current_user - \ > roles))) { //load the custom price for our product $custom_price = get_post_meta( $product-\>get_id(), 'precio_web', true );

            // custom price

            if (!empty($custom_price)) {
                $price = $custom_price;
            }
        }

        return $price;
    }
}

到目前为止,它的工作,当添加项目到购物车我可以看到新的价格。enter image description here
问题出在结账时,由于某种原因,显示的价格是标准价格,而不是与新字段对应的价格。
enter image description here
任何帮助都欢迎。谢谢。
我原以为修改get_price函数就足够了,因为价格显示正确。然而,订单是用商品的标准价格记录的。

2izufjch

2izufjch1#

WooCommerce会在结账过程中多次重新计算所有价格,所以您也需要连接到这个重新计算。

add_action( 'woocommerce_before_calculate_totals', 'update_cart_price'), 99);

function update_cart_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $cart_item = $cart_item['data'];
        $cart_item_product_id =  $cart_item->get_id(); 
        $product = wc_get_product( $cart_item_product_id );
        $orig_price = $product->get_regular_price();
        $new_price = ui_custom_price_handling( $orig_price, $product );
        $cart_item->set_price( $new_price );
    }
}

相关问题