You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
  • 代码推荐存放在子主题的functions.php中,避免主题更新时代码丢失;也可创建简单的自定义插件存放代码。

内容的提问来源于stack exchange,提问作者Shiny Happy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:32:04