显示物品价格包括和不包括 WooCommerce 电子邮件通知的多列中的增值税 代码

问题描述

Additional columns and item values in Woocommerce email order details 的启发,该答案会覆盖 woocommerce 模板以向电子邮件订单详细信息添加其他列。

我想用不同的分隔列实现类似的效果,例如:

  1. 数量
  2. 图片和产品名称
  3. SKU
  4. 产品价格 45 美元 不含增值税 $37.5
  5. 总行数 90 美元 不包括。增值税 $75

这是我尝试的代码

• 模板文件 email-order-details.ph

<?PHP
/**
 * Order details table shown in emails.
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-details.PHP.
 *
 * HOWEVER,on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible,but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce/Templates/Emails
 * @version 3.3.1
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

$text_align = is_rtl() ? 'right' : 'left';

do_action( 'woocommerce_email_before_order_table',$order,$sent_to_admin,$plain_text,$email ); ?>

<h2>
    <?PHP
    if ( $sent_to_admin ) {
        $before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '">';
        $after  = '</a>';
    } else {
        $before = '';
        $after  = '';
    }
    /* translators: %s: Order ID. */
    echo wp_kses_post( $before . sprintf( __( 'Order #%s','woocommerce' ) . $after . ' (<time datetime="%s">%s</time>)',$order->get_order_number(),$order->get_date_created()->format( 'c' ),wc_format_datetime( $order->get_date_created() ) ) );
    ?>
</h2>

