WooCommerce:取消可下载产品自动标记为完成状态的设置
解决方案
可以通过WooCommerce的钩子修改自动完成订单的逻辑,以下是两种无需额外插件的PHP实现方案,直接添加到主题的functions.php文件或自定义插件中即可:
方案一:阻止无可用下载链接的订单自动完成
该方案会检查订单内的所有可下载产品,若存在无可用下载文件的产品,就阻止订单被自动标记为“完成”状态:
add_filter('woocommerce_order_can_mark_order_complete', 'prevent_auto_complete_for_no_downloads', 10, 2); function prevent_auto_complete_for_no_downloads($can_complete, $order) { // 遍历订单中的每个商品 foreach ($order->get_items() as $item) { $product = $item->get_product(); // 仅检查可下载产品 if ($product->is_downloadable()) { // 获取产品的下载文件列表 $downloads = $product->get_downloads(); // 无可用下载文件时,阻止自动完成订单 if (empty($downloads)) { $can_complete = false; break; // 找到符合条件的产品后停止遍历 } } } return $can_complete; }
方案二:将无下载链接的订单状态设为“处理中”
如果希望这类订单支付完成后直接进入“处理中”状态(而非自动完成),可使用以下代码:
add_filter('woocommerce_payment_complete_order_status', 'change_order_status_for_no_downloads', 10, 3); function change_order_status_for_no_downloads($status, $order_id, $order) { $has_no_downloads = false; // 遍历订单商品 foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product->is_downloadable() && empty($product->get_downloads())) { $has_no_downloads = true; break; } } // 存在无下载链接的产品时,将状态改为“处理中” if ($has_no_downloads) { $status = 'processing'; } return $status; }
补充说明
- 若只需针对特定数字版产品生效,可在代码中添加额外判断:
- 检查产品ID:
if ($product->get_id() == 123)(替换123为你的数字版产品ID) - 检查产品类别:
if (has_term('digital-edition', 'product_cat', $product->get_id()))(替换digital-edition为你的数字版产品类别slug)
- 检查产品ID:
- 代码推荐存放在子主题的
functions.php中,避免主题更新时代码丢失;也可创建简单的自定义插件存放代码。
内容的提问来源于stack exchange,提问作者Shiny Happy
相关产品推荐
相关产品推荐

