解决WooCommerce账户我的订单列表自定义下载URL列显示异常问题
WooCommerce账户订单页自定义列无法获取PDF URL的问题排查与修复
问题描述
我想在WooCommerce的「账户 > 订单」页面添加一列,通过Jet-Engine给WooCommerce客户订单添加了名为url-from-download的字段,用于选择PDF文件。现有代码已经成功添加了名为"Invoice"的列,但始终无法提取到可下载的文件URL,只会显示"Download"文本,请问问题出在哪里?
原代码如下:
/** * Adds a new column to the "My Orders" table in the account. * * @param string[] $columns the columns in the orders table * @return string[] updated columns */ function th_wc_add_my_account_orders_column( $columns ) { $new_columns = array(); foreach ( $columns as $key => $name ) { $new_columns[ $key ] = $name; // add ship-to after order status column if ( 'order-total' === $key ) { $new_columns['url-from-download'] = __( 'Invoice', 'textdomain' ); } } return $new_columns; } add_filter( 'woocommerce_my_account_my_orders_columns', 'th_wc_add_my_account_orders_column' ); /** * Adds data to the custom "url-from-download" column in "My Account > Orders". * * @param \WC_Order $order the order object for the row */ function th_wc_my_orders_url_from_download_column( $order ) { $url_from_download = get_post_meta( $order->get_id(), 'url_from_download', true ); // Get custom order meta echo ! empty( $url_from_download ) ? $url_from_download : 'Download'; } add_action( 'woocommerce_my_account_my_orders_column_url-from-download', 'th_wc_my_orders_url_from_download_column' );
问题分析
- 元键名称不匹配:Jet-Engine创建的字段名是
url-from-download,但代码中调用get_post_meta时用的是url_from_download(下划线替换了连字符),导致根本读不到对应的元数据。 - Jet-Engine文件字段存储逻辑误解:Jet-Engine的文件选择字段默认存储的是媒体库中文件的ID,不是直接的文件URL,直接读取的话拿到的是数字ID,无法直接作为链接使用。
- 未生成可交互的下载链接:原代码直接输出文本,就算拿到URL也只是纯文本,用户没法直接点击下载。
修正后的代码
/** * 给账户页面的「我的订单」表格添加新列 * * @param string[] $columns 订单表格的现有列 * @return string[] 更新后的列数组 */ function th_wc_add_my_account_orders_column( $columns ) { $new_columns = array(); foreach ( $columns as $key => $name ) { $new_columns[ $key ] = $name; // 在订单总计列后添加发票列 if ( 'order-total' === $key ) { $new_columns['url-from-download'] = __( 'Invoice', 'textdomain' ); } } return $new_columns; } add_filter( 'woocommerce_my_account_my_orders_columns', 'th_wc_add_my_account_orders_column' ); /** * 给「账户 > 订单」页面的自定义列「url-from-download」添加数据 * * @param \WC_Order $order 当前行对应的订单对象 */ function th_wc_my_orders_url_from_download_column( $order ) { // 使用Jet-Engine创建的正确元键名 $attachment_id = get_post_meta( $order->get_id(), 'url-from-download', true ); if ( ! empty( $attachment_id ) && is_numeric( $attachment_id ) ) { // 将附件ID转换为文件URL $download_url = wp_get_attachment_url( $attachment_id ); // 输出可点击的下载链接 echo '<a href="' . esc_url( $download_url ) . '" target="_blank" rel="noopener noreferrer">' . __( 'Download Invoice', 'textdomain' ) . '</a>'; } else { // 没有文件时显示友好提示 echo __( 'No Invoice Available', 'textdomain' ); } } add_action( 'woocommerce_my_account_my_orders_column_url-from-download', 'th_wc_my_orders_url_from_download_column' );
代码说明
- 修正了元键名称,和Jet-Engine创建的字段名保持一致,确保能正确读取数据。
- 增加了附件ID判断,通过
wp_get_attachment_url()将存储的ID转换为可访问的文件URL。 - 生成了带安全属性的可点击链接,用户可以直接点击下载PDF。
- 无文件时替换成更友好的提示文本,避免显示无意义的"Download"。
内容的提问来源于stack exchange,提问作者Anderson Viviel
相关产品推荐
相关产品推荐

