Woocommerce - 如何在插件中检查产品类型

2022-08-30 19:08:48

我对wordpress/ woocommerce很陌生,刚刚开始尝试创建自定义插件。

到目前为止,我已经通过api添加了我的自定义woocommerce设置。

我遇到了一个问题,我想在产品数据选项卡中的单个产品上添加自定义字段。

我设法使用以下代码显示它:

add_action( 'woocommerce_product_options_general_product_data', array( $this, 'cuzd_general_fields' ) );
add_action( 'woocommerce_process_product_meta', array( $this, 'cuzd_general_fields_save') );

但是,现在我需要检查产品类型是简单的还是变化的。我尝试了以下方法:

$product = new WC_Product( get_the_ID() );
        if( $product->is_type( 'simple' ) ) {
          //
}

但是我得到一个错误:

 Fatal error: Class 'WC_Product' not found in ....

我有一种很好的感觉,我正在尝试在调用产品类之前启动它。我很可能有类插件的整个格式错误。任何具有良好指导/最佳实践的阅读材料将不胜感激。

否则,如果以上是一个简单的修复,请让我知道。


答案 1

你可以期望最早访问任何Woo类的是现在在钩子中触发的钩子。如果你在钩子上保存,那么任何回调都会正确加载所有类。如果您在该回调之外进行测试(并且根本不附加到任何钩子....这些类可能未全部正确加载。woocommerce_loadedplugins_loadedwoocommerce_process_product_meta

此外,如果尝试在设置对象之前调用,则不会获得正确的值。get_the_ID()WP_Post

更完整的例程如下所示:cuzd_general_fields_save

/**
 * Save meta box data.
 *
 * @param int     $post_id WP post id.
 */
public function cuzd_general_fields_save( $post_id ) {

    $_product = wc_get_product( $post_id );

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

    $_product->save();

}

Woo 3.0 的更新是使用 ,这样您就不再需要实例化产品对象或运行,因为 Woo 将在核心中处理它。woocommerce_admin_process_product_objectsave()

add_action( 'woocommerce_admin_process_product_object', array( $this, 'cuzd_general_fields_save') );

然后,回调将修改为:

/**
 * Save meta box data.
 *
 * @param obj $_product WC_Product.
 */
public function cuzd_general_fields_save( $_product ) {

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

}

答案 2

以下是在不创建产品实例的情况下检查产品类型的一种方法:

$product_type = get_the_terms( $product_id,'product_type')[0]->slug;

推荐