WooCommerce邮件通知场景下is_wc_endpoint_url()的替代方案
问题根源
is_wc_endpoint_url() 仅用于检测当前访问的是否为WooCommerce前端端点页面(如我的账户、订单详情页),向客户发送订单邮件的触发逻辑位于后台/定时任务上下文,不属于前端端点请求,因此原判断逻辑失效。
解决方案
替换原有的端点判断逻辑,改用did_action('woocommerce_email_before_order_table')检测当前是否处于订单邮件渲染上下文,该判断对管理员和客户邮件均生效。
修改后:新增订单项元数据代码
function action_woocommerce_order_item_meta_start( $item_id, $item, $order, $plain_text ) { // 仅在邮件通知场景、且为商品订单项时执行 if ( did_action( 'woocommerce_email_before_order_table' ) && $item->is_type('line_item') ) { echo '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label">Label</strong><p>Value order id = ' . $order->get_id() . '</p></li></ul>'; } } add_action( 'woocommerce_order_item_meta_start', 'action_woocommerce_order_item_meta_start', 10, 4 );
修改点:将原!is_wc_endpoint_url()判断替换为did_action( 'woocommerce_email_before_order_table' ),确保仅在渲染邮件内容时输出自定义元数据。
修改后:修改订单项元数据代码
function filter_woocommerce_order_item_get_formatted_meta_data( $formatted_meta, $item ) { // 非邮件通知场景直接返回原数据 if ( ! did_action( 'woocommerce_email_before_order_table' ) ) return $formatted_meta; foreach ( $formatted_meta as $key => $meta ) { $formatted_meta[$key]->display_key = 'new key'; $formatted_meta[$key]->display_value = 'new value'; } return $formatted_meta; } add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'filter_woocommerce_order_item_get_formatted_meta_data', 10, 2 );
修改点:将原is_admin() || is_wc_endpoint_url()判断替换为!did_action( 'woocommerce_email_before_order_table' ),仅在邮件渲染场景下修改元数据内容。
内容的提问来源于stack exchange,提问作者Iurie
相关产品推荐
相关产品推荐

