• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Woocommerce, каждому товару своя валюта

Image CMS

Ria

Форумчанин
#61
Задача такая:
1. Вывести в админке только поле "Валюта": woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_curency_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) );
2. Вывести это значение на страницах категорий возле .$product->price вместо get_currency_symbol()

Помогите пожалуйста, как правильно прописать в functions.php и каким запросом выводить на страницах магазина. P.S. пересчет по курсам не нужен!
 

searchingman

Гуру
Местный
#62
Задача такая:
1. Вывести в админке только поле "Валюта": woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_curency_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) );
2. Вывести это значение на страницах категорий возле .$product->price вместо get_currency_symbol()

Помогите пожалуйста, как правильно прописать в functions.php и каким запросом выводить на страницах магазина. P.S. пересчет по курсам не нужен!
Если у Вас будет выведена для разных товаров разная валюта, то как Вы будете добавлять товары в корзину?
Или у Вас просто каталог без добавления в корзину и оформления заказа?
 

Ria

Форумчанин
#63
Если у Вас будет выведена для разных товаров разная валюта, то как Вы будете добавлять товары в корзину?
Или у Вас просто каталог без добавления в корзину и оформления заказа?
Да, все верно - у меня нет корзины - просто каталог :)
 

Ria

Форумчанин
#66
Задача такая:
1. Вывести в админке только поле "Валюта": woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_curency_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) );
2. Вывести это значение на страницах категорий возле .$product->price вместо get_currency_symbol()

Помогите пожалуйста, как правильно прописать в functions.php и каким запросом выводить на страницах магазина. P.S. пересчет по курсам не нужен!
Подскажите пожалуйста, что именно нужно оставить для моей задачи в этом коде (что бы лишнего ничего не было), и как потом правильно значение этого одного поля вывести? Спасибо
Код:
function wc_myprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_my_price', 'class' => 'wc_input_price short', 'label' => __( 'Стоимость', 'woocommerce' ) ) ); // добавляем поле "Стоимость"
woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_curency_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) ); // добавляем поле "Валюта", где указываем только RUB, USD или EUR, по желанию можно добавить новые значения или переделать это поле в выпадающий список
}
add_action( 'woocommerce_product_options_pricing', 'wc_myprice_product_field' );


function wc_myprice_save_product( $product_id ) {
if ( ( $_POST['_my_price'] ) ) {
if ( is_numeric( $_POST['_my_price'] ) )
update_post_meta( $product_id, '_my_price', $_POST['_my_price'] );
} else delete_post_meta( $product_id, '_my_price' );

if ( ( $_POST['_curency_price'] ) ) {
update_post_meta( $product_id, '_curency_price', $_POST['_curency_price'] );
} else delete_post_meta( $product_id, '_curency_price' );
}
add_action( 'save_post', 'wc_myprice_save_product' );


function wc_myprice_show() {
global $product, $post;
// Ничего не предпринимаем для вариативных товаров
//if ( $product->product_type <> 'variable' ) {
$my_price = get_post_meta( $product->id, '_my_price', true );
$curency = get_post_meta( $product->id, '_curency_price', true );
// woocommerce_price( $RUB )

$blogtime = current_time('mysql'); // записываем текущее время и дату
list( $today_year, $today_month, $today_day, $hour, $minute, $second ) = split( '([^0-9])', $blogtime ); //сохраняем отдельно значения даты, часов, минут и т.д.

if ($hour == 7 || $hour == 12 || $hour == 17 || $hour == 22 || $hour == 1 || $hour == 4) { // указываем на протяжении каких часов мы обновляем (перезаписываем) курс на новый
$data="var=go";
$fp = fsockopen("ВАШ_ДОМЕН", 80, $errno, $errstr, 10); // открыть указанный хост по 80 порту
$out = "POST /currency/НАЗВАНИЕ_ФАЙЛА_СКРИПТА.php HTTP/1.1\n"; // открыть данный скрипт
$out .= "Host: ВАШ_ДОМЕН\n";
$out .= "Referer: ВАШ_ДОМЕН/\n";
$out .= "User-Agent: Opera\n";
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out); // отправка данных принимающему скрипту
fclose($fp);   
}
 
