来自产品元的 WooCommerce 订单电子邮件 change/remove "backordered: #"

WooCommerce order email change/remove "backordered: #" from product meta

我已经在我的 woocommerce 网站上自定义了延期交货文本,并且还想将相同的文本添加到订单确认电子邮件中。

例如,我的购物车和结账处在每个产品的(变体)元数据下显示 "In Stock" 或 "Made To Order"。

为了得到结果,我在 cart.php 模板文件中添加了以下代码,并在 review-order.php 模板文件中添加了类似的代码以使其显示在结帐页面上:

// Backorder notification.
if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification made-to-order">' . esc_html__( 'Made-To-Order', 'woocommerce' ) . '</p>', $product_id ) );
}
else if ( !$_product->backorders_require_notification() && !$_product->is_on_backorder( $cart_item['quantity'] ) ) {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification made-to-order">' . esc_html__( 'Made-To-Order', 'woocommerce' ) . '</p>', $product_id ) );
}
else {
    echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="cart_stock_notification in-stock">' . esc_html__( 'In Stock', 'woocommerce' ) . '</p>', $product_id ) );
}

现在我希望在我的订单确认电子邮件中显示同样的内容。我特别希望它出现在客户电子邮件中,但管理员电子邮件也可以。

现在,任何延期交货的产品都在产品元数据中显示为 "Backordered: #",表示延期交货的产品数量。

我想删除那个延期交货的元数据,并用购物车和结账页面上使用的相同逻辑替换它,这样它将在电子邮件中显示相同的库存状态。

我知道 class-wc-order-item-product.php 中的 set_backorder_meta 函数正在应用延期交货的元数据,但我不想编辑 class 文件,因为它会被更新覆盖.

我也不想只更改文本,我需要更改逻辑。如果我可以禁用 set_backorder_meta 应用于电子邮件,我想我可以连接到 woocommerce_order_item_meta_end 或只编辑 email-order-items.php 模板文件(我都可以)。

我的问题是我似乎无法检查项目 "backorders_require_notification" and/or "is_on_backorder"。

有没有办法在电子邮件确认中禁用默认的延期交货元数据并添加自定义元数据以检查产品是否处于延期交货状态(并且需要延期交货通知),然后显示自定义文本?

在第 60 - 65 行的 email-order-items.php 模板中。使用了wc_display_item_meta()函数。

If we look further, we will see that this function is in wc-template-functions.php

https://github.com/woocommerce/woocommerce/blob/master/includes/wc-template-functions.php#L3202-L3244

所以我们可以通过woocommerce_display_item_meta钩子覆盖输出,通过参数我们可以获得关于产品的必要信息。

function filter_woocommerce_display_item_meta ( $html, $item, $args ) { 
    // Get product
    $product = $item->get_product();

    // Html
    if ( $product->backorders_require_notification() && $product->is_on_backorder( $item['quantity'] ) ) {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">Made-To-Order</strong></li></ul>';       
    } else if ( !$product->backorders_require_notification() && !$product->is_on_backorder( $item['quantity'] ) ) {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">Made-To-Order</strong></li></ul>';
    } else {
        $html = '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label" style="float: left; margin-right: .25em; clear: both">In stock</strong></li></ul>';
    }

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

提示: 为了使输出更加动态,您可以通过 args 重写输出(您可以在 wc-template-functions.php 中看到这是如何完成的)