WooCommerce订单确认页FooEvents PDF门票下载代码失效问题
代码失效核心原因
你贴的代码是FooEvents插件内部模板的片段,直接拿出来用有3个致命硬伤:
- 没有提前定义
$tickets、$this->config两个依赖变量:这两个变量只有在插件内部渲染模板时才会被赋值,直接放到WooCommerce订单确认页调用会直接报PHP未定义变量错误,逻辑根本跑不通 - 挂载位置错误:你没有把代码挂到WooCommerce订单确认页的指定钩子上,代码根本不会在目标页面执行
- PDF文件名拼接错误:你重复拼接了两次hash和ticket ID,生成的文件路径和实际服务器上存储的PDF文件名不匹配,就算前面逻辑跑通了点链接也是404
可直接运行的实现方案
把下面的代码添加到当前主题的functions.php文件,或者自定义功能插件中,代码会自动在用户付款后的订单确认页、用户中心的订单详情页渲染PDF门票下载列表,兼容FooEvents 1.7.x以上所有PDF票务版本:
// 在订单确认页、个人中心订单详情页输出PDF门票下载入口 add_action( 'woocommerce_thankyou', 'fooevents_render_pdf_download_section', 20 ); add_action( 'woocommerce_view_order', 'fooevents_render_pdf_download_section', 20 ); function fooevents_render_pdf_download_section( $order_id ) { // 检测FooEvents插件是否正常激活 if ( ! class_exists( 'WooCommerce_Events_Tickets') || ! $order_id ) { return; } // 查询当前订单关联的所有有效门票 $tickets = get_posts( array( 'post_type' => 'event_magic_tickets', 'meta_key' => 'WooCommerceEventsOrderID', 'meta_value' => $order_id, 'post_status' => 'publish', 'numberposts' => -1, ) ); if ( empty( $tickets ) ) { return; } // 读取FooEvents PDF存储路径配置 global $fooevents_pdf_tickets; $pdf_base_path = $fooevents_pdf_tickets->config->pdf_ticket_url; ?> <h2><?php esc_html_e( '您的电子门票', 'fooevents-pdf-tickets' ); ?></h2> <table class="woocommerce-table shop_table ticket_download_table" style="width:100%;margin:20px 0;"> <thead> <tr> <th style="text-align:left;padding:10px;"><?php esc_html_e( '票种名称', 'fooevents-pdf-tickets' ); ?></th> <th style="text-align:left;padding:10px;"><?php esc_html_e( '关联活动', 'fooevents-pdf-tickets' ); ?></th> <th style="text-align:left;padding:10px;"><?php esc_html_e( '操作', 'fooevents-pdf-tickets' ); ?></th> </tr> </thead> <tbody> <?php foreach ( $tickets as $ticket ) : $product_id = get_post_meta( $ticket->ID, 'WooCommerceEventsProductID', true ); $ticket_id = get_post_meta( $ticket->ID, 'WooCommerceEventsTicketID', true ); $ticket_hash = get_post_meta( $ticket->ID, 'WooCommerceEventsTicketHash', true ); // 兼容新旧版本的PDF文件名规则 if ( ! empty( $ticket_hash ) ) { $pdf_file = sprintf( '%1$s-%2$s.pdf', $ticket_hash, $ticket_id ); } else { $pdf_file = sprintf( '%1$s-%1$s.pdf', $ticket_id ); } $download_url = esc_url( $pdf_base_path . $pdf_file ); ?> <tr> <td style="padding:10px;"><?php echo esc_html( $ticket->post_title ); ?></td> <td style="padding:10px;"><?php echo esc_html( get_the_title( $product_id ) ); ?></td> <td style="padding:10px;"><a href="<?php echo $download_url; ?>" target="_blank" rel="noopener" class="button"><?php esc_html_e( '下载PDF门票', 'fooevents-pdf-tickets' ); ?></a></td> </tr> <?php endforeach; ?> </tbody> </table> <?php }
排错提示
- 如果点击下载出现404错误,进入WordPress后台的FooEvents PDF门票设置页,直接点击一次「保存设置」,插件会自动刷新PDF存储目录的伪静态规则,之后刷新页面即可正常下载
- 不要在主题模板里直接调用
$this获取插件配置,$this只有在插件类的内部方法中才会指向插件实例,外部直接调用会触发PHP致命错误 - 如果部分历史订单的门票下载链接失效,可以在FooEvents后台的工具页选择批量重新生成PDF门票即可
内容的提问来源于stack exchange,提问作者Milcko Diazz
相关产品推荐
相关产品推荐

