订单完成时更新自定义产品元数据的代码问题排查求助
代码无法生效的原因及修正方案
问题分析
- 冗余的订单查询逻辑:你挂载的
woocommerce_order_status_completed钩子本身就是在单个订单完成时触发,函数参数已经提供了当前完成的$order对象,完全没必要再调用wc_get_orders拉取所有已完成订单——这不仅做了无用功,还会错误地修改所有历史已完成订单的产品数据。 - 函数嵌套定义导致语法错误:PHP不允许在函数内部嵌套定义另一个函数(你在
update_product_meta里定义了action_save_product_meta),这种写法会直接触发运行错误,代码根本无法正常执行。 - 错误使用更新钩子:
woocommerce_process_product_meta是用户在后台编辑保存产品时才触发的钩子,你要直接更新产品元数据,不需要依赖这个钩子,直接调用update_post_meta即可。 - 产品ID收集逻辑失效:原代码里每次循环订单商品时,
$product_id都会被新ID覆盖,没有把所有产品ID存入数组,且就算存了也没有后续使用逻辑。 - 重复获取订单对象:函数参数已经传入了
$order,你又用wc_get_order( $done_order->ID )重新获取,完全多余还覆盖了原有变量。
修正后的代码
add_action( 'woocommerce_order_status_completed', 'update_order_products_meta', 20, 2 ); function update_order_products_meta( $order_id, $order ) { // 遍历当前完成订单的所有商品 foreach ( $order->get_items() as $item ) { $product_id = $item->get_product_id(); // 直接更新产品元数据 update_post_meta( $product_id, 'Stav', 'Vypůjčeno' ); } }
修正逻辑说明
- 直接使用钩子传入的
$order对象,只处理当前完成的订单,避免冗余操作 - 遍历订单内的每个商品,获取产品ID后直接调用
update_post_meta更新指定元数据 - 去掉了所有无效的嵌套、冗余查询,逻辑简洁直接
内容的提问来源于stack exchange,提问作者Lucie Ptackova
相关产品推荐
相关产品推荐

