wordpress 添加链接按钮到可变产品的变化在Woocommerce档案

omvjsjqw  于 2022-11-22  发布在  WordPress
关注(0)|答案(1)|浏览(160)

在woocommerce中,我正在建立一个销售老式Map的网站,我需要找到一种方法,将产品id和变体id从woocommerce商店传递到单个产品页面,使用按钮获得两个不同的变体,而不需要将产品添加到购物车中。
有两种产品类型,原始Map(其中显然只有一个)和无限的数字印刷品。
我已经通过创建一个具有“原始”和“数字印刷”属性的变量产品来分离这些属性。每个属性都有一个变量,所以这非常简单。
该公司希望这两个选项(“原始”和“数字打印”)作为按钮出现在woocommerce商店的首页。
这个想法是,“原件”按钮只会出现,如果原件是在股票(再次,简单的实现)。

问题从这里开始:

其理念是,当按下其中任何一个按钮时,都不会将产品添加到购物车中,而是转到相应的单个产品页面,在该页面中,根据变化类型,将有一系列选项用于选择Map是否加框和装裱,如果是数字Map,则打印大小等。一旦选择,然后可以使用单个产品页面上的添加到购物车按钮将产品添加到购物车。
我现在似乎不能做的是将信息发送到单个产品页面,而不将其添加到购物车(!)
我目前使用的代码使用woocommerce_after_shop_loop_item和woocommerce_single_variation来覆盖默认的add to cart按钮,并将其替换为以下内容,但显然这仍然是将产品添加到购物车。它很冗长,而且显然把事情弄得太复杂了,但我被难住了。添加到购物车按钮需要被替换为简单地移动到单个产品页面并将产品ID和变体ID与之一起的东西,但我没有;我不知道是什么。理论上,你可以将它序列化成一个数组,然后作为$_GET附加到一个锚上发送,但除了可能给予的潜在安全问题外,它在工具栏中看起来很糟糕。
所以,总结一下。我需要找到一种方法,将产品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;

}
jtw3ybtb

jtw3ybtb1#

对于具有特定属性的变量产品,在将页面存档为商店时,以下代码将:

  • 删除默认价格范围
  • 删除添加到购物车
  • 添加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文件中。
您将获得类似以下内容:

相关问题