WooCommerce订单电子邮件更改/删除了产品meta

时间:2020-06-08 02:24:12

标签: php wordpress woocommerce hook-woocommerce email-notifications

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

例如,我有一个购物车和结帐栏,在每个产品的(变体)元下显示“有货”或“按订单生产”。

要获得结果,我将以下代码添加到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 ) );
}

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

现在,任何待补产品都在产品元数据中显示为“待补产品:#”,以表示待补产品的数量。

我想删除该缺货的meta并将其替换为购物车和结帐页面上使用的相同逻辑,以便它将在电子邮件中显示相同的库存状态。

我知道set_backorder_meta中的class-wc-order-item-product.php函数正在应用补缺的meta,但是我不想编辑类文件,因为它将被更新覆盖。

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

我的问题是我似乎无法检查项目“ backorders_require_notification”和/或“ is_on_backorder”。

有没有一种方法可以禁用电子邮件确认中的默认缺货订单元,并添加自定义元,以检查产品是否处于缺货状态(并需要缺货通知),然后显示自定义文本?

1 个答案:

答案 0 :(得分:1)

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

如果进一步看,我们会发现此函数位于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中看到它的完成方式)