发布WooCommerce新产品时如何获取完整的产品详情数据?
WooCommerce 新增产品无法触发钩子获取数据解决方案
核心问题原因
- 你调用
get_post_status()时未传入$post_id参数,默认会读取全局文章状态,新增产品场景下无法获取到当前产品的正确发布状态 - 代码未利用
save_post_product钩子自带的$update参数,该参数为false时就是首次新建产品的场景 - WooCommerce 3.0+ 不支持直接读取
$product->name属性,需要调用对应的get_name()方法否则可能报错 - 代码存在冗余的重复获取产品对象、重复判断文章类型的逻辑
修复后可正常触发的代码
add_action( 'save_post_product', 'add_product_tocrm_through_woocommerce', 10, 3); function add_product_tocrm_through_woocommerce($post_id, $post, $update){ // 跳过修订版本 if ( wp_is_post_revision( $post_id ) ) { return; } // 跳过未发布的状态 if ( $post->post_status !== 'publish' ) { return; } // 获取产品对象,失败则终止 if (!$product = wc_get_product( $post_id )) { return; } $wooProduct = []; $wooProduct[0]['name'] = $product->get_name(); $wooProduct[0]['price'] = $product->get_price(); $wooProduct[0]['description'] = $product->get_description(); save_woo_product_tocrm($wooProduct); }
代码修改说明
- 直接用钩子传入的
$post对象判断状态,无需额外调用get_post_type、get_post_status函数,避免参数错误 - 兼容新建产品($update=false)和更新产品($update=true)两种场景,只要产品发布为公开状态就会触发执行
- 修复了WooCommerce高版本不兼容的属性读取写法,替换为官方推荐的方法调用
- 去掉冗余逻辑,运行效率更高
- 如需仅首次新建发布产品时触发、更新时不触发,可在跳过修订版本的判断后新增一行
if ($update) { return; }即可
内容的提问来源于stack exchange,提问作者theboss_dev
相关产品推荐
相关产品推荐

