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

实现WooCommerce我的账户下载页与订单页下载链接一致

解决WooCommerce账户下载页链接格式与订单详情页不一致的问题

问题背景

  • 订单详情页的下载链接(带uid参数,无需邮箱即可下载):
http://localhost/?download_file=2922&order=wc_order_3av4Ev4PlUyLw&uid=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855&key=2a89e5ba-4203-4596-8e5b-04b7f66cbb79
  • 账户下载页的下载链接(强制要求email参数,无则下载报错):
http://localhost/wp/?download_file=2922&order=wc_order_3av4Ev4PlUyLw&email&key=2a89e5ba-4203-4596-8e5b-04b7f66cbb79
  • 订单详情页获取下载项的代码:
$order = wc_get_order( 12 );
$downloads = $order->get_downloadable_items();
  • 账户下载页获取下载项的代码:
$downloads = wc_get_customer_available_downloads($user_id);

由于多数用户未注册邮箱,账户下载页的链接无法正常使用,需要将其格式统一为订单详情页的样式。

解决方案一:通过过滤器修改链接格式

将以下代码添加到主题的functions.php文件或自定义插件中,直接修改账户下载页的链接参数:

add_filter('woocommerce_customer_available_downloads', 'custom_fix_account_download_links', 10, 1);

function custom_fix_account_download_links($downloads) {
    foreach ($downloads as &$download_item) {
        // 获取当前下载项对应的订单
        $order = wc_get_order($download_item['order_id']);
        if (!$order) continue;
        
        // 生成和订单详情页一致的uid哈希值
        $order_key = $order->get_order_key();
        $uid = hash('sha256', $order_key);
        
        // 替换链接中的&email参数为&uid=哈希值
        $download_item['download_url'] = str_replace('&email', '&uid=' . $uid, $download_item['download_url']);
    }
    return $downloads;
}

代码说明

  • 利用woocommerce_customer_available_downloads过滤器拦截账户下载项数组,遍历每个下载项修改链接。
  • 通过订单ID获取订单对象,提取订单密钥并生成SHA256哈希值,和订单详情页的uid生成逻辑对齐。
  • 替换链接中的&email参数为&uid=生成的哈希值,实现格式统一。

解决方案二:直接从订单对象获取下载项

如果过滤器方法不生效,可以替换账户下载页的数据源,直接调用订单对象的get_downloadable_items()方法获取正确格式的链接:

// 替换账户下载页原有的$downloads = wc_get_customer_available_downloads($user_id);代码
$target_orders = wc_get_orders(array(
    'customer_id' => $user_id,
    'status' => array('completed', 'processing'), // 根据你的业务需求调整订单状态
    'limit' => -1 // 获取所有符合条件的订单
));

$downloads = array();
foreach ($target_orders as $single_order) {
    $order_downloads = $single_order->get_downloadable_items();
    if (!empty($order_downloads)) {
        $downloads = array_merge($downloads, $order_downloads);
    }
}

这种方式直接复用订单详情页的下载项生成逻辑,链接格式会完全一致,无需额外修改参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:16:12