Как вывести размер обуви рядом с вариациями?

Ссылка скопирована
1 ответ

Привет всем.

По дефолту если стелать вариативный товар (к примеру с размерами обуви), то соответственно на странице товара мы получим размеры, все по классике. Но была задача сделать следующим образом:

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 то не поднягивается нужная информация.

    Есть идея как решить?

    Спасибо большое еще раз

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

Для вариативного товара 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)
    );
}

$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, чтобы не сломать проверку наличия, цену, скидки и добавление в корзину.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно