GrifasOfficial
@GrifasOfficial
GEEK

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

Привет всем.

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

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;
}


Все работает как часы. см. изображение

645a5da03592e861440569.png

Теперь как говорится встал вопрос. После этого кода, слева от текста не выскакивают размеры обуви. 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';

то размер выскакивает, но после текста.

Как сделать красиво?

Не программист!

Спасибо и хорошего дня
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 1
@VladimirErmakov
Сложно сказать будет ли это красиво, но попробуйте например такое

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;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы