• Как настроить несколько валют в Woocommerce?

    Вариантов реализации может быть несколько. Разница будет в том, какие хуки вы будете использовать. И для каких товаров, простых или вариативных.

    По дефолту цена у вас одна, и в карточке товара поле для цены одно. В нем вы храните цену в "родной" валюте.

    Поэтому, в целом, вам нужно:

    Для хранения второй цены добавить "кастомный" input в карточку товара в админке (тоже самое для третьей цены, четвертой и т.д.). Это можно сделать с помощью хука woocommerce_product_options_general_product_data, также, можно попробовать хук save_post.

    Нужно добавить сохранение нового поля в БД - для этого подойдет хук woocommerce_process_product_meta
    После этого у вас в админке будет выводиться поле и оно будет сохраняться.

    Далее -

    Вывести в интерфейс поле со второй ценой у товаров определенной категории (Second). Для этого придется написать некоторую логику, например - if (in_category('Second')) {...вывести вторую цену...}.

    Также вам нужна логика, чтобы правильно обработать ситуации, когда у вас одна цена === 0, вторая !== 0, обе цены !== 0 и т.д. То есть, придумать, как WC должен понять какую цену выводить, если цена === 0 или null.

    Еще один момент - обработка второй цены в корзине. По дефолту WC не сможет "понять", что ваш кастомный input - это цена. Для того, чтобы добавить в корзину что-то "неродное", подойдет хук woocommerce_before_calculate_totals.

    Код примерно такой:

    1. Добавляем "кастомный" input (в functions.php или в другой скрипт, в котором у вас собрана логика WC):

    add_action('woocommerce_product_options_general_product_data', 'add_custom_price_usd');
    function add_custom_price_usd() {
    	
            echo '<h3>Цена в долларах</h3>';
    	
    	woocommerce_wp_text_input(
            array(
                'id' => 'price_usd',
                'placeholder' => 'Цена в долларах',
                'label' => __('Цена в долларах', 'my-text-domain'),
                'desc_tip' => 'true'
               )
    	);
    }


    2. Добавляем хук для сохранения второй цены:

    add_action('woocommerce_process_product_meta', 'save_custom_price_usd');
    function save_custom_price_usd( $post_id ){
    
    	$price_usd_field = $_POST['price_usd'];
    	update_post_meta($post_id, 'price_usd', esc_html($price_usd_field));
    
    }


    3. Добавляем "обработку" второй цены в корзине:

    add_action( 'woocommerce_before_calculate_totals', 'set_custom_price_usd_to_cart', 10, 1 );
    function set_custom_price_usd_to_cart( $cart ){
            if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        	    return;
    
    	if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
    	    return;
    
    	foreach ( $cart->cart_contents as $key => $value ) {
                if ( ... проверяем, принадлежит ли товар категории Second... ) {
                    /* если да - меняем цену */
                    $value['data']->set_price(... цена в долларах...);
                }
            }
    }


    Здесь внутри foreach код может быть разный, так как не известно, каким образом вы будете получать цену и добавлять ее в корзину. Реализация зависит от вашего кода. Поэтому я описал общий принцип.

    4. Выводим вторую цену в интерфейс - поскольку цену мы сохранили как метабокс, то в интерфейсе получаем ее по id товара с помощью get_post_meta() :
    get_post_meta( $product->get_ID(), 'price_usd', true );


    Ваша конкретная реализация может отличаться. Для вариативных товаров немного по другому, но в целом, шаги будут такие-же.
    Ответ написан
    2 комментария