WooCommerce开发: 创建自定义产品类型实现各种电子商务需求

2019年2月23日16:02:55 发表评论 398 views

WooCommerce 默认支持单个产品、成组产品、外接/关联产品、可变产品这几个产品类型,除此之外,我们还可以添加自定义产品类型来满足我们的需求。比如我们可以添加一个名称为「Coupon product」的自定义产品来实现用户购买优惠券的功能,用户购买了个类型的产品后,会自动发放优惠券给用户。

注册新产品类型类

首先,我们需要需要创先一个新的产品类型类,并且挂载到 init 钩子上,有了这个 WooCommerce 就知道我们创建了一个名为 「coupon」 的产品类型。

add_action('init', function ()
{
    class WC_Product_Coupon extends WC_Product
    {
        public function __construct($product)
        {
            $this->product_type = 'coupon';
            parent::__construct($product);
        }
    }
});

添加新产品类型到产品类型下拉选择中

仅仅创建了产品类型还不够,我们还需要把这个产品类型添加到创建产品时的下拉选单中,这样我们就能够添加这个产品类型的产品了。

add_filter('product_type_selector', function ($types)
{
    $types[ 'coupon' ] = __('Coupon product', 'coupon_product');

    return $types;
});

添加新产品类型选项卡

新的产品类型肯定会有一些和标准产品类型不一样的自定义数据,我们可以添加选项卡到产品属性元数据盒子中,以便可以为这个产品类型添加自定义数据。

add_filter('woocommerce_product_data_tabs', function ($tabs)
{
    $tabs[ 'coupon' ] = [
        'label'  => __('Coupon Product', 'coupon_product'),
        'target' => 'coupon_product_options',
        'class'  => 'show_if_coupon_product',
    ];

    return $tabs;
});

添加字段到选项卡中

有了选项卡,我们就可以添加自定义字段到这个选项卡中了。如下,我们添加了一个名为coupon_product_info 的文本字段到自定义产品类型选项卡中。

add_action('woocommerce_product_data_panels', function ()
{
    ?>
    <div id='coupon_product_options' class='panel woocommerce_options_panel'>
        <div class='options_group'>
            <?php
            woocommerce_wp_text_input(
                [
                    'id'          => 'coupon_product_info',
                    'label'       => __('Coupon Product Spec', 'coupon_product'),
                    'placeholder' => '',
                    'desc_tip'    => 'true',
                    'description' => __('Enter Coupon product Info.', 'coupon_product'),
                    'type'        => 'text',
                ]
            );
            ?>
        </div>
    </div>
    <?php
});

保存自定义字段值

然后,在保存产品时,我们需要同时保存上面添加的自定义字段的数据。

add_action('woocommerce_process_product_meta_coupon_product', function ($post_id)
{
    $coupon_product_info = $_POST[ 'coupon_product_info' ];

    if ( ! empty($coupon_product_info)) {
        update_post_meta($post_id, 'coupon_product_info', esc_attr($coupon_product_info));
    }
});

根据文章类型显示前端数据

保存了数据之后,我们就可以在前端显示这个产品类型的数据了,如下,我们创建了一个 coupon 的模版来显示该产品类型的产品信息。

add_action('woocommerce_single_product_summary', function ()
{
    global $product;
    if ('coupon' == $product->get_type()) {
        $template_path = plugin_dir_path(__FILE__) . 'templates/';
        // Load the template
        wc_get_template('single-product/add-to-cart/coupon.php',
            '',
            '',
            trailingslashit($template_path));
    }
}, 60);

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: