Ve specifických případech, kdy potřebuje ve WooCommerce obchodě prodávat produkty, které mají každý jinou měnu vám přijde vhod následující kód, kterým situaci elegantně a jednoduše vyřešíte.
Vytvoření meta pole produktu pro výběr měny
Pomocí action hooku woocommerce_product_options_general_product_data zavěsíme pole pro výběr měny. Do array $options přidejte měny podle svých potřeb. Action hook woocommerce_process_product_meta pak tuto hodnotu uloži do databáze.
add_action('woocommerce_product_options_general_product_data', 'add_currency_field');
function add_currency_field() {
// Získání hodnoty měny produktu, pokud existuje, jinak nastavíme CZK jako výchozí
$currency = get_post_meta(get_the_ID(), 'product_currency', true) ?: 'CZK';
$options = [
'CZK' => __('CZK', 'woocommerce'),
'EUR' => __('EUR', 'woocommerce')
];
woocommerce_wp_select(array(
'id' => 'product_currency',
'label' => __('Currency', 'woocommerce'),
'options' => $options,
'value' => $currency, // Nastavení výchozí hodnoty
));
}
add_action('woocommerce_process_product_meta', 'save_currency_field');
function save_currency_field($post_id) {
$currency = isset($_POST['product_currency']) ? $_POST['product_currency'] : 'CZK'; // Nastavení CZK jako default
update_post_meta($post_id, 'product_currency', $currency);
}
Nové meta pole pak v editaci produktu najdete v kartě Obecné.
Nastavení nákupu po vložení do košíku
O to se postará filter hook woocommerce_currency. Dejte pozor aby byl zavěšený pod action hook wp_loaded. Pokud nebude, tak produkty nepůjdou vložit do košíku.
add_action('wp_loaded', 'set_currency_based_on_product_meta');
function set_currency_based_on_product_meta() {
add_filter('woocommerce_currency', 'custom_currency_based_on_meta_field');
}
function custom_currency_based_on_meta_field($currency) {
// Zkontroluje, zda je košík inicializován a není prázdný
if (WC()->cart && !WC()->cart->is_empty()) {
// Projde všechny produkty v košíku
foreach (WC()->cart->get_cart() as $cart_item) {
// Získá hodnotu metapole `product_currency` pro každý produkt
$product_currency = get_post_meta($cart_item['product_id'], 'product_currency', true);
// Pokud existuje hodnota meta pole měny produktu
if ($product_currency) {
return esc_attr($product_currency);
}
}
}
// Výchozí měna
return $currency;
}
Kontrola měny košíku před vložením produktu
Protože nelze odeslat objednávku ve dvou různých měnách, tak je potřeba pohlídat, že budou do košíku vloženy produkty pouze v jedné měně. To pro nás zařídí filter woocommerce_add_to_cart_validation, který porovná měnu vkládaného produktu s měnou produktů, které už jsou v košíku. Pokud chceme vložit produkt v jiné měně, tak dostaneme upozornění, že je potřeba pro jeho nákup vytvořit samostatnou objednávku.
add_filter('woocommerce_add_to_cart_validation', 'check_product_currency_before_add_to_cart', 10, 2);
function check_product_currency_before_add_to_cart($passed, $product_id) {
// Získáme měnu nového produktu
$new_product_currency = get_post_meta($product_id, 'product_currency', true);
// Pokud je košík prázdný, přidáme produkt bez dalších kontrol
if (WC()->cart->is_empty()) {
return $passed;
}
// Projdeme produkty v košíku a zkontrolujeme měnu
foreach (WC()->cart->get_cart() as $cart_item) {
$existing_product_currency = get_post_meta($cart_item['product_id'], 'product_currency', true);
$curr_str = [
'EUR' => 'Korunách českých',
'CZK' => 'Eurech',
];
// Pokud se měna nového produktu liší od měny produktu v košíku, zobrazí chybovou zprávu
if ($new_product_currency !== $existing_product_currency) {
wc_add_notice(sprintf(__('Do košíku bohužel nelze vložit produkty ve dvou různých měnách. Pokud chcete zakoupit jehož cena je v %s, tak pro tento nákup prosím vytvořte samostatnou objednávku. Děkujeme za pochopení.', 'textdomain'), $curr_str[$existing_product_currency] ), 'error');
return false;
}
}
return $passed;
}
Zobrazení správného znaku měny
Poslední, co zbývá je zobrazit správnou měnu u produktu. K tomu slouží filter woocommerce_currency_symbol. Z globální proměnné $product získáme hodnotu meta pole pro nastavenou měnu produktu a na jejím základě necháme zobrazit měnu.
add_filter('woocommerce_currency_symbol', 'custom_currency_symbol', 10, 2);
function custom_currency_symbol($currency_symbol, $currency) {
global $product;
if($product){
$product_currency = get_post_meta($product->get_id(), 'product_currency', true);
switch ($product_currency) {
case 'EUR':
$currency_symbol = '€'; // Příklad: přidání textu "EUR" za symbol
break;
case 'CZK':
$currency_symbol = 'Kč'; // Příklad: přidání textu "CZK" za symbol
break;
// Přidejte další měny podle potřeby
}
}
return $currency_symbol;
}