开关内部的If语句(PHP)

开关内部的If语句(PHP),php,if-statement,woocommerce,switch-statement,Php,If Statement,Woocommerce,Switch Statement,我正在与WooCommerce合作,我试图开发一种基于两个因素的价格计算方法: 按城市列出的客户位置 类别 我可以根据客户的位置更改价格,但如果我同时尝试按位置和类别进行筛选,则不会起作用。要按类别I执行筛选,请添加以下if语句: if( has_term( array('nike'), 'product_cat' ,$product->ID) ) 但我不明白为什么这不起作用 以下是代码: $userInfo = geoip_detect2_get_info_from_current

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

  • 按城市列出的客户位置
  • 类别
我可以根据客户的位置更改价格,但如果我同时尝试按位置和类别进行筛选,则不会起作用。要按类别I执行筛选,请添加以下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;
}

您正在以错误的方式使用
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;

}

您正在以错误的方式使用
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;

}

与其为您能想到的地理位置和类别的每个组合定义单独的函数,并对这些信息进行硬编码,我是否可以建议将其存储在您的数据库中

<>你的代码可以很快地变得笨拙和很大,用你当前的方法,尤其是一旦你认为你只是乘以常数的所有价格的某个组合的代码> {类别,国家} /代码>。如果您用这些记录创建了一个数据库表(mySQL的示例代码):

国家/地区可以保存两个字符的ISO代码,如“US”或“UK”。CategoryID保存类别表中类别的ID,乘数保存增加或减少价格的值,例如,两个示例中的“1.5”或“1.25”

然后您的
product\u custom\u price($price,$product)
函数可以简单地执行以下操作:

  • 从products表中找出产品的类别
  • 使用geoIP检测国家/地区代码
  • 查询定价表以获取乘数
  • 将默认价格乘以此乘数 您只需将此函数转发给添加_过滤器即可。 修改定价规则不需要修改任何代码,只要定价规则符合相同的模式,就可以简单地修改或添加数据库记录


    有一点安全问题:你不应该使用
    geoip\u detect2\u get\u info\u from\u current\u ip
    的结果来确定你要向某人收取的实际金额。ip本质上是不受信任的输入,因此您必须在客户希望您交付产品进行“实际”计算的任何地方使用,或者至少验证它在您的ip功能返回的国家/地区。不过,使用geoip进行显示对我来说似乎很好

    与其为您能想到的地理位置和类别的每个组合定义单独的函数,并对这些信息进行硬编码,不如建议将其存储在您的数据库中

    <>你的代码可以很快地变得笨拙和很大,用你当前的方法,尤其是一旦你认为你只是乘以常数的所有价格的某个组合的代码> {类别,国家} /代码>。如果您用这些记录创建了一个数据库表(mySQL的示例代码):

    国家/地区可以保存两个字符的ISO代码,如“US”或“UK”。CategoryID保存类别表中类别的ID,乘数保存增加或减少价格的值,例如,两个示例中的“1.5”或“1.25”

    然后您的
    product\u custom\u price($price,$product)
    函数可以简单地执行以下操作:

  • 从products表中找出产品的类别
  • 使用geoIP检测国家/地区代码
  • 查询定价表以获取乘数
  • 将默认价格乘以此乘数 您只需将此函数转发给添加_过滤器即可。 修改定价规则不需要修改任何代码,只要定价规则符合相同的模式,就可以简单地修改或添加数据库记录


    有一点安全问题:你不应该使用
    geoip\u detect2\u get\u info\u from\u current\u ip
    的结果来确定你要向某人收取的实际金额。ip本质上是不受信任的输入,因此您必须在客户希望您交付产品进行“实际”计算的任何地方使用,或者至少验证它在您的ip功能返回的国家/地区。不过,使用geoip进行显示对我来说似乎很好

    你有什么错误吗?请同时提及错误,您是否有任何错误?请同时提及错误。你是否完全确定在没有任何解释的情况下发布代码将有助于操作?@walther:尽管我编辑过,但我认为不需要解释!感谢您的回复,但提供的代码不起作用,任何其他建议都将不胜感激。下面我粘贴了用于更改价格的代码,但我无法确定该语句是否能够协同工作。您是否完全确定发布一个没有任何解释的代码会对OP有利?@walther:尽管我已编辑,但我认为不需要解释!感谢您的回复,但提供的代码不起作用,任何其他建议都将不胜感激。下面我粘贴了用于更改价格的代码,但如果声明一起起作用,我将无法发表。