Как реализовать две цены в карточках товаров (вариативных) в каталоге?

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

Необходимо в определенной категории товаров сделать две цены (за штуку/за комплект), то есть не в самой странице товара, а в карточках в каталоге, чтобы была возможность нажать сразу на необходимую вариацию и добавить товар в корзину.

На данный момент у вариативного товара при нажатии "В корзину" переносит на страницу товара самого для выбора вариации, а как это выполнить сразу пользователю, не переходя по карточке товара, а сразу проходя по каталогу?

Может существует плагин какой-то?

Дополнительно

Дубль Как в 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?
  • Михаил Р., спасибо Вам огромное!
Нужно решить такую задачу?

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

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

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

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

?add-to-cart=123&variation_id=456&attribute_pa_type=shtuka

Для production лучше использовать AJAX add to cart и корректно передавать attributes. Также ограничьте вывод только нужной категории через has_term().

Если вариаций всего две и логика стабильная, это нормально. Если вариаций много, карточка каталога быстро станет перегруженной, и лучше вести на страницу товара.

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

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

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

комментарий

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

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