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

在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 ) : '&ndash;';
?>
<?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>

错误分析及解决方案

核心问题点

  1. 元数据存储位置错误:ATUM位置信息不是存在订单的post_meta中,而是和单个订单项/产品关联,你第一段代码从订单ID读取_atum_location本身就找错了数据源。
  2. 变量未定义:第二段代码里的$summary_item是未定义的变量,没有指向任何有效对象(产品/订单项),导致术语查询返回空。
  3. 模板代码语法错误:你添加到模板中的位置判断代码存在标签未闭合问题,且$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 } ?>

验证步骤

  1. 确认ATUM插件已激活,且目标产品确实设置了库存位置
  2. 清理WooCommerce PDF发票插件的缓存(插件设置页可找到该选项)
  3. 生成新的装箱单,检查位置是否正常显示

内容的提问来源于stack exchange,提问作者Cleanliving

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:05:00