Добавить связанные кнопки к вариациям переменного продукта В архивах Woocommerce - PullRequest
0 голосов
/ 16 ноября 2018

В woocommerce я создаю веб-сайт, на котором продаются старинные карты. Мне нужно найти способ передать идентификатор продукта и идентификатор варианта из магазина woocommerce на страницу отдельного продукта для двух отдельных вариантов с помощью кнопок без добавления продукта в корзину.

Существует два типа продуктов: оригинальная карта (из которых, очевидно, только один) и бесконечные цифровые отпечатки.

Я разделил их, создав переменный продукт с атрибутами «оригинал» и «цифровые отпечатки». есть один вариант для каждого атрибута, так что многое довольно просто.

Компания хочет, чтобы эти две опции («оригинал» и «цифровая печать») отображались на главной странице магазина woocommerce в виде кнопок.

Идея состоит в том, что кнопка «оригинал» появится только в том случае, если оригинал есть в наличии (опять же, просто достичь).

Проблемы начинаются здесь:

Идея состоит в том, что при нажатии любой из этих кнопок продукт не будет добавлен в корзину, а перейдет на соответствующую страницу отдельного продукта, и там, в зависимости от типа варианта, появится ряд вариантов для выберите, будет ли карта оформлена и смонтирована, если она цифровая, насколько большим должен быть отпечаток и т. д. и т. д. После выбора продукт можно добавить в корзину с помощью кнопки «Добавить в корзину» на странице одного продукта.

То, что я сейчас не могу сделать, это отправить информацию на страницу отдельного продукта, не добавляя ее в корзину (!)

Код, который я сейчас использую, использует woocommerce_after_shop_loop_item и woocommerce_single_variation, чтобы перезаписать кнопку добавления в корзину по умолчанию и заменить ее на следующую, но, очевидно, это все еще добавляет продукт в корзину. Глядя на код, он многословен и, очевидно, слишком сложен, но я в тупике. Кнопка «Добавить в корзину» должна быть заменена чем-то, что просто перемещается на страницу отдельного продукта и содержит идентификатор продукта и идентификатор варианта, но я не знаю, что. Теоретически вы можете сериализовать его в массив и отправить как $ _GET, привязанный к якору, но кроме потенциальных проблем с безопасностью, которые это может вызвать, на панели инструментов это выглядит некачественно.

Итак, в заключение. Мне нужно найти способ передать идентификатор продукта и идентификатор варианта из магазина woocommerce на страницу отдельного продукта для двух отдельных вариантов, используя кнопки без добавления продукта в корзину. Есть идеи?

код ниже:

function mc_loop_variation_add_to_cart_button() {
global $product;

$product_obj = new WC_Product_Factory();
$product = $product_obj->get_product($product);   

if ($product->product_type == 'variable'):
  $children   = $product->get_children( $args = '', $output = OBJECT ); 

  foreach ($children as $key=>$value) {

      $product_variatons = new WC_Product_Variation($value);

      if ( $product_variatons->exists() && $product_variatons->variation_is_visible() ) {
          $variations[$value] = $product_variatons->get_variation_attributes();

          foreach ($variations[$value] as $key=>$value) {
            $stock = $product_variatons->get_stock_quantity();
            $product_price = $product_variatons->regular_price;



            if($value=="original") {

              if($stock > 0) {
                echo "Price: £" . $product_price;

            ?>

              <div class="woocommerce-variation-add-to-cart variations_button">
                <?php

                ?>
                  <button type="submit" class="single_add_to_cart_button button">Buy <?php //echo $value; ?></button>
                  <input type="hidden" name="add-to-cart" value="<?php echo absint( $product->get_id() ); ?>" />
                  <input type="hidden" name="product_id" value="<?php echo absint( $product->get_id() ); ?>" />
                  <input type="hidden" name="variation_id" class="variation_id" value="<?php echo $value; ?>" />
              </div>

                <?php
                } else {
                  echo "";
                }

            } else {
                echo "Price: £" . $product_price;
                ?>
              <div class="woocommerce-variation-add-to-cart variations_button">
                  <button type="submit" class="single_add_to_cart_button button">Buy <?php echo $value; ?></button>
                  <input type="hidden" name="add-to-cart" value="<?php echo absint( $product->get_id() ); ?>" />
                  <input type="hidden" name="product_id" value="<?php echo absint( $product->get_id() ); ?>" />
                  <input type="hidden" name="variation_id" class="variation_id" value="<?php echo $value; ?>" />
              </div>
                <?php
            }
          ?>



          <?php
          }
      }
  }
endif;

}

