WooCommerce 以编程方式复制产品,更新一些属性

WooCommerce duplicate product programatically, updating some properties

提问人:Rip 提问时间:7/5/2023 最后编辑:LoicTheAztecRip 更新时间:7/5/2023 访问量:124

问:

我正在尝试复制一个可变产品并更新一些属性。

当我运行此功能时,产品状态为“草稿”,库存列为“缺货”,而所有变体都具有正确的正常价格和库存数量以及管理库存?已选中。

我尝试在使用 woocommerce_product_duplicate_before_save 保存产品之前设置这些属性,但此钩子执行了多次,一次用于父产品,一次用于每个变体。

我还尝试用WC_Product_Query选择最近创建的产品。选择了正确的产品,但在执行设置的方法之前和之后,属性保持不变。

如何在 WooCommerce 中更新重复变量产品的属性?

function test_dupproduct(){
    $product = wc_get_product( '1000' );
    //woocommerce_product_duplicate_before_save
    $wc_adp = new WC_Admin_Duplicate_Product;
    $dupproduct = $wc_adp->product_duplicate( wc_get_product( $product ) );
    $dupproduct = $query->get_products();
    $dupproduct->set_sku( '99999' );
    $dupproduct->set_name( 'Product Name' );
    $dupproduct->set_short_description('Product Short Description');
    $dupproduct->set_status( 'Published' );
}
PHP WordPress 对象 WooCommerce 产品

评论


答:

1赞 LoicTheAztec 7/5/2023 #1

更新

缺少以下内容:

  • 在所有 setter 方法之前调用 product 对象
  • 设置与产品名称对应的产品 slug
  • 设置正确的产品状态
  • 添加 End,神奇的 WC_Product save() 方法

我删除了不必要的:

  • wc_get_product( $product )作为 product_duplicate() 方法中的参数
  • $dupproduct = $query->get_products();

工作功能(钩在钩子中仅用于测试:template_redirect

add_action('template_redirect', 'test_dup_product');
function test_dup_product(){
    $product = wc_get_product( 1000 );
    $wc_adp = new WC_Admin_Duplicate_Product;

    $dup_product = $wc_adp->product_duplicate( $product );
    $dup_product = wc_get_product( $dup_product->get_id() ); // recall the WC_Product Object
    $dup_product->set_sku( '555555' );
    $dup_product->set_name( 'Product Name' );
    $dup_product->set_slug( sanitize_title('Product Name') ); // slug
    $dup_product->set_short_description('Product Short Description');
    $dup_product->set_status( 'publish' );

    $dup_product->save(); // Save
}

现在,产品已与所有额外数据一起保存并发布。

评论

0赞 Rip 7/5/2023
我以为这样可以解决问题,但重复的产品属性保持不变,产品状态为“草稿”,库存被列为“缺货”,而变体属性似乎正确重复。
0赞 Rip 7/5/2023
我发现了我的一次编辑遗留下来的错别字。我删除了“$dupproduct = $query->get_products();”行,但结果没有变化。
1赞 LoicTheAztec 7/5/2023
我已经能够让它工作。在这里看我的更新。如果此答案有效并回答您的问题,请参阅:当有人回答我的问题时,我该怎么办?
0赞 Rip 7/5/2023
我将set_status从“已发布”更改为“发布”,现在变量产品似乎正在正确更新。谢谢!