如何在类中正确封装WooCommerce新产品类型注册动作?
正确封装WooCommerce自定义产品类型的类实现
你遇到的问题主要有三个原因:
- 定义的
__register_product_type类未被实例化,导致init钩子从未触发,自定义产品类没完成注册 - 在方法内部嵌套定义类容易引发加载顺序问题,WooCommerce可能在需要该类时它还未被定义
- 缺少WooCommerce识别自定义产品类型的关键步骤:未将类型添加到产品类型可选列表
以下是修正后的完整代码:
class Custom_Product_Type_Registrar { public function __construct() { // 注册自定义产品类 add_action( 'init', array( $this, 'register_custom_product_class' ) ); // 将自定义类型添加到WooCommerce产品类型列表 add_filter( 'woocommerce_product_types', array( $this, 'add_custom_product_type' ) ); } public function register_custom_product_class() { // 确保WC_Product类已加载再定义子类 if ( class_exists( 'WC_Product' ) ) { class WC_Product_Demo extends WC_Product { public function __construct( $product ) { $this->product_type = 'demo_product'; parent::__construct( $product ); } } } } public function add_custom_product_type( $types ) { // 添加自定义产品类型到后台可选列表 $types['demo_product'] = __( 'Demo Product', 'your-text-domain' ); return $types; } } // 实例化类,触发钩子注册 new Custom_Product_Type_Registrar();
关键说明:
- 使用符合规范的类名替代双下划线开头的名称,避免与系统预留命名冲突
- 新增
woocommerce_product_types过滤器,让自定义产品类型在后台产品编辑页面可见 - 加入
class_exists( 'WC_Product' )检查,防止WooCommerce未加载时定义子类引发错误 - 必须实例化注册类,否则所有钩子都不会被WordPress识别
内容的提问来源于stack exchange,提问作者karlosuccess
相关产品推荐
相关产品推荐

