如何在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
相关产品推荐
相关产品推荐

