【问题标题】:Woocommerce - How to check product type in pluginWoocommerce - 如何在插件中检查产品类型
【发布时间】:2015-01-02 04:18:39
【问题描述】:

我是 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 ....

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

如果以上是简单的解决方法,请告诉我。

【问题讨论】:

    标签: php wordpress plugins woocommerce


    【解决方案1】:

    您可以期望访问任何 Woo 类的最早可能是 woocommerce_loaded 钩子,它现在在 plugins_loaded 钩子中触发。如果您要保存 woocommerce_process_product_meta 挂钩,那么那里的任何回调都会正确加载所有类。如果您在该回调之外进行测试(并且根本没有附加到任何钩子......可能无法正确加载所有类。

    此外,如果您在设置 WP_Post 对象之前尝试调用 get_the_ID(),您将无法获得正确的值。

    更完整的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 的更新将使用 woocommerce_admin_process_product_object,因此您不再需要实例化产品对象或运行 save(),因为 Woo 将在核心中处理它。

    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
        }
    
    }
    

    【讨论】:

    • 至少对我来说,变体产品类型是“变体”,而不是“变体”。与最初的答案相比,它可能已经发生了变化,但我认为这是值得注意的,以供将来参考。
    • @Tuure 变量和变体都存在。产品类型“变量”意味着它是包含多个“变体”产品子项的父产品。这些变体不会在产品列表中显示为单独的产品,而实际上是它们自己的产品帖子。
    • 感谢您的澄清!
    • 但是如果找不到类,为什么问题出在参数上?你确定这是正确的答案吗?
    • 我爱如此,5 岁的问答帮助了我,干杯
    【解决方案2】:

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

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

    【讨论】:

    • 点赞以获得更好的影响力。我正在寻找确切的东西。
    【解决方案3】:

    一个简单的方法是简单地检查发布的select 的值。然后你可以:

    $product_type = $_POST['product-type'];
    
    if ( $product_type == 'simple' ) {
     // do what you want
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 2021-02-24
      • 2018-11-21
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多