如果语句里面的开关(PHP)

时间:2017-03-24 12:26:59

标签: php if-statement woocommerce switch-statement

我正在与WooCommerce合作,我正在努力开发一种基于两个因素进行价格计算的方法:

  • 按城市划分的客户位置
  • 类别

我能够根据客户的位置更改价格,但如果我尝试按位置和类别同时过滤它不起作用。要按类别执行过滤,请添加以下if语句:

if( has_term( array('nike'), 'product_cat' ,$product->ID) )

但我不明白为什么这不起作用。

以下是代码

$userInfo = geoip_detect2_get_info_from_current_ip();
$countryCode = $userInfo->city->name;

switch ($countryCode) {
    case 'Madrid':
        if (has_term(array('nike') , 'product_cat', $product->ID)) {
            add_filter('woocommerce_get_price', 'product_custom_price', 10, 2);
            function product_custom_price($price, $product) {
                $custom_price = $product->get_regular_price();
                return $custom_price * 1.5;
            }
        }

        break;

    case 'Barcelona':
        if (has_term(array('adidas') , 'product_cat', $product->ID)) {
            add_filter('woocommerce_get_price', 'product_custom_price', 10, 2);
            function product_custom_price($price, $product) {
                $custom_price = $product->get_regular_price();
                return $custom_price * 1.25;
            }
        }

        break;
}

2 个答案:

答案 0 :(得分:0)

您错误地使用has_term,而您可以使用foreach

试试这个:

 $userInfo = geoip_detect2_get_info_from_current_ip();
    $countryCode = $userInfo->city->name;
    $terms = get_the_terms($product->ID, 'product_cat');
                switch ($countryCode) {
                case 'Madrid':
          foreach ( $terms as $term ) {
            if($term->name == 'nike') {
                   add_filter('woocommerce_get_price', 'product_custom_price', 10, 2);
                   function product_custom_price($price, $product) {
                 $custom_price = $product->get_regular_price();
                 return $custom_price * 1.5;}
                                }
                    }

                break;
                case 'Barcelona':

           foreach ( $terms as $term ) {
               if($term->name == 'adidas') {
                   add_filter('woocommerce_get_price', 'product_custom_price', 10, 2);
                    function product_custom_price($price, $product) {
                     $custom_price = $product->get_regular_price();
                      return $custom_price * 1.25;}
                                    }
                    }        

                break;

}

答案 1 :(得分:0)

我可以考虑将这些信息硬编码,而不是为每个地理位置和类别组合定义单独的函数,我建议将其存储在数据库中吗?

使用您当前的方法,您的代码很快就会变得笨拙而且非常大,特别是一旦您认为您只是乘以{category, country}的某个组合的常数所有价格。如果您使用这些记录创建数据库表(mySQL的示例代码),那该怎么办:

CREATE TABLE `pricing` (INT id, INT categoryID, CHAR(2) country, 
DOUBLE multiplier) ENGINE=InnoDB AUTO_INCREMENT=1 

国家/地区可以容纳2个字符的ISO代码,例如' US'或者'英国'。 CategoryID包含类别ID在您的类别表中的任何内容,并且乘数保留值以增加或减少价格,例如' 1.5'或者' 1.25'对于你的两个例子。

然后您的product_custom_price($price, $product)功能可以执行以下操作:

  1. 从产品表
  2. 中找出产品的类别
  3. 使用geoIP检测国家/地区代码
  4. 查询定价表以获取乘数。
  5. 将默认价格乘以此乘数。
  6. 您可以将此函数转发给add_filter。 改变定价规则并不涉及必须修改任何代码,只要定价规则适合相同的模式,您就可以简单地更改或添加数据库记录。

    一点点安全事项:您不应该使用geoip_detect2_get_info_from_current_ip的结果来确定您向某人收取的实际金额。 ip本质上是不受信任的输入,因此您必须使用客户希望您为“实际”产品交付产品的任何地方。计算,或者至少验证你的ip函数返回的国家/地区。使用geoip进行显示目的对我来说似乎很好。