@Pavel_SEO, как кэш отключил?Решил проблему отключением кэша. В моей теме вордпресс кэш жёстко сохранял и фронт и бэк.
Добрый день! Подскажите пожалуйста как сделать чтобы дополнительные поля валют отображалась в вариативных товарах.Ребята, это конечно все хорошо и замечательо... я использовал код из это темы, немного переделал, вот что получилось
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 секунд, особенно в категориях. А все почему? А потому, что цена генерируется в момент загрузки страницы, а в категориях вообще на все шаги цикла делаются запросы. Как сделать так, чтобы страница при загрузке не лагала? быть может сгенерировать файл кэша, а из его уже выводить цены? Генерацию файла можно сделать по кнопке к примеру... есть у кого идеи?
Currency per Product for WooCommerce
и плагина, описанного тут: https://blog.shikarno.net/vnutrennij-kurs-valyut-v-magazine-na-woocommerce-avtoobnovlenie-s-cbr-ru
Да, связка вроде как отличная. Но может поможет кто сделать такую схемку для Беларуси?
Сколько искал альтернатив, ничего толком не подходит.
Хочу представить свой допиленный вариант, я пробовал то, что скидывали выше, но ценник менялся лишь для страницы магазина и страницы товара, в корзине и поиске ценник оставался старый, какой бы фильтр я не привязывал.Актуальная тема и для Украины
// параметр для автоматического обновления курса валюты плагина Currency per product
define('CPP_EXCHANGE_RATE_OPTION', 'alg_wc_cpp_exchange_rate_1');
// получение курса валюты (нужная валюта передаётся в виде параметра code_valute, по умолчанию 'EUR') с сайта ЦБ РФ
function get_CB_currency($code_valute = 'EUR', $exRate_koef = 1, $exRate_add = 0) {
$exRate_cb_xml = simplexml_load_file("https://www.cbr-xml-daily.ru/daily_utf8.xml");
$exRate_default = 90;
if ($exRate_cb_xml === false) {
return $exRate_default;
} else {
foreach ($exRate_cb_xml->Valute as $valute) {
if ((string)$valute->CharCode == $code_valute) {
$exRate_cb['date'] = (string)$exRate_cb_xml['Date'];
$exRate_cb['exRate'] = (string)$valute->Value;
$exRate_cb['code'] = $code_valute;
break;
}
}
$exRate_cb['exRate'] = round(str_replace(',','.',$exRate_cb['exRate']),2);
// проверяем актуальный курс на валидное значение
$exRate_current = ($exRate_cb['exRate'] <= 0) ? $exRate_default : $exRate_cb['exRate'];
// добавляем модификаторы exRate_koef и exRate_add к курсу ЦБ РФ
$exRate_current = $exRate_current * $exRate_koef + $exRate_add;
return $exRate_current;
}
}
// выставляем вручную параметр курса для плагина Currency per product (через параметр CPP_EXCHANGE_RATE_OPTION, см wp-config.php)
function set_currency_CPP($current_currency = 90) {
// для плагина нужно перевести курс ЕВР/РУБ в РУБ/ЕВР
$exRate_rev = 1/get_CB_currency('EUR', 1.1, 1.5);
update_option(CPP_EXCHANGE_RATE_OPTION, $exRate_rev);
}
// добавляем action для привязки в crone
add_action('update_currency_manualy', 'set_currency_CPP');
Нашли решение? У меня такая же проблема, не работает акционная цена. Код не помогает. Или я вставляю не туда? Расскажите подробнее если кто решил проблемупопробуйте перед кодом перезаписи цены дописать условие :
правда могу ошибаться с _sale_price, возможно не то поле или называется по другому))Код:$sale_price = get_post_meta($post->ID, '_sale_price', true); if (!$sale_price) { //код перезаписи цены }