// открываем файл с курсом валют и записываем в массив
$lines = file('http://ВАШ_ДОМЕН/currency.txt');

    if ($lines) {       
// проверяем заполнено ли поле, если да, то умножаем на курс и записываем в $custom_price
if ($curency == "RUB")
{
    $custom_price = $my_price;
}

if ($curency == "USD")
{
    $custom_price = $my_price * $lines[0];
}

if ($curency == "EUR")
{
    $custom_price = $my_price * $lines[1];
}
$custom_price = round($custom_price, 2); // округляем до сотых, чтобы в regular_price не записывались огромные дроби

update_post_meta( $post->ID, '_regular_price', $custom_price );
update_post_meta( $post->ID, '_price', $custom_price );   
    }
}

add_action( 'woocommerce_get_regular_price', 'wc_myprice_show', 10 );
 

Ria

Форумчанин
#67
Подскажите пожалуйста, ничего понять не могу :( Добавляем в админку поля:
Код:
function wc_myprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_my_price', 'class' => 'wc_input_price short', 'label' => __( 'Стоимость', 'woocommerce' ) ) ); // добавляем поле "Стоимость"
woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) ); // добавляем поле "Валюта", где указываем только RUB, USD или EUR, по желанию можно добавить новые значения или переделать это поле в выпадающий список
}
add_action( 'woocommerce_product_options_pricing', 'wc_myprice_product_field' );


function wc_myprice_save_product( $product_id ) {
if ( ( $_POST['_my_price'] ) ) {
if ( is_numeric( $_POST['_my_price'] ) )
update_post_meta( $product_id, '_my_price', $_POST['_my_price'] );
} else delete_post_meta( $product_id, '_my_price' );

if ( ( $_POST['_curency_price'] ) ) {
update_post_meta( $product_id, '_curency_price', $_POST['_curency_price'] );
} else delete_post_meta( $product_id, '_curency_price' );
}
add_action( 'save_post', 'wc_myprice_save_product' );


add_action( 'woocommerce_get_regular_price', 'wc_myprice_show', 10 );
Потом в wc-formatting-functions.php мне нужно вывести то значение которое я сохранил в поле (при редактировании товара)
Код:
sprintf( $price_format, '<span class="woocommerce-Price-currencySymbol">' . get_woocommerce_currency_symbol( $currency ) . '</span>', $price );
Как мне это значение вывести вместо ' . get_woocommerce_currency_symbol( $currency ) . ' ?
 

Ssssory

Новичок
#68
Кто-нибудь знает какой action отвечает за вывод woocommerce_product_options_pricing для вариативного товара?
Никак не могу найти в документации.
Или ссылочку дайте, где можно почитать про нутро вариативного товара. Английский не пугает, просто не удаётся найти то, что нужно.
 

Ssssory

Новичок
#69
Разобрался. Что-то вроде:
PHP:
function save_product_variation( $variation_id, $i ){
    $variation_custom_data_usd = $_POST['variation_custom_data_usd'][$i];
    $variation_custom_data_eur = $_POST['variation_custom_data_eur'][$i];
  if( $variation_custom_data_usd != "" ||  $variation_custom_data_eur != "" || $variation_custom_data_usd != 0 ||  $variation_custom_data_eur != 0 ){

    // save custom data usd
    if ( $variation_custom_data_usd != '' || $variation_custom_data_usd != 0 ) {
        
        $custom_data_usd = $variation_custom_data_usd;       
        update_post_meta( $variation_id, '_custom_usd', $custom_data_usd );
        $custom_data_usd *= 60; //fix curs usd
        update_post_meta( $variation_id, '_regular_price', $custom_data_usd );
        update_post_meta( $variation_id, '_price', $custom_data_usd );
        
    }else {update_post_meta( $variation_id, '_custom_usd', "" );}
        
    if (  $variation_custom_data_eur != '' || $variation_custom_data_eur != 0   ) { // save custom data eur
        
        $custom_data_eur = $variation_custom_data_eur;       
        update_post_meta( $variation_id, '_custom_eur', $custom_data_eur );
        $custom_data_eur *= 75; //fix curs eur
        update_post_meta( $variation_id, '_regular_price', $custom_data_eur );   
        update_post_meta( $variation_id, '_price', $custom_data_eur );       
    }else {update_post_meta( $variation_id, '_custom_eur', "" ); }
  }
}
Говнокод, конечно. Как будет время, буду облагораживать.
 
