【问题标题】:Woocommerce - Product price depending on countryWoocommerce - 产品价格取决于国家
【发布时间】:2014-12-12 12:17:37
【问题描述】:

我有 2 个关于 Woocommerce for Wordpress 的问题。

我正在开发一个向丹麦市场销售扬声器的网站。

问题一:

我可以检测访问者的 IP 并检测此人来自哪个国家/地区吗?我想这可以通过一些 ClientLocation api 来完成。

如果某人不是来自丹麦,我是否可以禁用所有与购物相关的页面和按钮。 Fx:隐藏添加到购物车、购物车和结帐。 我仍然希望人们能够看到价格,他们不应该选择购买它们。

问题 2:

假设第一个问题已成功提出。然后我想显示除丹麦以外的其他国家的不同价格。因此,如果您从一个国家/地区访问该网站,价格为 XXX,而从另一个国家/地区访问该网站,价格为 XXXX。
比方说:

In USA the price is = $500 
And in UK the price = £400

(这与货币无关,只是不同国家的市场价格不同而已。)

我看过这个插件:http://wordpress.org/plugins/woocomerce-price-by-country/ 它允许我为每种产品编写不同的价格,但是当我使用 http://geopeeker.com/ 测试它时,我根本没有工作。

你能给我一些你知道的插件或一些链接吗?

更新

我设法解决了问题 1。我将访问者国家/地区存储在带有 IP location XML API 的 cookie 中,然后我可以创建一个 if 语句,说如果国家不等于丹麦,则添加到购物车,购物车等应该被删除。

所以,是的,如果有人能告诉我如何解决问题 2,我将不胜感激。

我能够检测到国家,但无法指定每个产品对给定国家/地区的价格。

第二次更新:

只是为了让任何感兴趣的读者知道,我最终购买了this plugin.,它运行良好!

【问题讨论】:

  • 请查看答案

标签: wordpress location woocommerce


【解决方案1】:

对于您问题的第二部分:如果您只使用简单的产品类型(没有变体),那么您可以将自定义价格字段添加到产品数据页面并使用 woocommerce_get_price_html 过滤价格。

add_filter('woocommerce_get_price_html','so24863612_custom_price');
function so24863612_custom_price(){
   global $post;
   $_postID = $post->ID;
   $product = get_product( $_postID );
   $UK_price = get_post_meta($_postID, '_UK_price', true); //loads custom meta data 
   $return_price = $product->get_regular_price(); //default to regular price
   if (!empty($UK_price)) { 
      $return_price = $UK_price;
   }
   return $return_price;
}

您可以像这样在产品页面上创建和保存自定义字段:

//Display custom fields on product data page in admin
add_action( 'woocommerce_product_options_general_product_data', 'so24963039_display_custom_general_tab_fields' );
function so24963039_display_custom_general_tab_fields() {
    global $woocommerce, $post;
    $UK_price = get_post_meta( $post->ID, '_UK_price', true );

    woocommerce_wp_text_input(
        array(
        'id' => '_UK_price',
        'label' => __( 'UK Price (£)', 'woocommerce' ),
        'value' => $UK_price,
        'desc_tip' => 'false'
        )
    );
}

//Save custom fields to access via get_post_meta
add_action( 'woocommerce_process_product_meta', 'so24963039_save_custom_general_tab_fields' );
function so24963039_save_custom_general_tab_fields ($post_id) {

    $woocommerce_UK_price = $_POST['_UK_price'];
    if( !empty( $woocommerce_UK_price ) )
    update_post_meta( $post_id, '_UK_price', esc_attr( $woocommerce_UK_price ) );   

}

-----------------对于有变化的产品-------------------------- --

警告:可变产品要复杂得多,我对这个答案的信心不如上面的简单产品部分,但这是我目前的理解。我在使用这种方法时遇到了一些小型购物车显示问题(我将在最后解释),但在小型购物车和普通购物车中的总数都是正确计算的。

首先,我们要在现有产品的变体选项卡上为每个变体添加新字段:

add_action( 'woocommerce_product_after_variable_attributes', 'so24963039_variable_fields', 10, 2 ); //Display Fields
function so24963039_variable_fields( $loop, $variation_data ) {

echo '<tr><td>';
woocommerce_wp_text_input(
    array(
        'id' => '_variant_UK_price['.$loop.']',
        'label' => __( 'UK Price (£)', 'woocommerce' ),
        'desc_tip' => 'false',
        'value' => $variation_data['_variant_UK_price'][0]
    )
);
echo '</td></tr>';
}

每当用户在编辑产品页面上添加新变体时,我们还需要动态添加它们:

add_action( 'woocommerce_product_after_variable_attributes_js', 'so24963039_variable_fields_js' ); //JS to add fields for dynamically added new variations
function so24963039_variable_fields_js(){ //add fields to new variations that get added 
echo '<tr><td>';
woocommerce_wp_text_input(
    array(
        'id' => '_variant_UK_price[ + loop + ]',
        'label' => __( 'UK Price (£)', 'woocommerce' ),
        'desc_tip' => 'false',
        'value' => $variation_data['_variant_UK_price'][0]
    )
);
echo '</td></tr>';
}

然后我们将更改保存到变体元数据中的自定义字段:

