woocommerce过滤器中的可变范围

时间:2017-03-29 13:29:45

标签: php wordpress woocommerce

我的页面需要在管理员的woocommerce电子邮件中显示不同的产品名称(新客户订单电子邮件)。要更改名称,请使用过滤器 woocommerce_order_item_name 。 但我必须验证它是管理员电子邮件还是客户电子邮件。我在这段代码中使用了一个gloab变量,它可以工作,但这不是我想的正确方法。那么有更好的解决方案来验证它是管理员电子邮件还是客户电子邮件?

woocommerce /电子邮件/电子邮件阶items.php

global $is_admin_email;
if($show_sku) {
    $is_admin_email = True;
}
else {
    $is_admin_email = False;

// Product name
echo apply_filters( 'woocommerce_order_item_name', $item['name'], $item, false );
//Set to false again
$is_admin_email = False;

的functions.php

function filter_woocommerce_order_item_name( $item_name, $item, $false ) { 
    global $is_admin_email;
    if( $is_admin_email ){
        $item_name = "Item name in admin email";
    }

    return $item_name; 
};

// add the filter
add_filter( 'woocommerce_order_item_name', 'filter_woocommerce_order_item_name', 10, 3 );

1 个答案:

答案 0 :(得分:1)

我会在电子邮件中找到一个钩子,并在发送给管理员时包含变量$sent_to_admin true。这听起来像是满足您需求的完美条件。

所以,我会尝试以下方法:

add_action( 'woocommerce_email_before_order_table', 'so_43094965_order_item_names', 10, 4 ); 

function so_43094965_order_item_names( $order, $sent_to_admin, $plain_text, $email ){
    if( $sent_to_admin ){
        add_filter( 'woocommerce_order_item_name', 'filter_woocommerce_order_item_name', 10, 3 );
    }
}

这会添加您的过滤器,但仅限于您在管理员电子邮件中。

然后:

add_action( 'woocommerce_email_after_order_table', 'so_43094965_remove_order_item_names', 10, 4 ); 

function so_43094965_remove_order_item_names( $order, $sent_to_admin, $plain_text, $email ){
    remove_filter( 'woocommerce_order_item_name', 'filter_woocommerce_order_item_name', 10, 3 );
}

这会删除它,所以它不会出现在其他地方......我不确定是否需要它,但为了完整性我将它丢弃在那里。

这是未经测试的,因此您的里程可能会有所不同。