Как реализовать две цены в карточках товаров (вариативных) в каталоге?
Необходимо в определенной категории товаров сделать две цены (за штуку/за комплект), то есть не в самой странице товара, а в карточках в каталоге, чтобы была возможность нажать сразу на необходимую вариацию и добавить товар в корзину.
На данный момент у вариативного товара при нажатии "В корзину" переносит на страницу товара самого для выбора вариации, а как это выполнить сразу пользователю, не переходя по карточке товара, а сразу проходя по каталогу?
Может существует плагин какой-то?
Дополнительно
Дубль Как в Woocommerce сделать две цены (за штуку и за комплект)?
Михаил Р. @Mike_Ro Python, JS, WordPress, SEO, Bots, Adversting Примерно так:
function test() { global $product; if($product->is_type('variable')) { $variations = $product->get_available_variations(); echo '<div class="custom-variations-wrapper">'; foreach($variations as $variation) { if(isset($variation['display_price'])) { $variation_id = $variation['variation_id']; $variation_price = $variation['display_price']; // or 'display_regular_price' echo '<form action="' . esc_url($product->add_to_cart_url()) . '" method="post" enctype="multipart/form-data">'; echo '<div class="variation" data-variation-id="' . esc_attr($variation_id) . '">'; echo '<p class="price">' . sprintf(__('%s'), wc_price($variation_price)) . '</p>'; echo '<input type="hidden" name="product_id" value="' . esc_attr($product->get_id()) . '" />'; echo '<input type="hidden" name="variation_id" value="' . esc_attr($variation_id) . '" />'; foreach($variation['attributes'] as $attribute => $value) { echo '<input type="hidden" name="' . esc_attr($attribute) . '" value="' . esc_attr($value) . '">'; } echo '<button type="submit">' . __('В корзину') . '</button>'; echo '</div>'; echo '</form>'; } } echo '</div>'; } } add_action('woocommerce_after_shop_loop_item', 'test', 20); |
function test() { global $product; if($product->is_type('variable')) { $variations = $product->get_available_variations(); echo '<div class="custom-variations-wrapper">'; foreach($variations as $variation) { if(isset($variation['display_price'])) { $variation_id = $variation['variation_id']; $variation_price = $variation['display_price']; // or 'display_regular_price' echo '<form action="' . esc_url($product->add_to_cart_url()) . '" method="post" enctype="multipart/form-data">'; echo '<div class="variation" data-variation-id="' . esc_attr($variation_id) . '">'; echo '<p class="price">' . sprintf(__('%s'), wc_price($variation_price)) . '</p>'; echo '<input type="hidden" name="product_id" value="' . esc_attr($product->get_id()) . '" />'; echo '<input type="hidden" name="variation_id" value="' . esc_attr($variation_id) . '" />'; foreach($variation['attributes'] as $attribute => $value) { echo '<input type="hidden" name="' . esc_attr($attribute) . '" value="' . esc_attr($value) . '">'; } echo '<button type="submit">' . __('В корзину') . '</button>'; echo '</div>'; echo '</form>'; } } echo '</div>'; } } add_action('woocommerce_after_shop_loop_item', 'test', 20);
- Благодарю!
Всё получилось, только при нажатии "В корзину" не добавляет определенную вариацию в корзину, то есть просто кнопка кликается
А это каким методом настроить можно? - Taron4uk, обновил ответ, попробуйте
- Михаил Р., заменил, но теперь просто переносит при нажатии любой из двух кнопок на страницу товара
- Taron4uk, возможно, тема или плагин влияет на это поведение, т.к. у меня работает. Можно попробовать через js Как добавить в корзину вариативный товар через Ajax?
- Михаил Р., спасибо Вам огромное!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для вариативного товара WooCommerce по умолчанию ведёт пользователя на карточку товара, потому что нужно выбрать вариацию. Если вы хотите прямо в каталоге показывать две цены «за штуку/за комплект» и добавлять нужную вариацию в корзину, нужно вывести кнопки для конкретных variation ID.
Сначала у вариативного товара должны быть две вариации, например атрибут
pa_type:shtukaиkomplekt. В loop получаете доступные вариации:global $product; if ($product && $product->is_type('variable')) { foreach ($product->get_available_variations() as $variation) { $variation_id = $variation['variation_id']; $price_html = $variation['price_html']; $url = esc_url(add_query_arg([ 'add-to-cart' => $product->get_id(), 'variation_id' => $variation_id, ], wc_get_cart_url())); echo '<a href="' . $url . '" class="button">' . wp_kses_post($price_html) . '</a>'; } }
Но для вариаций с атрибутами нужно передавать ещё значения атрибутов, иначе WooCommerce может не добавить товар:
?add-to-cart=123&variation_id=456&attribute_pa_type=shtuka
Для production лучше использовать AJAX add to cart и корректно передавать attributes. Также ограничьте вывод только нужной категории через
has_term().Если вариаций всего две и логика стабильная, это нормально. Если вариаций много, карточка каталога быстро станет перегруженной, и лучше вести на страницу товара.