Бывает такой юзкейс: цена на товар должна заполняться в евро, долларах или юанях (да хоть в биткоинах :)), а выводиться на фронтенде только в рублях, по актуальному курсу. Обычно такое случается, когда закуп идет напрямую у производителя, а курс национальной валюты нестабилен.
Я искал решение, но большинство WordPress плагинов не совсем подходило для этой задачи — в основном, это были switcher’ы (переключатели) курсов, различные выпадающие списки, кнопки и пр. Главная проблема, что указывать цену в валюте нужно было только в одном месте, при добавлении/редактировании товара, а во всех других местах были только рубли: при просмотре списка товаров, что на самом сайте, что в админке, в карточке, при оформлении заказа, в списках заказов, т. е. везде. А эти плагины меняли курс, в лучшем случае, только на всей пользовательской части сайта + переключатель для этой задачи не нужен.
Самым подходящим нашелся плагин Currency per Product for WooCommerce.
Но он требовал некоторых доработок. Эти доработки я оформил в виде плагина-дополнения для этого плагина 🙂
По сути доработаны 2 вещи: автообновление курса с сайта Центрального банка Российской Федерации и автовыбор валюты по умолчанию на странице редактирования товара.
В премиум версии плагина Currency per Product есть автообновление курса, но нет ЦБ РФ в списке источников, да и зачем платить, когда можно сделать все самому)
Плагин очень прост, я разберу его код по частям, возможно какие-то фрагменты кода окажутся полезными не только в рамках этой задачи.
Я не стал делать страницу с опциями плагина, а просто вынес конфиг в константы:
define('CPP_EXCHANGE_RATE_OPTION', 'alg_wc_cpp_exchange_rate_1'); // Это WP option куда Currency per Product for WooCommerce сохраняет курсы валют define('CPP_CBR_VALUTE_ID', 'R01239'); // ID валюты в XML-фиде с cbr.ru define('CPP_DEFAULT_VAL', 'EUR'); // Валюта в которой задается цена товара
Функция получения курса валют из XML-фида cbr.ru
И обновление опции alg_wc_cpp_exchange_rate_1
function cppcbr_update_currency() { $doc = new \DOMDocument(); $doc->load('http://www.cbr.ru/scripts/XML_daily.asp'); $xpath = new \DOMXPath($doc); $curs = (float) str_replace(',', '.', $xpath->query('/ValCurs/Valute[@ID="' . CPP_CBR_VALUTE_ID . '"]/Value')->item(0)->textContent); if (!$curs) return false; $curs = 1 / $curs; return update_option(CPP_EXCHANGE_RATE_OPTION, $curs); }
Назначаем эту функцию обработчиком хука WP Cron задания cppcbr_schedule
add_action('cppcbr_schedule', 'cppcbr_update_currency');
Само задание крон cppcbr_schedule добавляем при активации плагина:
function cppcbr_activation() { if (!wp_next_scheduled('cppcbr_hourly_event')) { wp_schedule_event(time(), 'hourly', 'cppcbr_schedule'); } } register_activation_hook(__FILE__, 'cppcbr_activation');
Ну и не забудем удалить его при дезактивации:
function cppcbr_deactivation() { wp_clear_scheduled_hook('cppcbr_schedule'); } register_deactivation_hook(__FILE__, 'cppcbr_deactivation');
Автовыбор валюты по умолчанию на странице редактирования товара:
function cppcbr_woocommerce_currency($woocommerce_currency) { if (!is_admin()) return $woocommerce_currency; global $pagenow; if ($pagenow == 'post-new.php') { return CPP_DEFAULT_VAL; } return $woocommerce_currency; } add_filter('woocommerce_currency', 'cppcbr_woocommerce_currency');
Скачать бесплатно без смс плагин Autoupdate from cbr.ru for Currency per Product.
Скриншот страницы настроек Currency per Product для кейса описанного в посте (Указываем в евро, выводим в RUR).