Woocommerce通过编程创建并使用该产品一次购买

问题描述 投票:-3回答:2

我想将已编程的产品添加到购物车中,但是我不想将其添加到数据库中的其他产品中。有可能这样做吗?以及如何控制发票信息?

我想要这样做的原因是-我想通过表格生成产品,并希望以特殊的价格添加特殊的信息。我也想在发票上包含所有这些信息。

wordpress woocommerce woocommerce-rest-api
2个回答
0
投票

这个问题到处都是,到目前为止您尝试了什么?

  1. 您想将产品添加到购物车而不是Woocommerce产品数据库?
  2. 然后您还要将该“ TempProduct”添加到发票中吗?
  3. 此产品应从客户填写的论坛中创建,然后为他们创建自定义产品,直到他们签出为止。

您能解释为什么要执行其中任何一项吗?此定制产品的目的是什么?


0
投票

这是一个非常有趣的问题。我认为您会受到很多反对和批评,因为这是一个很难回答的问题,而不是因为这是一个不好的问题。从根本上讲,您想直接从表单上输入的数据在购物车中创建订单项,并在订单中创建订单项。我知道这是可以做到的,因为我做了类似的事情。困难在于,用于WC_Cart的API需要WC_Product对象才能创建订单项。我通过为WC_Cart提供代理产品对象来解决此问题。通常,将从数据库中的数据填充产品对象的属性,但是我使用操作和过滤器填充代理对象的属性。由于发票是从订单生成的,因此无需执行任何操作,因为订单项现在将存在。对我来说,此解决方案需要大量的高级代码,即,它花费了大量的时间和精力,并且对WooCommerce有了高级的了解。

现在我的咆哮。这是一个非常丑陋的解决方案,如果以不同的方式实现WooCommerce,则不必这样做。 WooCoomerce(和WordPress)主要使用操作和过滤器来修改代码的默认行为。但是,在面向对象的编程中,扩展了类,以修改类的默认行为。例如。 WC_Cart类具有以下方法:

public function add_to_cart( $product_id = 0, $quantity = 1, $variation_id = 0, $variation = array(), $cart_item_data = array() )

其中$ product_id或$ variation_id必须有效。理想情况下,您可以使用新函数add_to_cart()扩展类WC_Cart,该函数只能从$ cart_item_data创建订单项。但是,您不能扩展WC_Cart类,因为购物车是通过以下方式在WooCommerce类中创建的:

public function initialize_cart() {
    ...
    $this->cart = new WC_Cart();
    ...
}

相反,实现了类WC_Order的使用,因此可以扩展它,因为订单对象是由工厂创建的。

class WC_Order_Factory {
    public static function get_order( $order_id = false ) {
        ...
        // Filter classname so that the class can be overridden if extended.
        $classname = apply_filters( 'woocommerce_order_class', $classname, $order_type, $order_id );
        return new $classname( $order_id );
    }
}

因此您可以使用过滤器'woocommerce_order_class'来扩展WC_Order类。

© www.soinside.com 2019 - 2024. All rights reserved.