#70
Добрый день. Мне нужно было добавить в статус товара пункт "Под заказ", на этом форуме я нашла код
Код:
function add_custom_stock_type() {
    ?>
    <script type="text/javascript">
    jQuery(function(){
        jQuery('._stock_status_field').not('.custom-stock-status').remove();
    });
    </script>
    <?php

    woocommerce_wp_select( array( 'id' => '_stock_status', 'wrapper_class' => 'hide_if_variable custom-stock-status', 'label' => __( 'Stock status', 'woocommerce' ), 'options' => array(
        'instock' => __( 'In stock', 'woocommerce' ),
        'outofstock' => __( 'Out of stock', 'woocommerce' ),
        'onrequest' => __( 'под заказ', 'woocommerce' ), // The new option !!!
    ), 'desc_tip' => true, 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ) ) );
}
add_action('woocommerce_product_options_stock_status', 'add_custom_stock_type');
function save_custom_stock_status( $product_id ) {
    update_post_meta( $product_id, '_stock_status', wc_clean( $_POST['_stock_status'] ) );
}
add_action('woocommerce_process_product_meta', 'save_custom_stock_status',99,1);

function woocommerce_get_custom_availability( $data, $product ) {
    switch( $product->stock_status ) {
        case 'instock':
            $data = array( 'availability' => __( 'In stock', 'woocommerce' ), 'class' => 'in-stock' );
        break;
        case 'outofstock':
            $data = array( 'availability' => __( 'Out of stock', 'woocommerce' ), 'class' => 'out-of-stock' );
        break;
        case 'onrequest':
            $data = array( 'availability' => __( 'под заказ', 'woocommerce' ), 'class' => 'on-request' );
        break;
    }
    return $data;
}
add_action('woocommerce_get_availability', 'woocommerce_get_custom_availability', 10, 2);
он мне помог, но не совсем. Хотелось бы сделать так, что бы при статусе "Под заказ" была еще кнопка "Заказать", при нажатии на которую товар добавлялся бы в корзину и можно было бы оформить заказ. Автору писала, но он молчит. Буду очень благодарна если кто-нибудь сможет помочь.
 

Kvistis

