В WooCommerce я не знаю, как получить соответствующий идентификатор варианта в переменном продукте при добавлении в корзPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 В WooCommerce я не знаю, как получить соответствующий идентификатор варианта в переменном продукте при добавлении в корз

Сообщение Anonymous »

Я создаю собственный плагин WordPress для добавления пользователей на карту

введите здесь описание изображения

это мой результат. Я хочу отображать выбранный мной атрибут в элементах корзины, но не найден вариант_id, если кто-нибудь знает об этом, пожалуйста, помогите мне решить эту проблему
public function cadc_add_products_to_cart()
{
// function my_update_cookie($logged_in_cookie)
// {
// $_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
// }
// add_action('set_logged_in_cookie', 'my_update_cookie');
// check_ajax_referer('cadc_add_to_cart_nonce', 'nonce');

if (!is_user_logged_in()) {
wp_send_json_error('You must be logged in to add products to the cart.');
}

$user_id = intval($_POST['user_id']);
$products = $_POST['products'];

if (!is_array($products)) {
wp_send_json_error('Invalid products data.');
}

wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
if (!WC()->session->has_session()) {
WC()->session->set_customer_session_cookie(true);
}

$variations_data = array();

foreach ($products as $product) {
$product_id = intval($product['product_id']);
$quantity = intval($product['quantity']);
$variation_attributes = isset($product['attributes']) ? $product['attributes'] : array();

$wc_product = wc_get_product($product_id);

if ('variable' === $wc_product->get_type()) {
$selected_attributes = array();
foreach ($variation_attributes as $attribute_name => $attribute_value) {
$taxonomy = str_replace('attribute_', '', $attribute_name);
$selected_attributes[$taxonomy] = $attribute_value;
}
echo '
Selected Attributes for Product ID ' . $product_id . ': ';
print_r($selected_attributes);
echo '';

$variation_id = $this->get_matching_variation_id($wc_product, $selected_attributes);

if ($variation_id) {
$cart_item_key = WC()->cart->add_to_cart($product_id, $quantity, $variation_id, $selected_attributes);

if (!$cart_item_key) {
wp_send_json_error('Failed to add variable product to cart. Product ID: ' . $product_id . ', Variation ID: ' . $variation_id);
} else {
echo 'Added to cart successfully: ' . $cart_item_key . '';
}
}
} else {
$cart_item_key = WC()->cart->add_to_cart($product_id, $quantity);
if (!$cart_item_key) {
wp_send_json_error('Failed to add product to cart.');
}
}
}
$cart_items = $this->get_cart_items_for_user($user_id);

wp_send_json_success(array(
'cart_items' => $cart_items,
'variations' => $variations_data,
));

// echo '';print_r($variations_data);echo'';die;
}

public function get_matching_variation_id($product, $attributes) {
foreach ($product->get_available_variations() as $variation) {
$match = true;
foreach ($attributes as $taxonomy => $term_slug) {
$variation_attr_key = 'attribute_' . $taxonomy;
// Ensure the attribute key exists in the variation
if (!isset($variation['attributes'][$variation_attr_key]) || $variation['attributes'][$variation_attr_key] != $term_slug) {
$match = false;
break;
}
}
if ($match) {
return $variation['variation_id'];
}
}
return 0; // No matching variation found
}

function cadc_get_product_variations() {
// check_ajax_referer('cadc_add_to_cart_nonce', 'nonce');

$product_id = intval($_POST['product_id']);
$wc_product = wc_get_product($product_id);

if (!$wc_product) {
wp_send_json_error('Invalid product.');
}

$is_variable = $wc_product->is_type('variable');

if (!$is_variable) {
wp_send_json_success(['is_variable' => false]);
}

$variations = [];
$attributes = $wc_product->get_variation_attributes();

foreach ($attributes as $taxonomy => $options) {
$terms = array();

foreach ($options as $option) {
$term = get_term_by('slug', $option, $taxonomy);
if ($term) {
$terms[] = $term->name;
}
}

$variations[$taxonomy] = array(
'label' => wc_attribute_label($taxonomy),
'options' => array_map('esc_html', $terms),
);
}

wp_send_json_success([
'is_variable' => true,
'variations' => $variations
]);
}

