Как внедрить PHP код в вариативный продукт WooCommerce?

Вопрос или проблема

У меня есть небольшая сложность с объяснением проблемы, и я надеюсь, что кто-то сможет понять и помочь мне.

Я установил пользовательские поля в 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>';
}

Заметки

  1. Оптимизация производительности: Учтите, что запросы к API Amazon могут занимать некоторое время, особенно если у вас много вариаций. Чтобы улучшить производительность, вы можете кэшировать результаты запросов.

  2. Обработка ошибок API: Продумайте обработку ошибок на случай, если API Amazon временно недоступен или возвращает ошибку.

  3. Безопасность: Не забывайте о безопасности: защищайте свои ключи доступа и учитывайте правила Amazon о частоте запросов к их API.

Этот подход обеспечит динамическое извлечение цен для каждой вариации вашего товара, что сделает ваш магазин более интерактивным и полезным для покупателей.

Оцените материал
Добавить комментарий

Капча загружается...