将链接的按钮添加到Woocommerce存档中的可变产品的变体

时间:2018-11-16 11:11:44

标签: php wordpress woocommerce custom-taxonomy variations

在woocommerce中,我正在建立一个销售老式地图的网站。我需要找到一种方法,使用按钮将woocommerce商店的产品ID和变体ID传递到单个产品页面,以使用两个单独的变体,而无需将产品添加到购物车中。

有两种产品类型,原始地图(显然只有一种)和数字印刷品是无限的。

我通过创建具有“原始”和“数字印刷品”属性的可变产品来分离这些产品。每个属性只有一个变体,因此非常简单。

公司希望这两个选项(“原始”和“数字打印”)以按钮的形式出现在woocommerce商店的首页中。

这个想法是,“原件”按钮仅在原件有货时才会出现(再次,很容易实现)。

问题从这里开始:

这个想法是,当按下这两个按钮中的任何一个按钮时,都不会将产品添加到购物车中,而是会转到相应的单个产品页面,并根据变体类型在其中提供一系列选项选择是否对地图进行框框和安装,是否为数字形式的打印尺寸等。选择后,可以使用单个产品页面上的添加到购物车按钮将产品添加到购物车。

我现在似乎无法执行的操作是将信息发送到单个产品页面,而无需将其添加到购物车(!)

我当前使用的代码使用woocommerce_after_shop_loop_item和woocommerce_single_variation覆盖默认的添加到购物车按钮,并将其替换为以下内容,但是显然,这仍然是将产品添加到购物车中。看代码,它很冗长,而且显然使事情复杂化,但是我很沮丧。需要将“添加到购物车”按钮替换为仅移至单个产品页面并带有产品ID和版本ID的东西,但我不知道该怎么做。从理论上讲,您可以将其序列化为数组,并以$ _GET的形式附加到锚点上进行发送,但是除了可能引起的潜在安全问题之外,它在工具栏中的外观也很伪劣。

因此,总而言之。我需要找到一种方法,可以使用按钮将woocommerce商店的产品ID和版本ID传递到两个单独的版本的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 :(得分:1)

对于具有特定属性(用于商店中的存档页面中的变体)的可变产品,以下代码将:

  • 删除默认价格范围
  • 删除添加到购物车
  • 添加2个价格与产品变化相关的按钮
  

按钮链接将把客户带到可变产品的正确预选版本。

您将需要在第一个函数中定义具有'original''digital-prints'术语值的产品属性。您需要在第二个函数中定义产品属性词条。

对于印刷品,我们以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