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

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 произвольную.
 

Alexodiy

Новичок
#76
Ребята, это конечно все хорошо и замечательо... я использовал код из это темы, немного переделал, вот что получилось

PHP:
function wc_rubprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_rub_price', 'class' => 'wc_input_price short', 'label' => __( 'RUB', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_rubprice_product_field' );


add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );

function woo_add_custom_general_fields() {

  global $woocommerce, $post;
 
  echo '<div class="options_group">';
 
 woocommerce_wp_text_input(
    array(
        'id'          => '_nacenka',
        'label'       => __( 'Наценка в %', 'woocommerce' ),
        'placeholder' => '50',
        'desc_tip'    => 'true',
        'description' => __( 'Введите наценку в процентах без символа "%". Скрипт прибавит % к общей сумме. Напоминаем, что цена формируется именно к полю "Базовая цена ( руб.)", а валюта высчитывается по курсу ЦБ России', 'woocommerce' )
    )
);
  echo '</div>';
    
}


function wc_usdprice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_usd_price', 'class' => 'wc_input_price short', 'label' => __( 'USD', 'woocommerce' ), 'desc_tip'    => 'true', 'description' => __( 'Высчитывается по курсу ЦБ России если поле заполнено', 'woocommerce' ) ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_usdprice_product_field' );


function wc_europrice_product_field() {
woocommerce_wp_text_input( array( 'id' => '_euro_price', 'class' => 'wc_input_price short', 'label' => __( 'EUR', 'woocommerce' ), 'desc_tip'    => 'true', 'description' => __( 'Высчитывается по курсу ЦБ России если поле заполнено', 'woocommerce' )  ) );
}
add_action( 'woocommerce_product_options_pricing', 'wc_europrice_product_field' );

// Сохранить наценку
function woo_add_custom_general_fields_save( $post_id ){
    
    // Text Field
    $woocommerce_nacenka = $_POST['_nacenka'];
    if( !empty( $woocommerce_nacenka ) )
        update_post_meta( $post_id, '_nacenka', esc_attr( $woocommerce_nacenka ) );

    $woocommerce_euro_price = $_POST['_euro_price'];
    if ( ( $_POST['_euro_price'] ) ) {
    if ( is_numeric( $_POST['_euro_price'] ) )
    update_post_meta( $post_id, '_euro_price', $_POST['_euro_price'] );
    } else delete_post_meta( $post_id, '_euro_price' );

    $woocommerce_usd_price = $_POST['_usd_price'];
    if ( ( $_POST['_usd_price'] ) ) {
    if ( is_numeric( $_POST['_usd_price'] ) )
    update_post_meta( $post_id, '_usd_price', $_POST['_usd_price'] );
    } else delete_post_meta( $post_id, '_usd_price' );

    $woocommerce_usd_price = $_POST['_rub_price'];
    if ( ( $_POST['_rub_price'] ) ) {
    if ( is_numeric( $_POST['_rub_price'] ) )
    update_post_meta( $post_id, '_rub_price', $_POST['_rub_price'] );
    } else delete_post_meta( $post_id, '_rub_price' );
    
}

function wc_myprice_show() {
global $product, $post;
// Ничего не предпринимаем для вариативных товаров
//if ( $product->product_type <> 'variable' ) {
$RUB = get_post_meta( $product->get_id(), '_rub_price', true );
$USD = get_post_meta( $product->get_id(), '_usd_price', true );
$EUR = get_post_meta( $product->get_id(), '_euro_price', true );
$nacenka = get_post_meta( $product->get_id(), '_nacenka', true );
// woocommerce_price( $RUB )

// Формируем сегодняшнюю дату
    $date = date("d/m/Y");
    // Формируем ссылку
    $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
    // Загружаем HTML-страницу
    $fd = fopen($link, "r");
    $text="";
    if (!$fd) echo "";
    else
    {
      // Чтение содержимого файла в переменную $text
      while (!feof ($fd)) $text .= fgets($fd, 4096);
    }
    // Закрыть открытый файловый дескриптор
    fclose($fd);
    
  // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru
  $content = $text;
  // Разбираем содержимое, при помощи регулярных выражений
  $pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
  preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
  $dollar = "";
  $euro = "";
  foreach($out as $cur)
  {
    if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]);
    if($cur[2] == 978) $euro   = str_replace(",",".",$cur[4]);
  }

  // проверяем заполнено ли поле, если да, то умножаем на курс и записываем в $custom_price
if (($RUB != "") && ($RUB != 0)) {
    $custom_price = $RUB;
}
if (($USD != "") && ($USD != 0)) {
    $custom_price = $USD * $dollar;
}
if (($EUR != "") && ($EUR != 0)) {
    $custom_price = $EUR * $euro;
}
ceil($custom_price); // округляем до сотых

$regular_price = get_post_meta($post->ID, '_price', true); //получаем текущую цену товара


$proc = $nacenka; // количество процентов
$number = $custom_price; // число к которому надо добавить проценты
$proc = $number/100*$proc; // высчитываем процент от числа
$result = $number + $proc; // суммируем число с процентами от этого числа
ceil($result); // округляем до целого



//if ($regular_price != $ $custom_price) { // проверяем совпадает ли текущая цена с нашей новой, если нет, то перезаписываем её
update_post_meta( $post->ID, '_regular_price', $result );
update_post_meta( $post->ID, '_price', $result );   

//можно вывести нашу custom_price для проверки
 // echo '<div class="woocommerce_msrp">';
 // _e( 'RUB : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price RUB">' . $RUB . '</span>';
 // echo '</div>';
 
 // echo '<div class="woocommerce_msrp">';
 // _e( 'USD : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price USD">' . $USD . '</span>';
 // echo '</div>';
 
 // echo '<div class="woocommerce_msrp">';
 // _e( 'EUR : ', 'woocommerce' );
 // echo '<span class="woocommerce-rrp-price EUR">' . $EUR . '</span>';
 // echo '</div>';
}

//}
//}


add_action( 'woocommerce_single_product_summary', 'wc_myprice_show', 5 );
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_myprice_show' );
Но при включенных add_action:

PHP:
add_action( 'woocommerce_single_product_summary', 'wc_myprice_show', 5 );
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_myprice_show' );
Страница грузится более 8 секунд, особенно в категориях. А все почему? А потому, что цена генерируется в момент загрузки страницы, а в категориях вообще на все шаги цикла делаются запросы. Как сделать так, чтобы страница при загрузке не лагала? быть может сгенерировать файл кэша, а из его уже выводить цены? Генерацию файла можно сделать по кнопке к примеру... есть у кого идеи?
 
Сверху Снизу