Вопрос или проблема
У меня есть небольшая сложность с объяснением проблемы, и я надеюсь, что кто-то сможет понять и помочь мне.
Я установил пользовательские поля в WooCommerce, которые использую для ввода конкретного кода для каждого продукта (что-то вроде SKU, называемого “asin”). Затем я использую этот код на своей стороне с помощью Amazon API, чтобы получить цену со страницы продукта на Amazon (не переживайте, мой вопрос общий и не связан с API).
Вот пример моего кода для простого типа продукта, который работает идеально, как мне нужно.
<?php
// Это код, который я использую, чтобы получить значение "asin" из пользовательских полей.
$de_asin = get_post_meta(get_post()->ID, "wccaf_de_asin", true );
$associate_id = "google-21";
$access_key = "N22EKJMDWJMDWIJWIJWDIWDW";
$secret_key = "48UJIFJIJFEIFJF89U8EKFIEJIUJWHUFUEFJFSIJF";
$amazon_domain = "amazon.de";
$asin = $de_asin;
// Это код, который я использую, чтобы получить цену продукта с сайта amazon, используя его API
include 'amazon-api/amazon_class.php';
$amazon = new AmazonAPI($associate_id, $access_key, $secret_key, $amazon_domain);
$item = $amazon->item_lookup($asin)->get_item_data();
echo $item->price;
?>
Моя проблема заключается в продуктах-вариациях, поскольку мне нужно, чтобы эта пользовательская цена изменялась, когда я переключаюсь между вариациями.
Вот код, который я использую, чтобы получить пользовательское значение продукта для вариационного типа продукта “код asin”, который работает идеально, но мне нужно добавить цену аналогично тому, что я сделал для простого продукта выше, и использовать текущий выбранный код asin вариации и использовать этот код asin в переменной amazon API выше.
Я получил это пользовательское поле для вариационных продуктов отсюда
http://www.remicorson.com/woocommerce-custom-fields-for-variations/
<?php
add_filter('woocommerce_available_variation', 'custom_load_variation_settings_products_fields');
function custom_load_variation_settings_products_fields($variations) {
// дублируйте строку для каждого поля
$variations['wccaf_de_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_de_asin_var', true);
$variations['wccaf_uk_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_uk_asin_var', true);
return $variations;
}
// wccf_after_variation_description - это хук, который я создал в variation.php
add_action('wccf_after_variation_description', 'wcff_variation_affiliate_button', 10);
function wcff_variation_affiliate_button() {
// Геолокация по IP
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
$de_asin = '{{{ data.variation.wccaf_de_asin_var }}}';
$uk_asin = '{{{ data.variation.wccaf_uk_asin_var }}}';
if ($country_code == "DE") {
$asin = $de_asin;
}
if ($country_code == "GB") {
$asin = $uk_asin;
}
echo $asin;
}
?>
Я полагаю, что основная проблема здесь в том, что этот код получает код asin выбранной вариации с помощью javascript после рендеринга страницы, и мне нужно получить код asin выбранной вариации и передать его в php, чтобы я мог отправить его через amazon API для получения цены. Поэтому мне интересно, есть ли способ использовать код API для получения цены, показанный в первом простом фрагменте, и использовать его во втором фрагменте вариации?
Большое спасибо заранее 🙂
Я решил проблему, что мне не хватало, так это преобразовать возвращаемое значение API в строку. Вот код, надеюсь, это поможет кому-то.
<?php
add_filter('woocommerce_available_variation', 'custom_load_variation_settings_products_fields');
function custom_load_variation_settings_products_fields($variations) {
// дублируйте строку для каждого поля
$variations['wccaf_de_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_de_asin_var', true);
$variations['wccaf_uk_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_uk_asin_var', true);
$amazon = new AmazonAPI("GOOGLE-21", "JIJIOJEFIOJEIOFEJFIO", "DJWIJDIWOJDFIJIOFJDIOWJQFOIJIOIOJWID");
$item = $amazon->item_lookup($variations['wccaf_de_asin_var'])->get_item_data();
$variations['amz_price_var_de'] = (string)$item->price;
return $variations;
}
// wccf_after_variation_description - это хук, который я создал в variation.php
add_action('wccf_after_variation_description', 'wcff_variation_affiliate_button', 10);
function wcff_variation_affiliate_button() {
// Геолокация по IP
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
$de_asin = '{{{ data.variation.wccaf_de_asin_var }}}';
$uk_asin = '{{{ data.variation.wccaf_uk_asin_var }}}';
if ($country_code == "DE") {
$asin = $de_asin;
}
if ($country_code == "GB") {
$asin = $uk_asin;
}
echo $asin;
?>
<div class="buy_amz_btn_wrap">
{{{data.variation.amz_price_var_de}}}
</div>
<?php
}
?>
Ответ или решение
Для решения вашей задачи по получению цен на товары с Amazon для вариативных продуктов в WooCommerce, мы можем использовать следующий подход. Основной аспект заключается в том, чтобы сопоставить код ASIN каждой вариации с соответствующей ценой, полученной через API Amazon. Я уже заметил, что вы нашли решение, но давайте разберем весь процесс более детально.
Шаг 1: Изменение функции получения данных вариаций
Вам нужно изменить функцию, которая добавляет пользовательские поля к данным вариации, чтобы она также извлекала цены из API Amazon. Вот как это можно сделать:
add_filter('woocommerce_available_variation', 'custom_load_variation_settings_products_fields');
function custom_load_variation_settings_products_fields($variations) {
// Получаем ASIN для каждой вариации
$variations['wccaf_de_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_de_asin_var', true);
$variations['wccaf_uk_asin_var'] = get_post_meta($variations['variation_id'], 'wccaf_uk_asin_var', true);
// Инициализируем Amazon API
$associate_id = "google-21";
$access_key = "N22EKJMDWJMDWIJWIJWDIWDW";
$secret_key = "48UJIFJIJFEIFJF89U8EKFIEJIUJWHUFUEFJFSIJF";
$amazon_domain = "amazon.de";
include 'amazon-api/amazon_class.php'; // Убедитесь, что путь к классу правильный
$amazon = new AmazonAPI($associate_id, $access_key, $secret_key, $amazon_domain);
// Получаем цену по ASIN
if(!empty($variations['wccaf_de_asin_var'])) {
$item = $amazon->item_lookup($variations['wccaf_de_asin_var'])->get_item_data();
$variations['amz_price_var_de'] = (string) $item->price;
}
return $variations;
}
Шаг 2: Отображение цены в шаблоне
После того как вы получите цену для каждой вариации, вы можете отобразить её на фронт-энде, используя хук, который вы уже создали.
add_action('wccf_after_variation_description', 'wcff_variation_affiliate_button', 10);
function wcff_variation_affiliate_button() {
// Геолокация по IP
$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
$de_asin = '{{{ data.variation.wccaf_de_asin_var }}}';
$uk_asin = '{{{ data.variation.wccaf_uk_asin_var }}}';
if ($country_code == "DE") {
$asin = $de_asin;
} elseif ($country_code == "GB") {
$asin = $uk_asin;
}
echo '<div class="buy_amz_btn_wrap">';
echo 'ASIN: ' . $asin . '<br>';
echo 'Цена: {{{ data.variation.amz_price_var_de }}}';
echo '</div>';
}
Заметки
-
Оптимизация производительности: Учтите, что запросы к API Amazon могут занимать некоторое время, особенно если у вас много вариаций. Чтобы улучшить производительность, вы можете кэшировать результаты запросов.
-
Обработка ошибок API: Продумайте обработку ошибок на случай, если API Amazon временно недоступен или возвращает ошибку.
-
Безопасность: Не забывайте о безопасности: защищайте свои ключи доступа и учитывайте правила Amazon о частоте запросов к их API.
Этот подход обеспечит динамическое извлечение цен для каждой вариации вашего товара, что сделает ваш магазин более интерактивным и полезным для покупателей.