Опытный
Местный
#71
Использую код:
PHP:
function wc_myprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_my_price', 'class' => 'wc_input_price short', 'label' => __( 'Цена', 'woocommerce' ) ) );
woocommerce_wp_text_input( array( 'id' => '_my_sale_price', 'class' => 'wc_input_price short', 'label' => __( 'Цена распродажи', 'woocommerce' ) ) );
woocommerce_wp_text_input( array( 'id' => '_curency_price', 'class' => 'wc_input_curency_price short', 'label' => __( 'Валюта', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_myprice_product_field' );

function wc_myprice_save_product( $product_id ) {
if ( ( $_POST['_my_price'] ) ) {
if ( is_numeric( $_POST['_my_price'] ) )
update_post_meta( $product_id, '_my_price', $_POST['_my_price'] );
} else delete_post_meta( $product_id, '_my_price' );
if ( ( $_POST['_my_sale_price'] ) ) {
if ( is_numeric( $_POST['_my_sale_price'] ) )
update_post_meta( $product_id, '_my_sale_price', $_POST['_my_sale_price'] );
} else delete_post_meta( $product_id, '_my_sale_price' );
if ( ( $_POST['_curency_price'] ) ) {
update_post_meta( $product_id, '_curency_price', $_POST['_curency_price'] );
} else delete_post_meta( $product_id, '_curency_price' );
}
add_action( 'save_post', 'wc_myprice_save_product' );

function wc_myprice_show() {
global $product, $post;
$kurs_dollar = 59;
$kurs_euro = 62;
$my_price = get_post_meta( $product->id, '_my_price', true );
$my_sale_price = get_post_meta( $product->id, '_my_sale_price', true );
$curency = get_post_meta( $product->id, '_curency_price', true );

if ($curency == "")
{
    $custom_price = $my_price;
    $custom_sale_price = $my_sale_price;
}

if ($curency == "USD")
{
    $custom_price = $my_price * $kurs_dollar;
    $custom_sale_price = $my_sale_price * $kurs_dollar;
}

if ($curency == "EUR")
{
    $custom_price = $my_price * $kurs_euro;
    $custom_sale_price = $my_sale_price * $kurs_euro;
}
$custom_price = round($custom_price, 2);
$custom_sale_price = round($custom_sale_price, 2);
update_post_meta( $post->ID, '_regular_price', $custom_price );
update_post_meta( $post->ID, '_sale_price', $custom_sale_price );
update_post_meta( $post->ID, '_price', $custom_price );          
}
add_action( 'woocommerce_get_regular_price', 'wc_myprice_show', 10 );
Работает на базовой цене, а на цене распродажи нет
Понимаю так, что из-за этих строчек:
PHP:
update_post_meta( $post->ID, '_price', $custom_price );  

add_action( 'woocommerce_get_regular_price', 'wc_myprice_show', 10 );
Что переписать чтобы выводились обе цены пересчитанные - базовая и распродажи - а не одна базовая? Спасибо за помощь, очень надеюсь что она будет.
 
Последнее редактирование:

Noob-diaz

Новичок
#72
Блин, не совсем понятно... почему то не работает к сожалению. Может кто посмотрит в чём там дело?
мой скайп - pkartakov
О благодарности договоримся
 

vatis

Новичок
#73
без парсинга это вы о чем? Этот код просто добавляет 3 доп.поля для ввода цены, чтобы переделать под гривну нужно просто поле рубля переименовать под гривну. Так же, в вашем случае, нужно подтягивать курс уже с ЦБ Украины и умножать значения иностранных валют на курс ЦБ. В общем нужно переделывать =) простого переименования поля не хватит, так как доллары и евро будут переводится в рубли.
Помогите, плиз, переименовал под грн., но как подтянуть курс НБУ??? меняю строку, но ничего не персчитывает. В чем еще причина????
 
#74
Подскажите, пожалуйста, вставляю код в functions.php, но в админке WordPress не добавляются новые поля, а остается все как и было. Пробовал вставлять раные коды со страницы http://wpcommerce.ru/threads/woocommerce-kazhdomu-tovaru-svoja-valjuta.2652/#post-14538
Все безрезультатно.
Очень прошу Вас помочь.
 

Mario

Новичок
#75
На третьей странице один товарищ спрашивал
мне что то похожее но много проще! ) подскажие как изменить этот код или есть готовое решение?
Мне нужено просто возможность выбора для каждого товара своей валюты без всяких пересчетов!
Т.е. есть базовая цена и я могу выбрать в чем ее отображать на сайте - в $ или рублях например и все!
Если кому нужен подобный плагин, то можете использовать "Booster for WooCommerce" и в нем модуль "WooCommerce Currency per Product". Позволяет задавать отдельную валюту для каждого товара, в том числе вариативного.
В бесплатной версии помимо основной валюты магазина можно добавить еще 1 произвольную.
 
Сверху Снизу