<div style="margin-bottom: 40px;">
    <table class="td" cellspacing="0" cellpadding="6" style="width: 100%; font-family: 'Helvetica Neue',Helvetica,Roboto,Arial,sans-serif;" border="1">
        <thead>
            <tr>
                <th class="td" scope="col" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e( 'Product','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e(  'Quantity','woocommerce' )?></th>
                <th class="td" scope="col" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e( 'Product SKU','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e( 'Price','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e( 'Total','woocommerce' ); ?></th>
            </tr>
        </thead>
        <tbody>
            <?PHP
            echo wc_get_email_order_items( $order,array( // WPCS: XSS ok.
                'show_sku'      => $sent_to_admin,'show_image'    => true,'image_size'    => array( 32,32 ),'plain_text'    => $plain_text,'sent_to_admin' => $sent_to_admin,) );
            ?>
        </tbody>
        <tfoot>
            <?PHP
            $totals = $order->get_order_item_totals();

            if ( $totals ) {
                $i = 0;
                foreach ( $totals as $total ) {
                    $i++;
                    ?>
                    <tr>
                        <th class="td" scope="row" colspan="4" 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 ( $order->get_customer_note() ) {
                ?>
                <tr>
                    <th class="td" scope="row" colspan="4" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP esc_html_e( 'Additional notes:','woocommerce' ); ?></th>
                    <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>;"><?PHP echo wp_kses_post( wptexturize( $order->get_customer_note() ) ); ?></td>
                </tr>
                <?PHP
            }
            ?>
        </tfoot>
    </table>
</div>

<?PHP do_action( 'woocommerce_email_after_order_table',$email ); ?>

• 模板文件 email-order-items.PHP

<?PHP
/**
 * Email Order Items
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-items.PHP.
 *
 * HOWEVER,but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce/Templates/Emails
 * @version 3.5.0
 */

defined( 'ABSPATH' ) || exit;

$text_align = is_rtl() ? 'right' : 'left';

foreach ( $items as $item_id => $item ) :
    $product       = $item->get_product();
    $sku           = '';
    $purchase_note = '';
    $image         = '';

    if ( ! apply_filters( 'woocommerce_order_item_visible',true,$item ) ) {
        continue;
    }

    if ( is_object( $product ) ) {
        $sku           = $product->get_sku();
        $purchase_note = $product->get_purchase_note();
        $image         = $product->get_image( $image_size );
    }

    ?>
    <tr class="<?PHP echo esc_attr( apply_filters( 'woocommerce_order_item_class','order_item',$item,$order ) ); ?>">
        <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?PHP echo wp_kses_post( apply_filters( 'woocommerce_order_item_name',$item->get_name(),false ) );      // SKU.
        if ( $show_sku && $sku ) {
            echo wp_kses_post( ' (#' . $sku . ')' );
        }

        // allow other plugins to add additional product information here.
        do_action( 'woocommerce_order_item_Meta_start',$item_id,$plain_text );

        wc_display_item_Meta( $item,array(
            'label_before' => '<strong class="wc-item-Meta-label" style="float: left; margin-right: .25em; clear: both">',) );

        // allow other plugins to add additional product information here.
        do_action( 'woocommerce_order_item_Meta_end',$plain_text );
 ?>
        </td>
        <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align: middle; font-family: 'Helvetica Neue',sans-serif; word-wrap:break-word;">
        <?PHP

        // Product Quantity.
        echo wp_kses_post( apply_filters( 'woocommerce_email_order_item_quantity',$item->get_quantity(),$item ) );

        ?>
        </td>
        <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?PHP echo wp_kses_post( $sku ); ?>
        </td>
        <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?PHP echo wp_kses_post( wc_price( round( $item->get_subtotal(),wc_get_price_decimals() ) ) ); ?>
        </td>
        <td class="td" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?PHP echo wp_kses_post( wc_price( round( $item->get_subtotal_tax(),wc_get_price_decimals() ) ) ); ?>
        </td>
    </tr>
    <?PHP

    if ( $show_purchase_note && $purchase_note ) {
        ?>
        <tr>
            <td colspan="3" style="text-align:<?PHP echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
                <?PHP
                echo wp_kses_post( wpautop( do_shortcode( $purchase_note ) ) );
                ?>
            </td>
        </tr>
        <?PHP
    }
    ?>

<?PHP endforeach; ?>

目前的成果:

Current Outcome

预期结果:

Expected Outcome

谁能给我指明正确的方向(我是新手)

解决方法

以下是将电子邮件订单项表拆分为 5 列的正确方法,如下所示:

  1. 数量
  2. 图片和产品名称
  3. SKU
  4. 产品价格 45 美元 不含增值税 $37.5
  5. 总行数 90 美元 不包括。增值税 $75

注意事项:

  • 您的模板文件已过时:下面我使用了 WooCommerce 3.7+ 版的最新模板
  • 变体产品 SKU(如果已设置)的优先级高于可变产品 SKU 的父级。

代码

• 模板文件 email-order-details.php

<?php
/**
 * Order details table shown in emails.
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-details.php.
 *
 * HOWEVER,on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible,but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates\Emails
 * @version 3.7.0
 */

defined( 'ABSPATH' ) || exit;

$text_align = is_rtl() ? 'right' : 'left';

do_action( 'woocommerce_email_before_order_table',$order,$sent_to_admin,$plain_text,$email ); ?>

<h2>
    <?php
    if ( $sent_to_admin ) {
        $before = '<a class="link" href="' . esc_url( $order->get_edit_order_url() ) . '">';
        $after  = '</a>';
    } else {
        $before = '';
        $after  = '';
    }
    /* translators: %s: Order ID. */
    echo wp_kses_post( $before . sprintf( __( '[Order #%s]','woocommerce' ) . $after . ' (<time datetime="%s">%s</time>)',$order->get_order_number(),$order->get_date_created()->format( 'c' ),wc_format_datetime( $order->get_date_created() ) ) );
    ?>
</h2>

<div style="margin-bottom: 40px;">
    <table class="td" cellspacing="0" cellpadding="6" style="width: 100%; font-family: 'Helvetica Neue',Helvetica,Roboto,Arial,sans-serif;" border="1">
        <thead>
            <tr>
                <th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Qty.','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Product','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Product code','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Price','woocommerce' ); ?></th>
                <th class="td" scope="col" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Total','woocommerce' ); ?></th>
            </tr>
        </thead>
        <tbody>
            <?php
            echo wc_get_email_order_items( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                $order,array(
                    'show_sku'      => true,'show_image'    => true,'image_size'    => array( 32,32 ),'plain_text'    => $plain_text,'sent_to_admin' => $sent_to_admin,)
            );
            ?>
        </tbody>
        <tfoot>
            <?php
            $item_totals = $order->get_order_item_totals();

            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" colspan="3" 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 ( $order->get_customer_note() ) {
                ?>
                <tr>
                    <th class="td" scope="row" colspan="2" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Note:','woocommerce' ); ?></th>
                    <td class="td" colspan="3" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php echo wp_kses_post( nl2br( wptexturize( $order->get_customer_note() ) ) ); ?></td>
                </tr>
                <?php
            }
            ?>
        </tfoot>
    </table>
</div>

<?php do_action( 'woocommerce_email_after_order_table',$email ); ?>

• 模板文件 email-order-items.php

<?php
/**
 * Email Order Items
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/email-order-items.php.
 *
 * HOWEVER,but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates\Emails
 * @version 3.7.0
 */

defined( 'ABSPATH' ) || exit;

$text_align  = is_rtl() ? 'right' : 'left';
$margin_side = is_rtl() ? 'left' : 'right';

foreach ( $items as $item_id => $item ) :
    $product       = $item->get_product();
    $sku           = '';
    $purchase_note = '';
    $image         = '';

    if ( ! apply_filters( 'woocommerce_order_item_visible',true,$item ) ) {
        continue;
    }

    if ( is_object( $product ) ) {
        $sku           = $product->get_sku();
        $purchase_note = $product->get_purchase_note();
        $image         = $product->get_image( $image_size );
    }

    ?>
    <tr class="<?php echo esc_attr( apply_filters( 'woocommerce_order_item_class','order_item',$item,$order ) ); ?>">
        <?php // ----- Item Quantity ----- ?>
        <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?php
            $qty          = $item->get_quantity();
            $refunded_qty = $order->get_qty_refunded_for_item( $item_id );

            if ( $refunded_qty ) {
                $qty_display = '<del>' . esc_html( $qty ) . '</del> <ins>' . esc_html( $qty - ( $refunded_qty * -1 ) ) . '</ins>';
            } else {
                $qty_display = esc_html( $qty );
            }
            echo wp_kses_post( apply_filters( 'woocommerce_email_order_item_quantity',$qty_display,$item ) );
            ?>
        </td>
        <?php // ----- Product name / image ----- ?>
        <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align: middle; font-family: 'Helvetica Neue',sans-serif; word-wrap:break-word;">
        <?php

        // Show title/image etc.
        if ( $show_image ) {
            echo wp_kses_post( apply_filters( 'woocommerce_order_item_thumbnail',$image,$item ) );
        }

        // Product name.
        echo '<br>' . wp_kses_post( apply_filters( 'woocommerce_order_item_name',$item->get_name(),false ) );

        // allow other plugins to add additional product information here.
        do_action( 'woocommerce_order_item_meta_start',$item_id,$plain_text );

        wc_display_item_meta( $item,array(
            'label_before' => '<strong class="wc-item-meta-label" style="float: ' . esc_attr( $text_align ) . '; margin-' . esc_attr( $margin_side ) . ': .25em; clear: both">',) );

        // allow other plugins to add additional product information here.
        do_action( 'woocommerce_order_item_meta_end',$plain_text );

        ?>
        </td>
        <?php // ----- Product SKU ----- ?>
        <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align: middle; font-family: 'Helvetica Neue',sans-serif; word-wrap:break-word;">
        <?php
        if ( $show_sku && $sku ) {
            echo wp_kses_post( $sku );
        }
        ?>
        </td>
        <?php // ----- Product Price (Incl & Excl tax) ----- ?>
        <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?php
                echo wp_kses_post( wc_price( $order->get_item_subtotal( $item,true ),array( 'currency' => $order->get_currency() ) ) ) . '<br>' .
                __("Excl.Vat","woocommerce") . ': ' . wp_kses_post( wc_price( $order->get_item_subtotal( $item ),array( 'currency' => $order->get_currency() ) ) );
            ?>
        </td>
        <?php // ----- Item Subtotal (Incl & Excl tax) ----- ?>
        <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
            <?php
                echo wp_kses_post( wc_price( $order->get_line_subtotal( $item,"woocommerce") . ': ' . wp_kses_post( wc_price( $order->get_line_subtotal( $item ),array( 'currency' => $order->get_currency() ) ) );
            ?>
        </td>
    </tr>
    <?php

    if ( $show_purchase_note && $purchase_note ) {
        ?>
        <tr>
            <td colspan="3" style="text-align:<?php echo esc_attr( $text_align ); ?>; vertical-align:middle; font-family: 'Helvetica Neue',sans-serif;">
                <?php
                echo wp_kses_post( wpautop( do_shortcode( $purchase_note ) ) );
                ?>
            </td>
        </tr>
        <?php
    }
    ?>

<?php endforeach; ?>

经过测试并按预期工作:

enter image description here