1 Ответ

0 голосов
/ 17 ноября 2018

Для переменных продуктов с определенным атрибутом для вариантов на страницах архивов, таких как магазин, следующий код будет:

  • Удалить диапазон цен по умолчанию
  • Удалить добавить в корзину
  • Добавить 2 кнопки с ценами, связанными с вариациями продукта

Ссылки кнопок приведут клиента к нужному предварительно выбранному варианту в переменном продукте.

Вам потребуется определить в первой функции атрибут продукта, который имеет значения 'original' и 'digital-prints' term. Во 2-й функции необходимо определить атрибут продукта слагаемые.

Для распечаток мы отображаем минимальную цену, например, Price from: $123.00.

код:

add_action( 'woocommerce_after_shop_loop_item_title', 'loop_custom_variable_products', 2 );
function loop_custom_variable_products() {
    global $product;

    // HERE define the product attribute (for 'original' and 'digital-prints' term values
    $attribute = 'type'; // <====  <====  <====  <====  <====  <====  <====  <====  <====

    // Only variable products
    if ( $product->get_type() === 'variable' && $product->get_attribute($attribute) ) :
        remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 ); // Remove price
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 ); // remove add to cart
        add_action( 'woocommerce_after_shop_loop_item', 'loop_variations_custom_buttons_and_prices', 10 ); // Add prices with custom buttons
    endif;
}

function loop_variations_custom_buttons_and_prices() {
    global $product;

    if ( $product->get_type() === 'variable' ) :

    // HERE define your targeted slugs for the defined product attribute
    $targeted_slugs = array('original', 'digital-prints'); // <====  <====  <====  <====

    $found_original = $found_a_print = false;
    $data = $url_var = [];

    $min_price_html = __("Price from: ") . strip_tags( wc_price( $product->get_variation_price( 'min', true ) ) );

    // Loop through product variations ids
    foreach ($product->get_children() as $variation_id ){

        // Get the WC_Product_Variation Object
        $variation = wc_get_product( $variation_id );

        if ( $variation->is_type('variation') && $variation->variation_is_visible() && $variation->variation_is_active() ) {
            $stock_qty  = $variation->get_stock_quantity();
            $price_html = __("Price: "); strip_tags( wc_price( wc_get_price_to_display( $variation ) ) );
            $attributes = $variation->get_variation_attributes();

            // Loop through variation attributes
            foreach ( $attributes as $attribute => $term_slug ) {
                if( $term_slug === $targeted_slugs[0] ) {
                    $data[$term_slug]['price'] = $price_html . strip_tags( wc_price( wc_get_price_to_display( $variation ) ) );
                    $data[$term_slug]['stock'] = $stock_qty > 0 ? true : false;

                    $found_original = true;
                }
                if( $term_slug === $targeted_slugs[1] ) {
                    $data[$term_slug]['price'] = $min_price_html;
                    $data[$term_slug]['stock'] = true;

                    $targeted_attribute = $attribute;

                    $found_a_print = true;
                }
            }
        }
        if( $found_original && $found_a_print) {
            // If both are found we stop the main loop
            break;
        }
    }

    // Output prices and buttons
    foreach( $targeted_slugs as $slug ) {
        if( isset($data[$slug]) && $data[$slug]['stock'] ) {
            echo '<div class="variation-' . $slug . '">
                <div class="price" style="margin-bottom:14px;">' . $data[$slug]['price'] . '</div>';
            foreach( $attributes as $key => $value ){
                if( isset($targeted_attribute) && $targeted_attribute === $key ) {
                    $url_var[] = $key . '=' . $slug;
                } else {
                    $url_var[] = $key . '=null';
                }
            }
            $href = $product->get_permalink() . '?' . implode('&', $url_var);
            echo '<a href="'.$href.'" class="button">' . __ ("Buy") . ' ' . str_replace('-', ' ', $slug)  . '</a>
            </div>';
        }
    }
    endif;
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Вы получите что-то вроде:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...