AJAX-корзина с вариациями: два уровня ключей
У товара есть вариации — фасовка, вкус, объём — и в корзине они должны лежать раздельно, но под одним товаром. Отсюда двухуровневый ключ postId → variantKey. Количество приходит от фронтенда то числом, то строкой, поэтому перед сложением приводится явно: иначе "2" + 1 давало бы "21".
function add_to_cart()
{
session_start();
$data = json_decode(file_get_contents('php://input'), true);
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
$cart = $_SESSION['cart'];
if (isset($cart[$data['postId']][$data['variantKey']])) {
// количество приходит и числом, и строкой — приводим явно
if (is_string($data['quantity'])) {
$cart[$data['postId']][$data['variantKey']] = strval(
intval($data['quantity']) + intval($cart[$data['postId']][$data['variantKey']])
);
} else {
$cart[$data['postId']][$data['variantKey']] += intval($data['quantity']);
}
} else {
$cart[$data['postId']][$data['variantKey']] = $data['quantity'];
}
$_SESSION['cart'] = $cart;
session_write_close();
wp_die();
}
add_action('wp_ajax_add_to_cart', 'add_to_cart');
add_action('wp_ajax_nopriv_add_to_cart', 'add_to_cart');