Небольшой пример по изменению цены от курса.Спасибо за ответ, да этот плагин встречал, но хотел узнать нет ли другого решения? Может не готового а примера.
function my_woocommerce_get_price($price, $_product) {
$kurs = 58; // курс валюты
$new_price = $price * $kurs;
return $new_price; // новая цена
}
add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
Небольшой пример по изменению цены от курса.
Код нужно вставить в functions.php вашей темы.
PHP:function my_woocommerce_get_price($price, $_product) { $kurs = 58; // курс валюты $new_price = $price * $kurs; return $new_price; // новая цена } add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
Это всего лишь пример возможного динамического изменения цен от каких-то параметров.Блин, как актуально! Только хотел подобный вопрос задать. Этот код решает зависимость цен в магазине от курса валюты? Т.е. если курс понижается/повышается, цены в магазине соответственно индексируются?
Блин, как актуально! Только хотел подобный вопрос задать. Этот код решает зависимость цен в магазине от курса валюты? Т.е. если курс понижается/повышается, цены в магазине соответственно индексируются?
Хотя возможно сделать, чтобы и курсы автоматом подгружались, н-р, из РБК.
Можно ничего не переводить.Уф. Сейчас у меня цены в рублях. Получается цены нужно перевести в доллары, чтобы весь этот механизм заработал?
Не могу сложить пазл, если сейчас у нас цены в рублях, как мы поставим зависимость от курса валюты, чтобы цены моментально индексировались?
function my_woocommerce_get_price($price, $_product) {
$kurs = 58; // фиксированный базовый курс валюты
$kurs_current = 60; // текущий курс валюты
$new_price = $price * ($kurs_current / $kurs);
return $new_price; // новая цена
}
add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
$new_price = round ($price * $kurs);
В WooCommerce есть специальная функция wc_get_price_decimals(), которая получает количество знаков после запятой из настроек плагина http://take.ms/cpkrm .У меня на сайте цены округленные до целых, но доллар буду забивать дробный. Я в php не шарю, правильно ли я понимаю, мне надо прописать, ну или ceil вместо round если хочу округлять до бОльшего, а не по правилам?PHP:$new_price = round ($price * $kurs);
$decimals = wc_get_price_decimals();
$new_price = round ($price * $kurs, $decimals);
Да, проверил. В приведенном выше примере не требуется указывать округление, т.к. используется параметр округления из настроек плагина.Спасибо!
А woocommerce_get_price по умолчанию (не наша замененная) наверное так и работает: берет обычную цену и округляет ее с учетом wc_get_price_decimals() ? Или там еще есть что-то?
add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
function my_woocommerce_get_price($price, $_product) {
// параметры ------------------------------------
$kurs_base = 58; // фиксированный базовый курс валюты
$kurs_current = 60; // текущий курс валюты по умолчанию
$kurs_cb = get_currency_cb('EUR'); // получить курс EUR
// $kurs_cb = get_currency_cb('USD'); // получить курс USD
// --------------------------------------------------
$kurs_base = ($kurs_base <= 0) ? 1 : $kurs_base;
$kurs_current = ($kurs_cb['kurs'] <= 0) ? $kurs_current : $kurs_cb['kurs'];
$new_price = $price * ($kurs_current / $kurs_base);
return $new_price; // новая цена
}
function get_currency_cb($code_valute = 'USD', $time_cash = '60' ) {
// параметры -------------------;
if ($code_valute != 'USD' && $code_valute != 'EUR') $code_valute = 'USD';
if ($time_cash <= 0) $time_cash = 60; // время кеширования в минутах
// ------------------------------
$name_cash = 'cash_kurs_cb';
$cached = get_transient($name_cash);
if ($cached !== false && $cached['code'] == $code_valute) {
$kurs_cb = $cached;
return $kurs_cb;
}
else {
libxml_use_internal_errors(true);
$kurs_cb_xml = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp");
if ($kurs_cb_xml === false) {
echo "Ошибка загрузки XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
$kurs_cb = $cached;
return $kurs_cb;
}
else
{
foreach ($kurs_cb_xml->Valute as $valute) {
if ((string)$valute->CharCode == $code_valute) {
$kurs_cb['date'] = (string)$kurs_cb_xml['Date'];
$kurs_cb['kurs'] = (string)$valute->Value;
$kurs_cb['code'] = $code_valute;
break;
}
}
$kurs_cb['kurs'] = round(str_replace(',','.',$kurs_cb['kurs']),2);
set_transient($name_cash, $kurs_cb, MINUTE_IN_SECONDS * $time_cash);
return $kurs_cb;
}
}
}
/** Меняем цену товара в соответствии с курсом **/
function my_woocommerce_get_price($price, $_product) {
$kurs = 10; // курс валюты
$new_price = $price * $kurs;
return $new_price; // новая цена
}
add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
Да, действительно для некоторых случаев, как вывод цены с учетом старой цены используются другие функции.ууупс
попробовал на практике, причем самый первый, базовый вариант. Работает странно.
На простых товарах - вместо зачеркнутой цены без скидки и цены со скидкой, выводится только новая цена (расчтывается (индексируется) вроде правильно).
На вариативных товарах выводятся сначала зачеркнутая старая цена без учета индексирования на курс, потом новая цена с учетом индексирования, вот так:
177 грн.–197 грн.1,682 грн.–1,872 грн.
(подчеркивание означает зачеркивание).
Вот код, который я добавлял в functions.php
PHP:/** Меняем цену товара в соответствии с курсом **/ function my_woocommerce_get_price($price, $_product) { $kurs = 10; // курс валюты $new_price = $price * $kurs; return $new_price; // новая цена } add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
/** Меняем цену товара в соответствии с курсом **/
function my_woocommerce_get_price($price, $_product) {
// $kurs = 10; // курс валюты
$kurs = get_option( 'woocommerce_set_kurs', 1 ); // курс валюты, полученный из настроек в админке
$new_price = $price * $kurs;
return $new_price; // новая цена
}
add_filter('woocommerce_get_price', 'my_woocommerce_get_price',100,2);
/** Добавляем в админку поле для настройки курса **/
add_filter( 'woocommerce_general_settings', 'add_a_setting_kurs' );
function add_a_setting_kurs( $settings ) {
$updated_settings = array();
foreach ( $settings as $section ) {
if ( isset( $section['id'] ) && 'pricing_options' == $section['id'] &&
isset( $section['type'] ) && 'sectionend' == $section['type'] ) {
$updated_settings[] = array(
'title' => 'Курс валюты',
'desc' => 'Курс валюты учета по отношению к валюте, которая отображается посетителю интернет-магазина',
'id' => 'woocommerce_set_kurs',
'type' => 'text',
'css' => 'width:70px;',
'default' => '1',
'desc_tip' => false,
);
}
$updated_settings[] = $section;
}
return $updated_settings;
}
/** Добавляем в админку поле для настройки курса **/
add_filter( 'woocommerce_general_settings', 'add_a_setting_kurs' );
function add_a_setting_kurs( $settings ) {
$settings[] = array( 'name' => 'Настройки курса', 'type' => 'title', 'desc' => '', 'id' => 'woocommerce_kurs_settings' );
$settings[] = array(
'title' => 'Курс валюты',
'desc' => 'Курс валюты учета по отношению к валюте, которая отображается посетителю интернет-магазина',
'id' => 'woocommerce_set_kurs',
'type' => 'text',
'css' => 'width:70px;',
'default' => '1',
'desc_tip' => false,
);
$settings[] = array( 'type' => 'sectionend', 'id' => 'woocommerce_kurs_settings');
return $settings;
}