private function get_cart_items_for_user($user_id)
{
wp_set_current_user($user_id);

$cart_items = WC()->cart->get_cart();
$response = array();

foreach ($cart_items as $cart_item_key => $cart_item) {
$_product = apply_filters('woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key);
$item_data = array(
'product_id' => $_product->get_id(),
'product_name' => $_product->get_name(),
'quantity' => $cart_item['quantity'],
);

if ($_product->is_type('variation')) {
$variation_attributes = wc_get_formatted_variation($_product, true);
$item_data['variations'] = $variation_attributes;
}

$response[] = $item_data;
}

return $response;
}

(function ($) {
'use strict';

$(document).ready(function () {
function updateCartDisplay(cartItems) {
var cartList = $('#cadc-cart-list');
cartList.empty();

$.each(cartItems, function (index, item) {
var listItem = $('').addClass('woocommerce-mini-cart-item mini_cart_item');
var productText = item.product_name + ' x ' + item.quantity;

// Check if variations exist and are correctly formatted
if (item.variations && typeof item.variations === 'object') {
var variationsText = Object.entries(item.variations).map(function ([key, value]) {
// Ensure key and value are strings and properly format them
return key + ': ' + value;
}).join(', ');

productText += ' (' + variationsText + ')';
}

listItem.text(productText);
listItem.append('Remove');
cartList.append(listItem);
});
}

function updateProductAttributes(attributes, $container) {
var attributeContainer = $container;
attributeContainer.empty();

$.each(attributes, function (attributeKey, attribute) {
var label = attribute.label;
var options = attribute.options;

// Create label element
attributeContainer.append('' + label + '');

// Create select element
var select = $('').attr('name', 'attribute_' + attributeKey);

// Add options to select
$.each(options, function (index, option) {
select.append($('').attr('value', option).text(option));
});

// Append select to container
attributeContainer.append(select);
});
}

$(document).on('change', 'select[name="product_id[]"]', function () {
var $row = $(this).closest('.cadc-product-row');
var productId = $(this).val();
var $attributesContainer = $row.find('.product-attributes-container');

if (productId) {
$.post(cadc_params.ajaxurl, {
action: 'cadc_get_product_variations',
nonce: cadc_params.nonce,
product_id: productId
}, function (response) {
if (response.success) {
if (response.data.is_variable) {
updateProductAttributes(response.data.variations, $attributesContainer);
} else {
$attributesContainer.empty();
}
} else {
alert('Failed to load product variations.');
}
});
}
});

function loadCartItems() {
$.post(cadc_params.ajaxurl, {
action: 'cadc_get_cart_items',
nonce: cadc_params.nonce,
user_id: $('#cadc_user_id').val()
}, function (response) {
if (response.success) {
updateCartDisplay(response.data.cart_items);
} else {
alert('Failed to load cart items.');
}
});
}

$('#cadc-submit').on('click', function () {
var valid = false;
var data = {
action: 'cadc_add_products_to_cart',
nonce: cadc_params.nonce,
user_id: $('#cadc_user_id').val(),
products: []
};

$('.cadc-product-row').each(function () {
var product_id = $(this).find('select[name="product_id[]"]').val();
var quantity = $(this).find('input[name="quantity[]"]').val();
var attributes = {};

$(this).find('select[name^="attribute_"]').each(function () {
attributes[$(this).attr('name')] = $(this).val();
});

if (product_id) {
valid = true;
data.products.push({ product_id: product_id, quantity: quantity, attributes: attributes });
}
});

if (!valid) {
alert('Please select at least one product.');
return;
}

$.post(cadc_params.ajaxurl, data, function (response) {
if (response.success) {
updateCartDisplay(response.data.cart_items);
} else {
alert('Sorry, an error occurred.');
}
});
});

$(document).on('click', '.cadc-remove-add-to-cart-product', function () {
var productId = $(this).data('product-id');
var userId = $('#cadc_user_id').val();

$.post(cadc_params.ajaxurl, {
action: 'cadc_remove_cart_item',
nonce: cadc_params.nonce,
user_id: userId,
product_id: productId
}, function (response) {
if (response.success) {
loadCartItems();
} else {
alert('Failed to remove item from cart.');
}
});
});

function updateRemoveButtonVisibility() {
var rows = $('.cadc-product-row');
if (rows.length > 1) {
rows.find('.cadc-remove').show();
} else {
rows.find('.cadc-remove').hide();
}
}

$(document).on('click', '.cadc-add-more', function () {
var newRow = $(this).closest('.cadc-product-row').clone();
newRow.find('select[name="product_id[]"]').val('');
newRow.find('input[name="quantity[]"]').val(1);
newRow.find('.product-attributes-container').empty(); // Clear the attributes for the new row
$('#cadc-products-container').append(newRow);
updateRemoveButtonVisibility();
});

$(document).on('click', '.cadc-remove', function () {
if ($('.cadc-product-row').length > 1) {
$(this).closest('.cadc-product-row').remove();
updateRemoveButtonVisibility();
}
});

$(document).on('click', '.cadc-increment', function () {
var quantityInput = $(this).siblings('input[name="quantity[]"]');
var currentVal = parseInt(quantityInput.val());
quantityInput.val(currentVal + 1);
});

$(document).on('click', '.cadc-decrement', function () {
var quantityInput = $(this).siblings('input[name="quantity[]"]');
var currentVal = parseInt(quantityInput.val());
if (currentVal > 1) {
quantityInput.val(currentVal - 1);
}
});

loadCartItems();
});
})(jQuery);

это мой код js и php, я не знаю о get_matching_variation_id, посмотрите здесь, как я решаю свою проблему


Подробнее здесь: https://stackoverflow.com/questions/788 ... variable-p
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»