在WooCommerce PDF装箱单中添加ATUM位置失败的技术求助
问题:WooCommerce PDF装箱单无法获取ATUM位置信息
我想自定义WooCommerce的PDF装箱单模板,让它显示ATUM库存位置,但测试了多段代码都无法获取到该信息,而且没有报错。但ATUM位置在WooCommerce订单页面显示正常,请问我在获取ATUM信息的过程中哪里出错了?
尝试的代码片段1
add_action( 'wpo_wcpdf_after_order_data', 'wpo_wcpdf_atum_location', 10, 2 ); function wpo_wcpdf_atum_location($template_type, $order) { if ($template_type == 'packing-slip') { $document = wcpdf_get_document( $template_type, $order ); $atum_location = get_post_meta( $order->get_id(), '_atum_location', true ); if ( ! empty( $atum_location ) ) { ?> <tr class="atum-location"> <th>ATUM Location:</th> <td><?php echo esc_html( $atum_location ); ?></td> </tr> <?php } } }
尝试的代码片段2
<?php $locations = wp_get_object_terms ( $summary_item, 'atum_location', array( 'fields' => 'names' ) ); $locations_list = ! empty( $locations ) ? implode( ', ', $locations ) : '–'; ?> <?php echo esc_html( $locations_list ) ?>
添加代码后的完整模板代码
<tbody> <?php foreach ( $this->get_order_items() as $item_id => $item ) : ?> <tr class="<?php echo esc_html( $item['row_class'] ); ?>"> <td class="product"> <p class="item-name"><?php echo esc_html( $item['name'] ); ?></p> <?php do_action( 'wpo_wcpdf_before_item_meta', $this->get_type(), $item, $this->order ); ?> <div class="item-meta"> <?php if ( ! empty( $item['sku'] ) ) : ?> <p class="sku"><span class="label"><?php $this->sku_title(); ?></span> <?php echo esc_attr( $item['sku'] ); ?></p> <?php endif; ?> <?php if ( ! empty( $item['weight'] ) ) : ?> <p class="weight"><span class="label"><?php $this->weight_title(); ?></span> <?php echo esc_attr( $item['weight'] ); ?><?php echo esc_attr( get_option( 'woocommerce_weight_unit' ) ); ?></p> <?php endif; ?> <?php if ( ! empty( $location['wp_list_filter'] ) ) : ?> <p class="item_location"><span class="inventory_labels"><?php $this->inventory_labels(); ?></span> <?php echo esc_html( $inventory_labels); ?><?php echo esc_html( get_option( 'get_location_labels' ) ); ?></ <?php endif; ?> <!-- ul.wc-item-meta --> <?php if ( ! empty( $item['meta'] ) ) : ?> <?php echo wp_kses_post( $item['meta'] ); ?> <?php endif; ?> <!-- / ul.wc-item-meta --> </div> <?php do_action( 'wpo_wcpdf_after_item_meta', $this->get_type(), $item, $this->order ); ?> </td> <td class="quantity"><?php echo esc_html( $item['quantity'] ); ?></td> </tr> <?php endforeach; ?> </tbody>
错误分析及解决方案
核心问题点
- 元数据存储位置错误:ATUM位置信息不是存在订单的
post_meta中,而是和单个订单项/产品关联,你第一段代码从订单ID读取_atum_location本身就找错了数据源。 - 变量未定义:第二段代码里的
$summary_item是未定义的变量,没有指向任何有效对象(产品/订单项),导致术语查询返回空。 - 模板代码语法错误:你添加到模板中的位置判断代码存在标签未闭合问题,且
$location['wp_list_filter']、$inventory_labels都是未定义变量,这段逻辑完全无法执行。
正确实现方式
方式1:通过钩子添加(推荐,无需修改模板)
在主题的functions.php文件中添加以下代码,它会自动在每个订单项的元数据后插入ATUM位置:
add_action( 'wpo_wcpdf_after_item_meta', 'wpo_wcpdf_show_atum_item_location', 10, 3 ); function wpo_wcpdf_show_atum_item_location( $template_type, $item, $order ) { // 仅在装箱单模板生效 if ( $template_type !== 'packing-slip' ) return; // 获取订单项对应的产品ID $product_id = $item['product_id']; if ( empty( $product_id ) ) return; // 查询ATUM位置术语 $locations = wp_get_object_terms( $product_id, 'atum_location', array( 'fields' => 'names' ) ); if ( ! empty( $locations ) ) { echo '<p class="atum-location"><span class="label">ATUM 位置:</span> ' . esc_html( implode( ', ', $locations ) ) . '</p>'; } }
方式2:直接修改模板
如果你一定要直接编辑模板,替换掉原模板中无效的位置代码部分,改成:
<?php // 获取当前订单项对应的产品ID $product_id = $item['product_id']; if ( ! empty( $product_id ) ) { $locations = wp_get_object_terms( $product_id, 'atum_location', array( 'fields' => 'names' ) ); $location_list = ! empty( $locations ) ? implode( ', ', $locations ) : '—'; ?> <p class="item_location"><span class="inventory_labels">ATUM 位置:</span> <?php echo esc_html( $location_list ); ?></p> <?php } ?>
验证步骤
- 确认ATUM插件已激活,且目标产品确实设置了库存位置
- 清理WooCommerce PDF发票插件的缓存(插件设置页可找到该选项)
- 生成新的装箱单,检查位置是否正常显示
内容的提问来源于stack exchange,提问作者Cleanliving
相关产品推荐
相关产品推荐

