Создание пользовательской кнопки добавления в корзину для переменных продуктов с вариациями в WooCommerce

Я пытаюсь создать специальную кнопку для продуктов, которые имеют варианты в WooCommerce.

Для контекста: в WooCommerce у меня есть атрибут продукта под названием «Тип лицензии». Этот атрибут имеет 2 термина:

  1. Лицензия на один объект,
  2. Лицензия на несколько сайтов.

У меня есть продукт (с ID из 203), который содержит эти два варианта:

В моей теме есть переопределение шаблона content-single.product.php, в котором есть следующие фрагменты:

  1. Раскрывающийся список select, позволяющий пользователю определить, какую лицензию он хочет:
<?php

global $product;

if ($product->is_type('variable')) :

  $taxonomy = 'pa_license_type';
  $terms = array();

  foreach ($product->get_children() as $variation_id) :
    $variation = wc_get_product($variation_id);

    if (!$variation) :
      continue;
    endif;

    // Get the attribute value for the specified taxonomy
    $attribute_value = $variation->get_attribute($taxonomy);

    if ($term = get_term_by('slug', esc_html($attribute_value), $taxonomy)) :
      $terms[$variation->get_id()] = $term;
    endif;

  endforeach;

  if (count($terms) > 0) :
    printf('<label for = "%s">%s</label><select name = "%s" id = "%s">', esc_attr($taxonomy), wc_attribute_label($taxonomy), esc_attr($taxonomy), esc_attr($taxonomy));
    foreach ($terms as $variation_id => $term) :
      printf('<option value = "%s" data-variation-id = "%d">%s</option>', esc_attr($term->slug), $variation_id, esc_html($term->name));
    endforeach;
    echo '</select>';
  endif;

endif;

?>
  1. Пользовательская разметка кнопок:
<?php if ( $product  && $product->is_in_stock() ) :

  $product_id = $product->get_id();
  $add_to_cart_url = esc_url( '?add-to-cart=' . $product_id . '&redirect_to_cart=1' );

  if ($product->is_type('variable')) : ?>
    <a id = "variationBtn" href = "<?= $add_to_cart_url; ?>">
      <?php _e( 'Add to Cart (Variation)', 'woocommerce' ); ?>
    </a>
  <?php else: ?>
    <a href = "<?= $add_to_cart_url; ?>">
      <?php _e( 'Add to Cart', 'woocommerce' ); ?>
    </a>
  <?php endif; ?>

<?php endif; ?>
  1. JS, который управляет href на кнопке варианта на основе идентификатора варианта выбранной лицензии из раскрывающегося списка:
document.addEventListener('DOMContentLoaded', function() {
  const variationBtn = document.getElementById('variationBtn');
  const licenseTypeSelect = document.getElementById('pa_license_type');

  function updateAddToCartUrl() {
    const selectedOption = licenseTypeSelect.options[licenseTypeSelect.selectedIndex];
    const selectedLicenseType = selectedOption.value;
    const variationId = selectedOption.getAttribute('data-variation-id');

    const addToCartUrl = `?add-to-cart=<?php echo $product_id; ?>&variation_id=${variationId}&attribute_pa_license-type=${selectedLicenseType}&redirect_to_cart=1`;
    variationBtn.setAttribute('href', addToCartUrl);
  }

  // Init on page load with default values
  updateAddToCartUrl();

  // Update the URL when the license type changes
  licenseTypeSelect.addEventListener('change', updateAddToCartUrl);
});

Например, образец HTML-представления моей кнопки:

<a id = "variationBtn" href = "?add-to-cart=203&amp;variation_id=211&amp;attribute_pa_license-type=single-site-license&amp;redirect_to_cart=1">Add to Cart (Variation)</a>

Желаемый функционал

  1. Пользователь выбирает тип лицензии из раскрывающегося списка
  2. Пользователь нажимает кнопку «Добавить в корзину»
  3. Система распознает, какой вариант добавить в корзину, по идентификатору продукта и варианту.
  4. Пользователь автоматически перенаправляется в корзину

Текущие результаты

Шаг 3 — мой подход не работает.

Моя ссылка на кнопку успешно обновляется с указанием идентификатора варианта при изменении и т. д. Но при нажатии кнопки мой продукт не добавляется в корзину.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, необходимо внести некоторые небольшие изменения во второй фрагмент кода:

<?php if ( $product  && $product->is_in_stock() ) :
    $product_id      = $product->get_id();
    $add_to_cart_url = esc_url( '?add-to-cart=' . $product_id . '&redirect_to_cart=1' );
  
    if ($product->is_type('variable')) {
        printf('<a id = "variationBtn" data-product_id = "%d" href = "%s">%s</a>', $product_id, $add_to_cart_url, __('Add to Cart (Variation)', 'woocommerce'));
    } else {
        printf('<a href = "%s">%s</a>', $add_to_cart_url, __('Add to Cart', 'woocommerce') );
    } ?>
<?php endif;?>

Кроме того, в вашем коде JavaScript есть несколько ошибок (здесь я использую jQuery, поскольку эта JS-библиотека используется WordPress и WooCommerce). Вместо этого попробуйте следующее:

jQuery(function($){
    if ( $('#variationBtn').length ) {
        const taxonomy = 'pa_license_type', 
            productID  = $('#variationBtn').data('product_id');

        var variationID = $('select[name='+taxonomy+']').find(":selected").data('variation-id'),
            selectedVal = $('select[name='+taxonomy+']').find(":selected").val();

        function changeAddToCartURL(){
            const addToCartUrl = '?add-to-cart='+productID+'&variation_id='+variationID+'&attribute_'+taxonomy+'='+selectedVal+'&redirect_to_cart=1';
            $('#variationBtn').attr('href', addToCartUrl);
        }

        // At start
        changeAddToCartURL();

        // On Change
        $('select[name='+taxonomy+']').on('change', function(){
            variationID = $(this).find(":selected").data('variation-id'),
            selectedVal = $(this).find(":selected").val();
            changeAddToCartURL();
        });
    }
});

Теперь вы сможете добавить в корзину выбранный вариант (тип лицензии).

Привет, Лоик, еще раз спасибо за подсказки. Я могу подтвердить, что я внес изменения в соответствии с вашими предложениями выше, но моя корзина все еще пуста. Я уверен, что вы проверили свою сторону, она работоспособна. Есть ли способ отладить, где в процессе что-то идет не так?

Freddy 18.07.2024 03:03

Не обращайте внимания на вышесказанное! Оказывается, я не ставил флажок «включить» вариант напротив вариантов, поэтому WooComm нечего было добавить. Я могу подтвердить, что ваш код помог мне — спасибо!

Freddy 18.07.2024 19:35

Другие вопросы по теме