add_action( 'woocommerce_process_product_meta_variable', 'so24963039_save_variable_fields', 10, 1 ); //Save variation fields
function so24963039_save_variable_fields( $post_id ) {
if (isset( $_POST['variable_sku'] ) ) {
    $variable_sku = $_POST['variable_sku'];
    $variable_post_id = $_POST['variable_post_id'];

    // Variant Tier 1 Price
    $_variant_UK_price = $_POST['_variant_UK_price'];
    for ( $i = 0; $i < sizeof( $variable_sku ); $i++) {
        $variation_id = (int) $variable_post_id[$i];
        if ( isset( $_variant_UK_price[$i] ) ) {
        update_post_meta( $variation_id, '_variant_UK_price', stripslashes($_variant_UK_price[$i] ) );
        }
    }
}
}

现在我们有了自定义变体元数据,我们可以在自定义价格模块中访问它,如下所示:

add_filter('woocommerce_get_price_html','so24863612_custom_price');
function so24863612_custom_price(){
   global $post;
   $_postID = $post->ID;
   $product = get_product( $_postID );
   $product_type = $product->product_type;

   $UK_price = get_post_meta($_postID, '_UK_price', true); //covers simple products 
   if($product_type == 'variation'){ //override with variant prices
            $UK_price = get_post_meta($_postID, '_variant_$UK_price', true);
    }

   $return_price = $product->get_regular_price(); //default to regular price
   if (!empty($UK_price)) { 
      $return_price = $UK_price;
   }
   return $return_price;
}

现在,我相信除了迷你购物车显示屏外,该部件应该可以正常工作。出于某种原因,我似乎只是无法弄清楚如何访问变体元数据以强制它在迷你购物车中正确显示 - 就像我找到了迷你购物车显示的生成位置但我遇到了麻烦获取访问自定义变量的正确上下文路径,因此我最终不得不在 template-tags.php 中执行此操作,并将自定义值数组传递给自定义价格函数中的可选参数。就我们应该如何做事而言,这感觉非常“错误”,但它可以完成工作。我很乐意听到这部分问题的“正确”解决方案。

在模板标签.php 中:

<div class="small-7 large-7 columns"><?php 
                                            $product_title = $_product->get_title();
                                            echo '<a class="cart_list_product_title" href="'.get_permalink($cart_item['product_id']).'">' . apply_filters('woocommerce_cart_widget_product_title', $product_title, $_product) . '</a>';
                                            echo '<div class="cart_list_product_price">';
                                            //original line: echo woocommerce_price($_product->get_price());

                                            /*Custom Price Override Block*/
                                            $_productID = $_product->id;
                                            $product_type = $_product->product_type;
                                            if($product_type == 'variation') {
                                                $custom_field_data = $_product->product_custom_fields;
                                                $regular_price = $custom_field_data['_regular_price'];
                                                $custom_UK_price = $custom_field_data['_variant_UK_price'];
                                                $custom_variant_prices = [$regular_price[0], $custom_UK_price[0]];
                                                echo so24863612_get_custom_price($_productID,  $custom_variant_prices ); 
                                            } else {
                                                echo so24863612_get_custom_price($_productID );
                                            }
                                            /*End Custom Price Override Block*/

                                            echo ' /</div>';
                                            echo '<div class="cart_list_product_quantity">'.__('Quantity', 'woocommerce').': '.$cart_item['quantity'].'</div>';

                                        ?></div>

【讨论】:

  • 嗨。谢谢您的回答。我很抱歉回复晚了。不幸的是,我有产品变体,而不仅仅是简单的产品。
  • 我担心你会这么说。我的客户也需要同样的东西,我为此苦苦挣扎了一周左右。我得到了它的工作,但在迷你购物车显示方面有点笨拙。 (我不得不编辑一个模板文件,而不是用钩子修复它,因为我还不知道如何从我的插件中访问变体元数据)如果你碰巧想出了一个更好的方法,请告诉我去做吧!
  • 谢谢。这让我走得很远!但我还没有越过终点线。但我已经接受了你的回答。感谢所有的帮助。如果我找到优化的方法,我会告诉你的。
  • 仅供参考,Roy Ho 还有一个额外的插件,它似乎为您提供了一些额外的选项,您可以根据国家/地区 IP wordpress.org/plugins/woocommerce-geolocation-based-products 显示特定产品
【解决方案2】:

我看到您的更新,您确实设法获取了访问者的国家/地区,并且您可以使用它来创建 if 语句以删除购物车。 (顺便说一句,这太酷了)

这不能回答您的问题 2,即更改每位访客的价格吗?您所要做的就是确保两个价格都存储在某个地方,然后让它与丹麦或英国的价格相呼应。

价格是特定的 - 自定义字段

您提到这不是货币转换 - 因此您需要存储这两个值。将自定义字段添加到您使用该新价格编辑的产品条目中,并将其命名为“丹麦价格”或其他名称

我对 WooCommerce 不是 100% 熟悉,无法说出自定义字段插件可能会起作用,但如果您不想自己创建自定义字段并使用 the_meta() 调用变量,则可以使用 http://www.advancedcustomfields.com/当你想在你的 if else 语句中显示它时。

http://codex.wordpress.org/Custom_Fields

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多