Woocommerce自定义product_type似乎无法正确保存

时间:2017-03-24 13:01:13

标签: wordpress woocommerce

我正在创建自己的woocommerce插件,并意识到,在创建或更新产品时,我的自定义product_type不会保存。我确信问题来自我的插件,但我不知道在哪里看。 添加product_type的功能(根据帖子)

function extend_woocommerce()
{
    Class WC_Product_Connected_To_General_Product extends WC_Product_Simple
    {
        public function __construct($product)
        {
            $this->product_type = 'connected_to_general_product';
            $this->manage_stock = 'yes';
            parent::__construct($product);
        }
    }
}

在插件中调用的类

Class general_stock {

/**
 * general_stock constructor.
 */
function __construct()
{
    if($this->check_if_woocommerce_is_active()){
     add_action('init',[$this, 'add_woocommerce_product_type'])
     add_filter('product_type_selector', [$this,'add_woocommerce_product_type_general_connected_product']);

...
}
/**
 * add_woocommerce_product_type
 */
function add_woocommerce_product_type(){
    extend_woocommerce();
}
/**
 * add_woocommerce_product_type_general_connected_product
 * @param $types
 * @return mixed
 */
function add_woocommerce_product_type_general_connected_product($types){
    $types[$this->product_type_name] = __('Connected to general Product','ln-general-stock');
    return $types;
}

然而"一切"到目前为止工作:我能够在后端选择新的产品类型并保存它。 (在我编辑产品时选择它。)

但是当我在前端查询产品并转储它时,product_type的值等于simple,我认为应该是connected_to_general_product或者此信息是否存储在另一个值中?

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

我可能会稍微重新安排插件的结构。我喜欢在woocommerce_loaded插件上加载插件,然后你甚至不需要进行条件检查来查看WooCommerce是否处于活动状态。但我认为问题是您要添加到product_type_selector过滤器的数组键/值对。

Class general_stock {

    /**
     * pseudo constructor.
     */
    public static function init()
    {
        include_once( 'path-to/class-wc-product-connected-to-general-product.php' );
         add_filter('product_type_selector', array( __CLASS__, 'add_woocommerce_product_type_general_connected_product' ) );
    }

    ...


    /**
     * add_woocommerce_product_type_general_connected_product
     * @param $types
     * @return mixed
     */
    public static function add_woocommerce_product_type_general_connected_product($types){
        $types['general-product'] = __('Connected to general Product','ln-general-stock');
        return $types;
    }

}

add_action( 'woocommerce_loaded', 'general_stock::init');
Class WC_Product_Connected_To_General_Product extends WC_Product_Simple
{
    public function __construct($product)
    {
        $this->product_type = 'connected_to_general_product';
        $this->manage_stock = 'yes';
        parent::__construct($product);
    }
}

答案 1 :(得分:0)

我遇到了同样的问题,发现我必须在我的案例中定义一个缺失的函数

if (class_exists('WC_Product_Simple')) {
    class WC_Product_Ebook_Store extends WC_Product_Simple {

    public function __construct( $product ) {

        $this->product_type = 'ebook_store';

        parent::__construct( $product );

    }
    public function get_type() {
        return 'ebook_store';
    }

    }
}

答案 2 :(得分:0)

请记住,产品类名称的扩展必须以WP_Product_开头,后跟producto类型。例如:

Console.WriteLine("    ".IsEmptyOrAllSpaces());      // true
Console.WriteLine("".IsEmptyOrAllSpaces());          // true
Console.WriteLine("  BOO  ".IsEmptyOrAllSpaces());   // false

string testMe = null;
Console.WriteLine(testMe.IsEmptyOrAllSpaces());      // false

答案 3 :(得分:0)

另外,如果不起作用,请添加此代码。

add_filter( 'woocommerce_product_class', array($this,'load_custom_product_type_class'), 10, 2 );

    public function load_custom_product_type_class( $classname, $product_type ){
        if ( $product_type == 'your_custom_product_type_here' ) {
            $classname = 'YOUR_PRODUCT_TYPE_CLASS_NAME';
        }
        return $classname;
    }