Я пытаюсь создать специальную кнопку для продуктов, которые имеют варианты в WooCommerce.
Для контекста: в WooCommerce у меня есть атрибут продукта под названием «Тип лицензии». Этот атрибут имеет 2 термина:
У меня есть продукт (с ID
из 203
), который содержит эти два варианта:
В моей теме есть переопределение шаблона content-single.product.php
, в котором есть следующие фрагменты:
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;
?>
<?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; ?>
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&variation_id=211&attribute_pa_license-type=single-site-license&redirect_to_cart=1">Add to Cart (Variation)</a>
Желаемый функционал
Текущие результаты
Шаг 3 — мой подход не работает.
Моя ссылка на кнопку успешно обновляется с указанием идентификатора варианта при изменении и т. д. Но при нажатии кнопки мой продукт не добавляется в корзину.
Во-первых, необходимо внести некоторые небольшие изменения во второй фрагмент кода:
<?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();
});
}
});
Теперь вы сможете добавить в корзину выбранный вариант (тип лицензии).
Не обращайте внимания на вышесказанное! Оказывается, я не ставил флажок «включить» вариант напротив вариантов, поэтому WooComm нечего было добавить. Я могу подтвердить, что ваш код помог мне — спасибо!
Привет, Лоик, еще раз спасибо за подсказки. Я могу подтвердить, что я внес изменения в соответствии с вашими предложениями выше, но моя корзина все еще пуста. Я уверен, что вы проверили свою сторону, она работоспособна. Есть ли способ отладить, где в процессе что-то идет не так?