我目前一直在使用基于用户位置的多种价格/货币。我正在经历整个订购过程,我几乎就在那里。
我正在使用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 );
}
的functions.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()中的类本身,它就可以完美地运行。
答案 0 :(得分: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' );