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

如何在WooCommerce完成订单邮件中发送Furgonetka追踪单号

问题:WooCommerce订单完成邮件添加Furgonetka追踪单号

我在WooCommerce上安装了Furgonetka插件,包裹追踪号从Furgonetka服务获取后存储在tracking_info字段中,字段格式如下:

Array
(
    [520000016902796077744528] => Array
        (
            [courierService] => inpostkurier
        )

)

数据库中以序列化形式存储:

a:1:{s:24:"520000016902796077744528";a:1:{s:14:"courierService";s:12:"inpostkurier";}}

我已经在functions.php中添加了自动更新订单状态的函数,当订单获取到追踪信息时自动改为completed状态,功能正常:

function update_order_status_when_shipment_tracking_input( $meta_id, $object_id, $meta_key, $meta_value ){
    if( $meta_key == 'tracking_info' ){
        error_log('update_order_status_when_shipment_tracking_input');
        $order = wc_get_order( $object_id );
        if( $order ){
            $order->update_status( 'completed' );
        }
    }
}
add_action( 'update_postmeta', 'update_order_status_when_shipment_tracking_input', 10, 4 );

现在需要实现的是:从tracking_info字段中提取追踪单号(如520000016902796077744528),并添加到订单完成状态的邮件中。以下是Furgonetka插件的相关代码片段:

/**
 * Render html for metaboxes
 */
public function render_metabox_for_product_page(): void {
    global $post;
    $this->other_package_link_callback();
    $this->package_information( $post );
}

/**
 * Render html for package info
 *
 * @param mixed $post - post data.
 */
public function package_information( $post ) {
    $this->view->render_packages_tracking_info( $this->render_packages_numbers( $post ) );
}

/**
 * Renders link to furgonetka iframe
 *
 * @param mixed $post - post data.
 */
public function other_package_link( $post ) {
    $this->view->render_package_link(
        get_admin_url( null, 'admin.php?page=' . $this->furgonetka_admin->get_plugin_name() . '&idOrder=' . $post->ID ),
        plugin_dir_url( __DIR__ ) . 'admin/img/furgonetka-kurirer.svg'
    );
}

/**
 * Adding new columns to orders page
 *
 * @param array $columns - columns array.
 *
 * @return array
 */
public function extra_order_column( array $columns ): array {
    $columns[ $this->furgonetka_admin->get_plugin_name() ] = __( 'Furgonetka.pl', 'furgonetka' );
    $columns['package_number']                             = __( 'Packages tracking numbers', 'furgonetka' );
    return $columns;
}

/**
 * Render package number.
 *
 * @param mixed $post - post data.
 *
 * @return string|void
 */
public function render_packages_numbers( $post ) {
    $package_numbers = $this->model
        ->set_order_id( $post->ID )
        ->get_tracking_info();
    if ( empty( $package_numbers ) ) {
        return;
    }
    return $package_numbers;
}

/**
 * Get package numbers
 *
 * @param mixed $post - post data.
 *
 * @return array|void
 */
public function get_packages_numbers( $post ) {
    $package_numbers = $this->model
        ->set_order_id( $post->ID )
        ->get_tracking_info();
    if ( empty( $package_numbers ) ) {
        return array();
    }
    return $package_numbers;
}

/**
 * Adding content to new columns in orders page
 *
 * @param string $column - column name.
 *
 * @return mixed
 */
public function extra_order_column_content( string $column ) {
    global $post;

    switch ( $column ) {
        case $this->furgonetka_admin->get_plugin_name():
            $this->other_package_link( $post );
            break;
        case 'package_number':
            $package_numbers = $this->get_packages_numbers( $post );
            foreach ( $package_numbers as $package_number => $package_data ) {

                if ( Furgonetka_Admin::get_test_mode() ) {
                    echo '<a style="text-decoration : underline" target="_blank" href="https://test.furgonetka.pl/zlokalizuj/' . esc_html( $package_number ) . '">' . esc_html( $package_number ) . '</a><br>';
                } else {
                    echo '<a style="text-decoration : underline" target="_blank" href="https://furgonetka.pl/zlokalizuj/' . esc_html( $package_number ) . '">' . esc_html( $package_number ) . '</a><br>';
                }
            }
            break;
    }
}
解决方案

通过WooCommerce的邮件钩子,在订单完成邮件中插入追踪单号信息,具体实现如下:

实现代码

将以下代码添加到主题的functions.php文件中:

function add_furgonetka_tracking_to_completed_email( $order, $sent_to_admin, $plain_text, $email ) {
    // 仅针对订单完成邮件生效
    if ( $email->id !== 'customer_completed_order' ) {
        return;
    }

    // 获取订单的追踪信息元数据
    $tracking_info = get_post_meta( $order->get_id(), 'tracking_info', true );
    
    // 检查追踪信息是否有效
    if ( empty( $tracking_info ) || ! is_array( $tracking_info ) ) {
        return;
    }

    // 构建追踪信息内容
    if ( $plain_text ) {
        // 纯文本邮件格式
        $tracking_content = "\n" . __( '包裹追踪信息:', 'furgonetka' ) . "\n";
        foreach ( $tracking_info as $tracking_number => $package_data ) {
            $tracking_content .= '- ' . __( '追踪单号:', 'furgonetka' ) . ' ' . $tracking_number;
            // 可选:显示快递公司信息
            if ( isset( $package_data['courierService'] ) ) {
                $tracking_content .= ' [' . $package_data['courierService'] . ']';
            }
            $tracking_content .= "\n";
        }
        echo $tracking_content;
    } else {
        // HTML邮件格式
        $tracking_content = '<h2>' . __( '包裹追踪信息', 'furgonetka' ) . '</h2>';
        $tracking_content .= '<ul>';
        foreach ( $tracking_info as $tracking_number => $package_data ) {
            $tracking_content .= '<li>';
            $tracking_content .= __( '追踪单号:', 'furgonetka' ) . ' ' . esc_html( $tracking_number );
            // 可选:显示快递公司信息
            if ( isset( $package_data['courierService'] ) ) {
                $tracking_content .= ' (' . esc_html( $package_data['courierService'] ) . ')';
            }
            $tracking_content .= '</li>';
        }
        $tracking_content .= '</ul>';
        echo $tracking_content;
    }
}
add_action( 'woocommerce_email_order_details', 'add_furgonetka_tracking_to_completed_email', 20, 4 );

代码说明

  • 钩子选择:使用woocommerce_email_order_details钩子,将追踪信息插入到订单详情区域,设置优先级为20,确保在默认订单详情之后显示。
  • 邮件类型过滤:仅对用户端的订单完成邮件生效,避免干扰管理员邮件或其他状态的邮件。
  • 追踪信息提取:通过get_post_meta直接获取tracking_info字段,WordPress会自动将序列化的数组反序列化为可用的PHP数组。
  • 多包裹支持:遍历数组结构,支持单个订单包含多个包裹的追踪单号显示。
  • 双格式兼容:同时处理HTML和纯文本两种邮件格式,确保所有用户都能正常查看追踪信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:15:28