Jak na WooCommerce produkty, které mají mít každý jinou měnu

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é.

Meta pole výběru měny

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;
}

MĚJTE PŘEHLED, CO SE DĚJE NA
ČESKÝCH PLUGINECH

A navíc získejte slevu 10 % na váš první nákup!

Nespamujeme! Další informace naleznete v našich zásadách ochrany osobních údajů.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

5 × čtyři =