2

我目前一直在根据用户位置使用多种价格/货币。我正在经历整个订购过程,我几乎就在那里。

我正在使用该get_price()函数与woocommerce_get_price(位于class-wc-product.php第 822 行)挂钩,然后从产品中找到我设置的自定义字段金额(gb_price、us_price 等)。

在商店、单一产品视图、购物车、结帐中一切正常,但在下订单时,一切都会退回到默认的基本成本和货币。我注意到这只在通过functions.php连接时失败。如果我直接在类文件中修改函数本身,一切正常。

我真的不想破解 WC 的核心,所以有人可以看看并告诉我为什么它会失败吗?这是我的代码...

类-wc-product.php

function get_price() {  
    return apply_filters( 'woocommerce_get_price', $this->price, $this );
}

函数.php

add_filter('woocommerce_get_price', 'return_custom_price', $product, 2); 
function return_custom_price($price, $product) {    
    global $post, $woocommerce;
    // Grab the product id
    $post_id = $product->id; 
    // Get user's ip location and correspond it to the custom field key
    $user_country = $_SESSION['user_location'];
    $get_user_currency = strtolower($user_country.'_price');
    // If the IP detection is enabled look for the correct price
    if($get_user_currency!=''){
        $new_price = get_post_meta($post_id, $get_user_currency, true);
        if($new_price==''){
            $new_price = $price;
        }
    }
    return $new_price;
}   

所以除了订单确认外,这在任何地方都有效。如果我只是将函数从functions.php 移动到get_price() 中的类本身,它就可以完美运行。

4

1 回答 1

1

这是我现在使用的代码,它无论如何都不完美,但应该可以帮助人们走上正轨。(尚未使用 WC2.0 进行测试,我几乎可以肯定它不适用于 2。)请注意,使用的任何会话都用于 IP 驱动测试,而不是功能的组成部分。我从以前改编它以用作插件。在 WP 的产品中,我使用自定义字段作为价格,即“us_price”、“gb_price”等,这就是 ip 检测挂钩的方式。

// 1. Change the amount
function return_custom_price($price, $product) {
    global $post, $woocommerce;
    $post_id = $post->ID;
    // Prevent conflicts with order pages and products, peace of mind.
    if($post_id == '9' || $post_id == '10' || $post_id == '17' || $post_id == '53' || $post_id == ''){
        // cart, checkout, , order received, order now
        $post_id = $product->id;
    }
    $user_country = $_SESSION['user_location'];
    $get_user_currency = strtolower($user_country.'_price');
    // If the IP detection is enabled look for the correct price
    if($get_user_currency!=''){
        $new_price = get_post_meta($post_id, $get_user_currency, true);
        if($new_price==''){
            $new_price = $price;
        }
    }
    if( is_admin() && $_GET['post_type']=='product' ){
        return $price;
    } else {
        return $new_price;
    }
}
add_filter('woocommerce_get_price', 'return_custom_price', $product, 2);

// 2. Update the order meta with currency value and the method used to capture it
function update_meta_data_with_new_currency( $order_id ) {
    if($_SESSION['user_order_quantity']>=2){
        update_post_meta( $order_id, 'group_ticket_amount', $_SESSION['user_order_quantity'] );
        update_post_meta( $order_id, 'master_of', '' );

    }
    update_post_meta( $order_id, 'currency_used', $_SESSION['user_currency'] );
    update_post_meta( $order_id, 'currency_method', $_SESSION['currency_method'] );
}
add_action( 'woocommerce_checkout_update_order_meta', 'update_meta_data_with_new_currency' );
于 2013-05-15T08:58:54.970 回答