Задать вопрос
@fominvladyslav

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

Друзья, подскажите, как я могу сделать разные валюты для разных категорий товаров в Woocommerce?

К примеру:

Товар А имеет категорию "Main" и будет отображаться в рублях

Товар B имеет категорию "Second" и будет отображаться в долларах.

Очень нужна помощь, уже голову сломал..
  • Вопрос задан
  • 1418 просмотров
Подписаться 4 Сложный Комментировать
Решения вопроса 1
Вариантов реализации может быть несколько. Разница будет в том, какие хуки вы будете использовать. И для каких товаров, простых или вариативных.

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

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

Для хранения второй цены добавить "кастомный" 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 );


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

Войдите, чтобы написать ответ

Похожие вопросы