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

WooCommerce:结账后提取订单数组元数据并保存为独立元数据

问题背景

我网站使用一款插件结账时自动生成运单,运单的追踪号、带品牌标识的追踪URL等数据以数组形式存储为订单元数据。但订单邮件插件无法提取数组格式的元数据,所以需要实现:运单生成后,从数组中提取追踪URL并保存为独立的订单元数据。目前已有一段能在后台订单页面显示追踪URL的代码,但尝试用类似逻辑保存独立元数据时,因钩子选择错误未能成功,现有代码如下:

// Add tracking link & shipping label link to admin order page
add_action('woocommerce_admin_order_data_after_shipping_address', 'gyta_tracking', 10, 1 );
function gyta_tracking($order){
    $tracking = get_post_meta( $order->get_id(), '_wcpti_easypost_tracking' );
    $tracking_number = $tracking[0]['tracking_code'];
    $tracking_url = $tracking[0]['public_url'];
    $print_label = get_post_meta( $order->get_id(), '_wcpti_easypost_postage_label_png_url');
    echo '<p><strong>'.__( 'Tracking' ).':</strong> ' . '<a href="' . $tracking_url . '" target="_blank">' . $tracking_number . '</a>' . '</p>';
    echo '<p><a href="' . $print_label[0] . '" target="_blank">View Label</a></p>';
}
解决方案

核心是找对运单生成完成时触发的钩子,而不是后台页面显示的钩子。根据元数据键_wcpti_easypost_tracking判断是WooCommerce EasyPost插件,以下提供两种可行方案:

方案1:使用插件专属钩子(推荐)

EasyPost插件在添加追踪信息到订单时,会触发wc_easypost_tracking_added钩子,直接传递订单ID和追踪数据,无需二次查询元数据,效率更高:

// 当EasyPost追踪信息添加到订单时,提取并保存独立的追踪URL
add_action('wc_easypost_tracking_added', 'gyta_save_standalone_tracking_url', 10, 2);
function gyta_save_standalone_tracking_url($order_id, $tracking_data) {
    // 验证追踪URL存在
    if (!empty($tracking_data['public_url'])) {
        // 保存独立的追踪URL元数据,键名可自定义
        update_post_meta($order_id, '_gyta_standalone_tracking_url', esc_url($tracking_data['public_url']));
        // 可选:同时保存独立的追踪号
        update_post_meta($order_id, '_gyta_standalone_tracking_number', sanitize_text_field($tracking_data['tracking_code']));
    }
}

方案2:通用元数据监听钩子(兼容更多场景)

如果专属钩子未触发,可监听updated_post_meta钩子,当目标元数据更新时自动提取URL:

// 监听订单元数据更新,提取并保存独立追踪URL
add_action('updated_post_meta', 'gyta_catch_tracking_meta_update', 10, 4);
function gyta_catch_tracking_meta_update($meta_id, $post_id, $meta_key, $meta_value) {
    // 仅处理订单类型的帖子,且目标元数据键匹配
    if (get_post_type($post_id) !== 'shop_order' || $meta_key !== '_wcpti_easypost_tracking') {
        return;
    }
    // 验证数据格式有效
    if (is_array($meta_value) && !empty($meta_value['public_url'])) {
        update_post_meta($post_id, '_gyta_standalone_tracking_url', esc_url($meta_value['public_url']));
    }
}
使用说明
  1. 将代码添加到主题的functions.php文件,或使用代码片段插件
  2. 重新生成一次运单,即可在订单的自定义字段中看到新的独立元数据(键名如_gyta_standalone_tracking_url)
  3. 在订单邮件插件中直接调用该元数据键,就能获取单独的追踪URL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:52:45