在 WooCommerce 电子邮件通知的订单详细信息表中隐藏自定义费用行

Posted

技术标签:

【中文标题】在 WooCommerce 电子邮件通知的订单详细信息表中隐藏自定义费用行【英文标题】:Hide custom fee row from order details table in WooCommerce email notifications 【发布时间】:2021-12-20 07:49:12 【问题描述】:

我在订单表中添加了 3 项自定义费用,但在发送给管理员/客户的电子邮件中,我想隐藏其中一项自定义费用。

查看屏幕截图:

其实我是用这个sn-p加了自定义费用的:

add_action( 'woocommerce_cart_calculate_fees','customfee1' );
 
function customfee1() 
    $soustotalavecliv = (WC()->cart->get_cart_contents_total()+WC()->cart->get_shipping_total());
    WC()->cart->add_fee( 'TOTAL', $soustotalavecliv );


add_action( 'woocommerce_cart_calculate_fees','customfee2' );
 
function customfee2() 
    $retraitsubt = (WC()->cart->get_cart_contents_total()+WC()->cart->get_shipping_total());
    WC()->cart->add_fee( 'A retirer', $retraitsubt*-1 );


add_action( 'woocommerce_cart_calculate_fees','customfee3' );
 
function customfee3() 
    $total_minus_100 = (WC()->cart->get_cart_contents_total()+WC()->cart->get_shipping_total()) /2;
    WC()->cart->add_fee( 'Acompte versé par CB', $total_minus_100 * -1 );

但在所有模板电子邮件中,我想隐藏“customfee2”。我设法用 CSS 代码隐藏了这一点。但以下代码仅适用于发送给管理员的 NEW ORDER EMAIL,而不适用于其他电子邮件。

function ymcode_hide_customfee2_row_with_css()

    ?>
    <style>
          tfoot tr:nth-child(5) 
             display: none !important;
      
    </style>
    <?php


add_action('woocommerce_email_header', 'ymcode_hide_customfee2_row_with_css', 10, 0);

有什么建议吗?

【问题讨论】:

您好,抱歉,我还没有尝试您的代码。会尽快回复 【参考方案1】:

首先,我修改了您现有的代码。这是因为:

没有必要多次添加相同的代码,因为任何事情都可以发生一次。 没有必要使用WC()-&gt;cart,因为$cart默认传递给回调函数。

所以只需使用:

function action_woocommerce_cart_calculate_fees( $cart ) 
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    
    // Getters
    $contents_total = $cart->get_cart_contents_total();
    $shipping_total = $cart->get_shipping_total();
    $total = $contents_total + $shipping_total;

    // 1
    // Add fee
    $cart->add_fee( __( 'TOTAL', 'woocommerce' ), $total );

    // 2
    // Calculate
    $retraitsubt = $total *-1;
    // Add fee
    $cart->add_fee( __( 'A retirer', 'woocommerce' ), $retraitsubt );

    // 3
    // Calculate
    $total_minus_100 = ( $total / 2 ) * -1;
    // Add fee
    $cart->add_fee( __( 'Acompte versé par CB', 'woocommerce' ), $total_minus_100 );

add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );

回答您的问题:

您可以使用woocommerce_email_styles 过滤钩子,它允许您将 CSS 添加到电子邮件中,而不必覆盖模板文件

所以你得到:

// Add CSS to email
function filter_woocommerce_email_styles( $css, $email ) 
    $extra_css = 'tfoot tr:nth-child(5)  display: none !important; ';
    
    return $css . $extra_css;

add_filter( 'woocommerce_email_styles', 'filter_woocommerce_email_styles', 10, 2 );

注意:因为上面通过过滤器钩子的回答非常“棘手”,因为没有 CSS 类分配给电子邮件中的 &lt;tr&gt; 标记,覆盖 /emails/email-order-details.php 文件可能是“更安全”的选项。

可以通过将其复制到yourtheme/woocommerce/emails/email-order-details.php. 来覆盖此模板

替换第 65 - 76 行 @version 3.7.0

if ( $item_totals ) 
    $i = 0;
    foreach ( $item_totals as $total ) 
        $i++;
        ?>
        <tr>
            <th class="td" scope="row" colspan="2" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['label'] ); ?></th>
            <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['value'] ); ?></td>
        </tr>
        <?php
    

if ( $item_totals ) 
    $i = 0;
    foreach ( $item_totals as $total ) 
        $i++;
        
        // Make sure this is correct!
        $label = 'A retirer:';
        
        // Check if the string is not equal to the label, and if not, display the table row
        if ( $total['label'] != $label ) 
        ?>
        <tr>
            <th class="td" scope="row" colspan="2" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['label'] ); ?></th>
            <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; <?php echo ( 1 === $i ) ? 'border-top-width: 4px;' : ''; ?>"><?php echo wp_kses_post( $total['value'] ); ?></td>
        </tr>
        <?php
        
    

【讨论】:

以上是关于在 WooCommerce 电子邮件通知的订单详细信息表中隐藏自定义费用行的主要内容,如果未能解决你的问题,请参考以下文章

在 Woocommerce 订单电子邮件通知中获取用户 ID [重复]

立即在 WooCommerce 中设置待处理订单并发送处理电子邮件通知

在 Woocommerce 订单和电子邮件通知中显示产品品牌和名称

在Woocommerce电子邮件通知中显示自定义订单状态的付款链接

当订单中有缺货商品时,在 WooCommerce 电子邮件通知中显示消息

在 Woocommerce 购物车、结帐页面、订单和电子邮件通知中的产品标题上方显示品牌名称