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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:42:30