首页 > 解决方案 > 如何仅将过滤器应用于新订单电子邮件(wordpress、woocommerce)

问题描述

我需要帮助将以下过滤器仅应用于 woocommerce 管理员新订单电子邮件。我已经尝试了几件事,但无法使其正常工作。

**function filter_woocommerce_email_order_item_quantity( $qty_display, $item ) {
$product = wc_get_product( $item['product_id'] );
$product_id = $product->get_id();

if ( $product_id == 6960 ) {
    $qty_display = $qty_display * 2;
}

return $qty_display; 
}; 
add_filter( 'woocommerce_email_order_item_quantity', 'filter_woocommerce_email_order_item_quantity', 10, 2 );

标签: phpwordpresswoocommerce

解决方案


欢迎来到 WPSE。
$item是一个实例WC_Order_Item而不是一个数组,所以不可能像那样从订单项目对象中获取 product_id ( $item['product_id'])。
我建议使用如下 WooCommerce 标准方法。

更新:

woocommerce_email_order_item_quantity操作过滤器不提供参数来了解它是管理员电子邮件还是客户电子邮件。为此,我们需要做一个技巧。

我会将一个函数与woocommerce_email_order_details操作挂钩,以确定是否将当前电子邮件发送给管理员并将其保存在一个常量中,以便稍后根据其值修改数量。Woocommerce 将优先级为 10 的函数与此挂钩挂钩,因此我们需要较低的优先级。

add_action( 'woocommerce_email_order_details', function( $order, $sent_to_admin )
{
    if ( $sent_to_admin && ! defined('TST_ADMIN_EMAIL') ) {
        define( 'TST_ADMIN_EMAIL', true );
    }
}, 9, 2 );

add_filter( 'woocommerce_email_order_item_quantity', 'tst_filter_woocommerce_email_order_item_quantity', 10, 2 );
function tst_filter_woocommerce_email_order_item_quantity( $qty_display, $item )
{
    if (
        defined('TST_ADMIN_EMAIL')
        && true === TST_ADMIN_EMAIL
        && 'line_item' === $item->get_type()
    ) {
        $product = $item->get_product();
        $product_id = $product->get_id();

        if ( $product_id == 6960 ) {
            $qty_display = $qty_display * 2;
        }
    }

    return $qty_display; 
}; 

推荐阅读