Php 根据产品类别更改签出货币

Php 根据产品类别更改签出货币,php,wordpress,woocommerce,hook-woocommerce,Php,Wordpress,Woocommerce,Hook Woocommerce,我需要根据产品类别更改购物车和结账货币。因此,如果类别为“服装”,则购物车和结帐台上的货币应为欧元(并且需要以欧元收费)。否则,如果“服装”类别未附加到产品上,则应使用默认美元货币 add_filter('woocommerce_currency', 'change_existing_currency_symbol', 10, 2); function change_existing_currency_symbol( $currency ) { global $post, $product;

我需要根据产品类别更改购物车和结账货币。因此,如果类别为“服装”,则购物车和结帐台上的货币应为欧元(并且需要以欧元收费)。否则,如果“服装”类别未附加到产品上,则应使用默认美元货币

add_filter('woocommerce_currency', 'change_existing_currency_symbol', 10, 2);
function change_existing_currency_symbol( $currency ) {
global $post, $product;

if ( has_term( 'clothing', 'product_cat' ) ) {

return 'EUR';
}else{
return $currency;
}
}
此代码基本上更改了“衣服”类别的默认货币,但仅在产品页面上,购物车和结帐时不会更改。我也需要在购物车和结帐时更改它,并且需要以该货币支付费用

add_filter('woocommerce_currency', 'change_existing_currency_symbol', 10, 2);
function change_existing_currency_symbol( $currency ) {
global $post, $product;

if ( has_term( 'clothing', 'product_cat' ) ) {

return 'EUR';
}else{
return $currency;
}
}
我理解购物车和结帐只允许每个产品使用一种货币。因此,设置一些限制,使每个购物车只允许使用一种产品,可能会发生如下情况:

add_filter( 'woocommerce_add_to_cart_validation', 'bbloomer_only_one_in_cart', 99, 2 );
   
function bbloomer_only_one_in_cart( $passed, $added_product_id ) {
   wc_empty_cart();
   return $passed;
}
也许,这里有一个解决方案(我不能尝试):



PS:它不能在产品列表页面上完成工作。

我认为这是您问题的答案,尽管这不是推荐的方法,因为它不能在产品列表页面上工作。请尝试使用此代码,并让我知道您的想法

add_filter('woocommerce_currency', 'change_existing_currency_symbol', 10, 2);
function change_existing_currency_symbol( $currency ) {
global $post, $product;
$defaultCurrency = 'EUR';
$categoriesCurrencies = [ 
          'audio'=>'EUR', 
          'mobile'=>'LEK'
];
 return $categoriesCurrencies[$product->category] ?: $defaultCurrency;
}
add_filter('woocommerce_currency', 'change_existing_currency_symbol', 10, 1);
function change_existing_currency_symbol( $currency ) {

    if ( is_product() ) {
        if ( has_term( 'clothing', 'product_cat' ) ) return 'EUR';
    } else if ( is_cart() || is_checkout() ) {
        global $woocommerce;
        foreach ( $woocommerce->cart->get_cart() as $product ) {
            if ( has_term('clothing', 'product_cat', $product['product_id'] ) ) return 'EUR';
        }
    }

    return $currency;
}

我做了一些研究,在按类别或按产品动态更改货币时,会有相当多的额外复杂性

我假设购物车仍然需要计算总数,并提供1种结账货币。这意味着,总数也必须进行转换


您最好的答案是通过代码挖掘……但我警告您,这比更改符号要复杂得多。

如果卡上有“服装”产品而不是“服装”产品,它需要如何反应?通过限制-每个购物车只有一种产品,因为Woocommerce购物车只能支持一种货币。
添加过滤器('woocommerce_add_to_cart_validation','bbloomer_only_one_in_cart',99,2);函数bbloomer_only_one_in_cart($passed,$added_product_id){wc_empty_cart();返回$passed;}
您是否在woocommerce设置中安装并激活了这两种货币?谢谢。我刚刚测试了这一点-它在购物车上成功地将货币更改为欧元。但当我继续结帐时,我可以看到它恢复为美元。有什么方法可以在结帐时设置它吗?我已经更新了我的答案,使用“谢谢”,但这不起作用。Checkout货币仍然是美元。如果您在过滤器开始时直接返回“EUR”,那么签出是否是欧元?。我现在收到Wordpress严重错误。不确定原因,因为您的代码通过语法检查没有问题。