wcpdf_download_pdf短码在manage_woocommerce_page_wc-orders_custom_column钩子失效
解决WooCommerce订单列表自定义列中WCPDF短码失效的问题
问题原因分析
wcpdf_download_pdf短码在后台订单列表页面的manage_woocommerce_page_wc-orders_custom_column钩子中返回空字符串,核心原因是短码的实现逻辑存在环境上下文限制——比如仅允许在前端页面生成PDF下载链接,或者后台环境下未加载短码依赖的核心功能模块。
解决方案
方案1:直接调用短码回调函数
绕过do_shortcode的环境判断限制,直接调用短码注册的原始回调函数。首先确认短码对应的回调(通常在WooCommerce PDF Invoices & Packing Slips插件源码中,注册代码类似add_shortcode('wcpdf_download_pdf', 'wcpdf_download_pdf_shortcode')),然后在钩子中直接执行:
add_action('manage_woocommerce_page_wc-orders_custom_column', 'factor_rows', 10, 2); function factor_rows($column, $order) { if ('print' == $column) { // 确保回调函数存在再执行 if (function_exists('wcpdf_download_pdf_shortcode')) { $atts = [ 'document_type' => 'invoice', 'link_text' => 'print', 'order_id' => $order->get_id() // 用当前订单ID替换硬编码的5746 ]; echo wcpdf_download_pdf_shortcode($atts); } } }
方案2:临时模拟前端环境
如果短码逻辑通过wcpdf_is_frontend函数判断运行环境,可临时过滤该函数的返回值,让短码认为当前处于前端页面:
add_action('manage_woocommerce_page_wc-orders_custom_column', 'factor_rows', 10, 2); function factor_rows($column, $order) { if ('print' == $column) { // 临时切换为前端环境 add_filter('wcpdf_is_frontend', '__return_true'); echo do_shortcode('[wcpdf_download_pdf document_type="invoice" link_text="print" order_id="'.$order->get_id().'"]'); // 恢复原环境判断 remove_filter('wcpdf_is_frontend', '__return_true'); } }
方案3:强制加载依赖文件(兜底方案)
如果后台未自动加载短码所需的核心模块,可手动引入插件相关文件(路径需根据你的插件安装位置调整):
add_action('manage_woocommerce_page_wc-orders_custom_column', 'factor_rows', 10, 2); function factor_rows($column, $order) { if ('print' == $column) { // 手动引入短码依赖的核心文件 require_once WP_PLUGIN_DIR . '/woocommerce-pdf-invoices-packing-slips/includes/class-wcpdf-shortcodes.php'; echo do_shortcode('[wcpdf_download_pdf document_type="invoice" link_text="print" order_id="'.$order->get_id().'"]'); } }
注意事项
- 务必将硬编码的
5746替换为$order->get_id(),确保适配所有订单,而非固定某一个订单。 - 优先使用方案1或方案2,方案3可能因插件版本更新导致文件路径变化,维护成本较高。
内容的提问来源于stack exchange,提问作者user123456789
相关产品推荐
相关产品推荐

