WooCommerce订单收货页获取明文下载链接及代码报错问题
问题一:获取WooCommerce订单下载文件的明文链接
WooCommerce生成的$download['download_url']是带权限验证的临时加密链接,目的是限制未授权访问。要获取原始明文链接,需从关联的产品数据中提取,步骤如下:
- 先获取订单的下载项集合:
$downloads = $order->get_downloadable_items();
- 遍历每个下载项,通过
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
相关产品推荐
相关产品推荐

