Вариантов реализации может быть несколько. Разница будет в том, какие хуки вы будете использовать. И для каких товаров, простых или вариативных.
По дефолту цена у вас одна, и в карточке товара поле для цены одно. В нем вы храните цену в "родной" валюте.
Поэтому, в целом, вам нужно:
Для хранения второй цены добавить "кастомный" 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 );
Ваша конкретная реализация может отличаться. Для вариативных товаров немного по другому, но в целом, шаги будут такие-же.