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

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

kvanton11

Новичок
@Alexodiy,
Спасибо большое за код, очень понравился.
А у кого нибудь есть код, что бы и на вариативные товары распространялась другая валюта?
 

Kristian

Новичок
Добрый день! Скрипт работает но почему-то с задержкой. Обновляет цены минут через 5. Писали вроде как что надо отключить кэш, но в данном случае непонятно как и что отключат. Пробывал отключать с помощью плагинов, перепробовал несколько штук - не помогло. В общем как исправить задержку? .... заранее спасибо
 
Последнее редактирование:

ВиталийВВ

Новичок
Подниму тему.
Попробовал новый подход. связку плагина:
Currency per Product for WooCommerce
и плагина, описанного тут: https://blog.shikarno.net/vnutrennij-kurs-valyut-v-magazine-na-woocommerce-avtoobnovlenie-s-cbr-ru
на мой взгляд работает почти идеально.
Происходит и пересчет валют, и курс с ЦБ и вариативный товар работает. и все это бесплатно.
Единственный минус - кроме рублевого товара доступен только еще одна валюта (н-р доллар или евро)
 

24andrey24

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

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 секунд, особенно в категориях. А все почему? А потому, что цена генерируется в момент загрузки страницы, а в категориях вообще на все шаги цикла делаются запросы. Как сделать так, чтобы страница при загрузке не лагала? быть может сгенерировать файл кэша, а из его уже выводить цены? Генерацию файла можно сделать по кнопке к примеру... есть у кого идеи?
Добрый день! Подскажите пожалуйста как сделать чтобы дополнительные поля валют отображалась в вариативных товарах.
 

Blaex

Новичок
Да, связка вроде как отличная. Но может поможет кто сделать такую схемку для Беларуси?

Сколько искал альтернатив, ничего толком не подходит.
 

neoff

Опытный
Сверху Снизу