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

WooCommerce订单收货页获取明文下载链接及代码报错问题

问题一:获取WooCommerce订单下载文件的明文链接

WooCommerce生成的$download['download_url']是带权限验证的临时加密链接,目的是限制未授权访问。要获取原始明文链接,需从关联的产品数据中提取,步骤如下:

  1. 先获取订单的下载项集合:
$downloads = $order->get_downloadable_items();
  1. 遍历每个下载项,通过product_id获取对应产品,再从产品的下载数据中拿到原始链接:
foreach ( $downloads as $download ) {
    // 获取关联产品
    $product = wc_get_product( $download['product_id'] );
    if ( $product && $product->is_downloadable() ) {
        // 获取产品的所有下载文件
        $product_downloads = $product->get_downloads();
        // 匹配当前下载项的文件ID,拿到原始链接
        foreach ( $product_downloads as $file_id => $file_data ) {
            if ( $file_id === $download['download_id'] ) {
                $plain_download_url = $file_data['file'];
                // $plain_download_url即为明文链接
                break;
            }
        }
    }
}

注意:明文链接直接暴露会绕过WooCommerce的权限验证,建议仅在可信场景下使用。

问题二:修复代码的致命错误

你的代码存在语法和逻辑错误,修复后的代码及错误说明如下:

<?php
$drmip = "";
// 修复:原代码变量名不一致,统一使用$drmip
if (!empty($_SERVER['REMOTE_ADDR'])) {
    $drmip = $_SERVER['REMOTE_ADDR'];
}
// 修复:if语句缺少括号,将赋值运算符=改为比较运算符==
if ($drmip == "136.220.152.221") {
    $testinvoice = $order->get_order_number();
    $testemail = $order->get_billing_email();
    $testproducts = $order->get_items();
    // 修复:get_items()返回数组,需遍历后获取产品名称再判断
    foreach ($testproducts as $item) {
        $product_name = $item->get_name();
        if(strstr($product_name,"DDD")) {
            $downloads = $order->get_downloadable_items();
            // 修复:先检查下载项是否为空,避免数组越界
            if (!empty($downloads)) {
                $testdownload = $downloads[0]['download_url'];
                // 修复:用esc_js()转义内容,避免XSS风险
                echo "<script>alert('ID = " . esc_js($testinvoice) . " \\nEmail = " . esc_js($testemail) . " \\nURL = " . esc_js($testdownload) . "')</script>";
            }
            break; // 找到匹配产品后退出循环
        }
    }
}
?>

核心修复点:

  • 修正变量名不一致问题:原代码赋值给$drmip却判断未初始化的$testip
  • 修复if语句语法:添加括号,将赋值操作改为比较操作
  • 处理数组类型的订单商品:get_items()返回数组,需遍历后获取产品名称再做包含判断
  • 增加空值检查:获取下载项后先判断是否为空,避免数组越界报错
  • 增加安全转义:用esc_js()处理输出内容,防止XSS攻击

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:35:33