Как вывести размер обуви рядом с вариациями?
Привет всем.
По дефолту если стелать вариативный товар (к примеру с размерами обуви), то соответственно на странице товара мы получим размеры, все по классике. Но была задача сделать следующим образом:
Low in Stock (Если в наличии только 2 товара)
In stock (Если в наличии больше 2 товаров)
Only 1 left (Если одна пара в наличии)
Pre-order now (Если нет в наличии, то предоставить возможность предзаказа)
Sold Out (Товар закончился и он не может быть предзаказан потому что на фабрике нет материалов.)
Для этого я попросил ChatGPT написать мне код:
add_filter('woocommerce_variation_option_name', 'display_price_in_variation_option_name'); function display_price_in_variation_option_name($term) { global $product; if (empty($term)) { return $term; } if (empty($product->id)) { return $term; } $variation_id = $product->get_children(); foreach ($variation_id as $id) { $_product = new WC_Product_Variation($id); $variation_data = $_product->get_variation_attributes(); $stock_status = $_product->get_stock_status(); $stock_status = str_replace(array('instock', 'outofstock', 'onbackorder'), array('In Stock', 'Out of Stock', 'Pre-order'), $stock_status); foreach ($variation_data as $key => $data) { if ($data == $term) { $remaining_stock = $_product->get_stock_quantity(); if ($remaining_stock > 2) { $html = 'In stock'; } elseif ($remaining_stock == 2) { $html = 'Low in Stock'; } elseif ($remaining_stock == 1) { $html = 'Only 1 left'; } elseif ($remaining_stock == 0 && $_product->is_on_backorder()) { $html = 'Pre-order now'; } else { $html = 'Sold Out'; } return $html; } } } return $term; } |
add_filter('woocommerce_variation_option_name', 'display_price_in_variation_option_name'); function display_price_in_variation_option_name($term) { global $product; if (empty($term)) { return $term; } if (empty($product->id)) { return $term; } $variation_id = $product->get_children(); foreach ($variation_id as $id) { $_product = new WC_Product_Variation($id); $variation_data = $_product->get_variation_attributes(); $stock_status = $_product->get_stock_status(); $stock_status = str_replace(array('instock', 'outofstock', 'onbackorder'), array('In Stock', 'Out of Stock', 'Pre-order'), $stock_status); foreach ($variation_data as $key => $data) { if ($data == $term) { $remaining_stock = $_product->get_stock_quantity(); if ($remaining_stock > 2) { $html = 'In stock'; } elseif ($remaining_stock == 2) { $html = 'Low in Stock'; } elseif ($remaining_stock == 1) { $html = 'Only 1 left'; } elseif ($remaining_stock == 0 && $_product->is_on_backorder()) { $html = 'Pre-order now'; } else { $html = 'Sold Out'; } return $html; } } } return $term; }
Все работает как часы. см. изображение
Теперь как говорится встал вопрос. После этого кода, слева от текста не выскакивают размеры обуви. ChatGPT отказывается помогать. Не умеет или ломает все.
Как сделать так чтобы вывести размеры обуви перед Low in stock, In stock...
P.S. Заметил что если вставить
$html .= ' - ' . $term;
где-то вот тут
} elseif ($remaining_stock == 2) { $html = 'Low in Stock'; } elseif ($remaining_stock == 1) { $html = 'Only 1 left'; |
} elseif ($remaining_stock == 2) { $html = 'Low in Stock'; } elseif ($remaining_stock == 1) { $html = 'Only 1 left';
то размер выскакивает, но после текста.
Как сделать красиво?
Не программист!
Спасибо и хорошего дня
Дополнительно
Ответы:
Сложно сказать будет ли это красиво, но попробуйте например такое
add_filter('woocommerce_variation_option_name', 'display_price_and_stock_status_in_variation_option_name'); function display_price_and_stock_status_in_variation_option_name($term) { global $product; if (empty($term)) { return $term; } if (empty($product->get_id())) { return $term; } $variation_id = $product->get_children(); foreach ($variation_id as $id) { $_product = new WC_Product_Variation($id); $variation_data = $_product->get_variation_attributes(); $stock_status = $_product->get_stock_status(); $stock_status = str_replace(array('instock', 'outofstock', 'onbackorder'), array('In Stock', 'Out of Stock', 'Pre-order'), $stock_status); foreach ($variation_data as $key => $data) { if ($data == $term) { $remaining_stock = $_product->get_stock_quantity(); if ($remaining_stock > 2) { $stock_status_text = 'In stock'; } elseif ($remaining_stock == 2) { $stock_status_text = 'Low in Stock'; } elseif ($remaining_stock == 1) { $stock_status_text = 'Only 1 left'; } elseif ($remaining_stock == 0 && $_product->is_on_backorder()) { $stock_status_text = 'Pre-order now'; } else { $stock_status_text = 'Sold Out'; } $html = $term . ' (' . $stock_status_text . ')'; return $html; } } } return $term; } |
add_filter('woocommerce_variation_option_name', 'display_price_and_stock_status_in_variation_option_name'); function display_price_and_stock_status_in_variation_option_name($term) { global $product; if (empty($term)) { return $term; } if (empty($product->get_id())) { return $term; } $variation_id = $product->get_children(); foreach ($variation_id as $id) { $_product = new WC_Product_Variation($id); $variation_data = $_product->get_variation_attributes(); $stock_status = $_product->get_stock_status(); $stock_status = str_replace(array('instock', 'outofstock', 'onbackorder'), array('In Stock', 'Out of Stock', 'Pre-order'), $stock_status); foreach ($variation_data as $key => $data) { if ($data == $term) { $remaining_stock = $_product->get_stock_quantity(); if ($remaining_stock > 2) { $stock_status_text = 'In stock'; } elseif ($remaining_stock == 2) { $stock_status_text = 'Low in Stock'; } elseif ($remaining_stock == 1) { $stock_status_text = 'Only 1 left'; } elseif ($remaining_stock == 0 && $_product->is_on_backorder()) { $stock_status_text = 'Pre-order now'; } else { $stock_status_text = 'Sold Out'; } $html = $term . ' (' . $stock_status_text . ')'; return $html; } } } return $term; }
- Можете сами кастомизировать, то что будет выводиться.
Все происходит в этой строчке$html = $term . ' (' . $stock_status_text . ')';
Тут собирается нужная строка для вывода из размера $term и статуса $stock_status_text
Код сейчас должен выводить в формате 9.5 (In Stock) - VladimirErmakov, Идеально
Спасибо огромное вам.
- VladimirErmakov, Такой момент.
Если вставить точь в точь ваш код - то результат будет такимА если поменять if (empty($product->get_id())) {
на if (empty($product->id)) {
то результат такой
Второй вариант подошел отлично, но теперь проблема в том что если дать пару вариаций по размерам не цифрами а буквами к примеру S,M,L,XL то не поднягивается нужная информация.
Есть идея как решить?
Спасибо большое еще раз
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос




Для вариативного товара WooCommerce остаток хранится у конкретной вариации, а не только у родительского товара. Поэтому подписи вроде
Low in Stock,In Stock,Out of Stockнужно выводить при переборе вариаций и смотреть stock quantity каждой вариации.Если вы переопределяете шаблон выбора вариаций или выводите свои кнопки размеров, логика может быть такой:
$available_variations = $product->get_available_variations(); foreach ($available_variations as $variation_data) { $variation = wc_get_product($variation_data['variation_id']); $size = $variation_data['attributes']['attribute_pa_size'] ?? ''; $qty = $variation->get_stock_quantity(); if (! $variation->is_in_stock()) { $status = 'Out of stock'; } elseif ($qty !== null && $qty <= 2) { $status = 'Low in stock'; } else { $status = 'In stock'; } printf( '<div class="size-row"><span>%s</span><small>%s</small></div>', esc_html($size), esc_html($status) ); }
Проверьте, включено ли управление запасами именно у вариаций. Если stock quantity пустой, WooCommerce может считать товар «в наличии», но точного количества для условия
<= 2не будет. Также не забывайте, что атрибут размера может называться иначе:attribute_pa_razmer,attribute_sizeи т.д. Посмотрите массив$variation_data['attributes']через лог, чтобы использовать правильный ключ.Если нужно вывести подпись рядом со стандартными выпадающими вариациями, можно не переписывать весь шаблон, а добавить небольшой JS, который после выбора вариации показывает статус выбранного размера. Но если по дизайну каждый размер должен быть отдельной строкой со своим статусом, тогда удобнее делать кастомный вывод вариаций. При этом кнопку покупки всё равно лучше оставлять совместимой с WooCommerce, чтобы не сломать проверку наличия, цену, скидки и добавление в корзину.