Изменение количества товара Woocommerce
Суть проблемы такая, у меня на сайте WordPress используется WooCommerce, Polylang и Code Snippet Есть простые товары и вариативные, так как в плагине полилэнг приходится создавать разные товары под каждый язык, был написан небольшой код, который обновляет количество на других языках после покупки, выглядит так
add_action('woocommerce_reduce_order_stock', 'sync_stock_between_translations', 10, 1);
function sync_stock_between_translations($order) {
if (function_exists('pll_get_post_translations')) {
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$quantity = $item->get_quantity();
$variation_id = $item->get_variation_id();
// Обрабатываем простой товар
if (!$variation_id) {
$product_translations = pll_get_post_translations($product_id);
foreach ($product_translations as $lang => $translation_id) {
$product = wc_get_product($translation_id);
if ($product) {
$total_stock = max($product->get_stock_quantity(), 0) - $quantity;
$product->set_stock_quantity($total_stock);
$product->save();
error_log("Updated total stock for product ID: " . $translation_id . " to " . $total_stock);
}
}
}
Но с вариативными товарами все сложнее, например создается вариативный товар Кола, туда указываются атрибуты размер 500мл и 1л, общее количество товара кола задаётся например 10штук, 500мл 7 штук и 3 штуки литровые - нужно сделать то же самое, при покупке товара на любом из языков, чтоб обновилось количество на остальных языках
if ($variation_id) {
// Получаем все переводы родительского товара
$parent_translations = pll_get_post_translations($product_id);
foreach ($parent_translations as $lang => $translation_id) {
$parent_product = wc_get_product($translation_id);
if ($parent_product && $parent_product->is_type('variable')) {
// Обновляем общее количество родительского товара
$total_stock = max($parent_product->get_stock_quantity(), 0) - $quantity;
$parent_product->set_stock_quantity($total_stock);
$parent_product->save();
error_log("Updated total stock for variable product ID: " . $translation_id . " to " . $total_stock);
// Получаем все вариации родительского товара
$variations = $parent_product->get_children();
foreach ($variations as $parent_variation_id) {
$parent_variation = wc_get_product($parent_variation_id);
if ($parent_variation && $parent_variation->get_id() == $variation_id) {
// Обновляем количество конкретной вариации на всех языках
$variation_translations = pll_get_post_translations($parent_variation_id);
foreach ($variation_translations as $lang => $translated_variation_id) {
$translated_variation = wc_get_product($translated_variation_id);
if ($translated_variation && $translated_variation->is_type('variation')) {
$variation_stock = max($translated_variation->get_stock_quantity(), 0) - $quantity;
$translated_variation->set_stock_quantity($variation_stock);
$translated_variation->save();
error_log("Updated stock for variation ID: " . $translated_variation_id . " to " . $variation_stock);
}
}
}
}
}
}
Однако после покупки на всех языках вариативного товара обновляется только общее количество товара, если смотреть конкретные вариации например 500мл, количество не меняется