在某些 WooCommerce 电子邮件通知中隐藏项目元数据

Hide item meta data in certain WooCommerce email notifications

我的 functions.php 文件中有此代码片段:

add_action( 'woocommerce_checkout_create_order_line_item', 'add_custom_field_to_order_item_meta', 10, 4 );
function add_custom_field_to_order_item_meta( $item, $cart_item_key, $values, $order ) {
    $custom_field_value = get_post_meta( $item->get_product_id(), 'supplier_sku', true );
    if ( ! empty($custom_field_value) ){
            $item->update_meta_data( __('Supplier SKU', 'woocommerce'), $custom_field_value );
    }
}

它拉入产品的自定义字段,称为供应商 SKU,然后将其添加到 WooCommerce 电子邮件通知中。这很好,但我想将其从客户电子邮件通知中排除,只显示在管理员电子邮件通知中。

我怎样才能做到这一点?

您可以使用 woocommerce_display_item_meta 挂钩和 return 空字符串

function filter_woocommerce_display_item_meta ( $html, $item, $args ) {
    $html = '';

    return $html;
}
add_filter( 'woocommerce_display_item_meta', 'filter_woocommerce_display_item_meta', 10, 3 );

虽然以上方法可行,但会出现一些问题,即:

  • 该挂钩 运行 不仅仅用于电子邮件通知,因此它不会出现在任何地方
  • 即使这个挂钩只对电子邮件通知执行,我们仍然需要指定这应该只适用于某些电子邮件通知。但是这个钩子默认没有提供解决方案来做这个区分

因此需要一个解决方法,这可以通过另一个仅适用于电子邮件通知的挂钩创建一个全局变量来完成

步骤 1) 创建并添加一个全局变量

// Setting global variable
function action_woocommerce_email_before_order_table( $order, $sent_to_admin, $plain_text, $email ) {
    $GLOBALS['email_id'] = $email->id;
}
add_action( 'woocommerce_email_before_order_table', 'action_woocommerce_email_before_order_table', 1, 4 );

步骤2)在钩子woocommerce_display_item_meta中,添加并检查具体条件

  • 仅用于电子邮件通知
  • 仅针对特定的元数据
  • 仅限管理员 'new order' 电子邮件
function filter_woocommerce_display_item_meta ( $html, $item, $args ) {
    // For email notifications and specific meta
    if ( ! is_wc_endpoint_url() && $item->is_type( 'line_item' ) && $item->get_meta( 'Supplier SKU' ) ) {
        // Getting the email ID global variable
        $ref_name_globals_var = isset( $GLOBALS ) ? $GLOBALS : '';
        $email_id = isset( $ref_name_globals_var['email_id'] ) ? $ref_name_globals_var['email_id'] : '';

        // NOT empty and targeting specific email. Multiple statuses can be added, separated by a comma
        if ( ! empty ( $email_id ) && ! in_array( $email_id, array( 'new_order' ) ) ) {
            $html = '';
        }
    }

    return $html;
}
add_filter( 'woocommerce_display_item_meta', 'filter_woocommerce_display_item_meta', 10, 3 );