实现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
相关产品推荐
相关产品推荐

