WooCommerce 自定义产品类型 - 多个添加到购物车部分问题

问题描述 投票:0回答:1

我在 woocommerce 中创建了一个名为 Booking 的自定义产品类型。

这是我的代码:

class WC_Product_Booking extends WC_Product{
    /**
     * __construct function.
     *
     * @access public
     * @param mixed $product
     */
    public function __construct( $product ) {
        $this->product_type = 'booking';
        $this->supports[]   = 'ajax_add_to_cart';
        parent::__construct( $product );
        add_action('woocommerce_booking_add_to_cart', array($this, 'add_to_cart'),30);
    }

    private function show_pricing_fields(){
      ?><script type='text/javascript'>
        jQuery( document ).ready( function() {
          jQuery( '.options_group.pricing' ).addClass( 'show_if_booking' ).show();
        });
      </script><?php
    }
    /**
     * Display the add to cart button (same as for simple product)
     */
    public function add_to_cart() {
      wc_get_template( 'single-product/add-to-cart/simple.php' );
    }
}

目前唯一的问题是产品页面上的“添加到购物车”部分显示了 6 次,我不明白为什么。

如何解决这个问题?

谢谢


@更新……解决方案(因为LoicTheAztec让我走上了正轨)

我找到了解决这个问题的方法,使用这段代码

if (! function_exists( 'woocommerce_booking_add_to_cart' ) ) {

  /**
  * Output the simple product add to cart area.
  *
  * @subpackage Product
  */

  function booking_add_to_cart() {
    wc_get_template( 'single-product/add-to-cart/simple.php' );
  }

  add_action('woocommerce_booking_add_to_cart',  'booking_add_to_cart');
}

关键就是这个动作

add_action('woocommerce_booking_add_to_cart',  'booking_add_to_cart');

这会将“添加到购物车”按钮放置在正确的位置 - 要在您自己的自定义产品中使用它,请执行名为

woocommerce_YOURPRODUCTTYPE_add_to_cart

的操作
php jquery wordpress woocommerce product
1个回答
7
投票

尝试在测试服务器上测试您的代码,但您的预订产品未在后端显示。

您的问题可能来自这里:我认为您正在使用

public function add_to_cart()
现有的名称函数,并且您必须以不同的方式重命名它。

然后我重新访问了你的代码,基于这个线程

扩展 WC_Product_Simple

而不是 WC_Product
 类可能会更好,因为您的产品使用简单的产品添加到购物车按钮模板:

single-product/add-to-cart/simple.php

使用此自定义代码,我不会像您一样面临多个添加到购物车部分。

—@Update1— 但您仍然可以保持
WC_Product

 延长而不是 WC_Product_Simple
。这样,正如您在评论中所要求的那样,您的产品类型将是第一个和第二个功能中指定的
"simple_booking"
。这并不意味着您的产品很简单(
它只是一个可以更改的小部件,可以在两个地方同时更改)。

所以我再次修改了代码并测试:它可以工作......

这是我使用的代码

(并且我已经测试过)

/** * Register the custom product type after init */ function register_simple_booking_product_type() { /** * This should be in its own separate file. */ class WC_Product_Booking extends WC_Product{ // <= changed back to WC_product class public function __construct( $product ) { $this->product_type = 'simple_booking'; $this->supports[] = 'ajax_add_to_cart'; parent::__construct( $product ); // As we extend simple product class, you may not need this anymore. add_action('woocommerce_booking_add_to_cart', array($this, 'simple_booking_add_to_cart'),30); } public function get_type() { return 'simple_booking'; } } } add_action( 'init', 'register_simple_booking_product_type' ); // Registering the slug name (YOU can CHANGE IT) function add_simple_booking_product( $types ){ // Key should be exactly the same as in the class product_type parameter $types[ 'simple_booking' ] = __( 'Simple booking' ); return $types; } add_filter( 'product_type_selector', 'add_simple_booking_product' ); /** * Show pricing fields for simple_booking product. */ function simple_booking_custom_js() { if ( 'product' != get_post_type() ) : return; endif; ?><script type='text/javascript'> jQuery( document ).ready( function() { jQuery( '.options_group.pricing' ).addClass( 'show_if_simple_booking' ).show(); }); </script><?php } add_action( 'admin_footer', 'simple_booking_custom_js' ); // Not sure you will need that (because of the change of the extended class) function simple_booking_add_to_cart() { wc_get_template( 'single-product/add-to-cart/simple.php' ); }
在位于活动子主题

(或主题)中的 function.php 文件上测试了此代码。

参考:

添加自定义 WooCommerce 产品类型


— @Update2 — 解决方案 (本题作者找到):

要将

添加到购物车按钮 放置在正确的位置(要在您自己的自定义产品中使用它,请执行名为 woocommerce_YOURPRODUCTTYPE_add_to_cart

 的操作),使用以下代码:

if (! function_exists( 'woocommerce_booking_add_to_cart' ) ) { /** * Output the simple product add to cart area. * * @subpackage Product */ function booking_add_to_cart() { wc_get_template( 'single-product/add-to-cart/simple.php' ); } add_action('woocommerce_booking_add_to_cart', 'booking_add_to_cart'); }
    
© www.soinside.com 2019 - 2024. All rights reserved.