在 WooCommerce 电子邮件通知中使用“is_wc_endpoint_url()”函数的替代方法

Posted

技术标签:

【中文标题】在 WooCommerce 电子邮件通知中使用“is_wc_endpoint_url()”函数的替代方法【英文标题】:Alternative to using "is_wc_endpoint_url()" function in WooCommerce email notifications 【发布时间】:2022-01-07 22:31:03 【问题描述】:

最近,我问了两个解决方案,得到了答案:

Adding metadata Changing metadata

一些订单项目。仅适用于完成订单时发送的 WooCommerce 电子邮件通知的解决方案。

收到的解决方案的问题在于,为了将它们仅限制为电子邮件通知,使用了 is_wc_endpoint_url() 函数,在我的特定情况下(我不知道为什么!),使它们能够工作仅适用于发送给管理员的通知,而不是发送给客户的通知,客户实际上是相关元数据的主要接收者。

is_wc_endpoint_url() 函数有没有办法解决这个问题?

第一个答案,添加元数据:

function action_woocommerce_order_item_meta_start( $item_id, $item, $order, $plain_text ) 
    // On email notifications
    if ( ! is_wc_endpoint_url() && $item->is_type('line_item') ) 
        echo '<ul class="wc-item-meta"><li><strong class="wc-item-meta-label">Label</strong><p>Value order id = ' . $order->get_id() . '</p></li></ul>';
    

add_action( 'woocommerce_order_item_meta_start', 'action_woocommerce_order_item_meta_start', 10, 4 );

第二个答案(选项之一),更改元数据:

function filter_woocommerce_order_item_get_formatted_meta_data( $formatted_meta, $item ) 
    // Only on emails notifications
    if ( is_admin() || is_wc_endpoint_url() )
        return $formatted_meta;

    foreach ( $formatted_meta as $key => $meta ) 
        $formatted_meta[$key]->display_key = 'new key';
        $formatted_meta[$key]->display_value = 'new value';
    
    
    return $formatted_meta;

add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'filter_woocommerce_order_item_get_formatted_meta_data', 10, 2 );

【问题讨论】:

【参考方案1】:

在 WooCommerce 电子邮件通知中使用 is_wc_endpoint_url() 的替代方法可以通过应用全局变量来完成

要确定它是否是 WooCommerce 电子邮件通知,我们可以通过仅适用于 WooCommerce 电子邮件通知的挂钩 (woocommerce_email_before_order_table) 创建一个全局变量

// Setting global variable
function action_woocommerce_email_before_order_table( $order, $sent_to_admin, $plain_text, $email ) 
    $GLOBALS['email_data'] = array(
        'email_id'  => $email->id, // The email ID (to target specific email notification)
        'is_email'  => true // When it concerns a WooCommerce email notification
    );

add_action('woocommerce_email_before_order_table', 'action_woocommerce_email_before_order_table', 1, 4 );

这可以根据需要进一步扩展


然后我们可以检查其他钩子,在这种特定情况下,woocommerce_order_item_meta_start 钩子(但它可以应用于任何与 WooCommerce 电子邮件通知相关的钩子)以查看该全局变量是否可用,如果是,我们可以在此基础上执行一些操作。

示例 1: 是电子邮件通知吗? 示例 2: 使用 $email-&gt;id 来定位特定的电子邮件通知,以防电子邮件 ID 尚未默认传递给所需的挂钩
function action_woocommerce_order_item_meta_start( $item_id, $item, $order, $plain_text ) 
    // Getting the custom 'email_data' global variable
    $ref_name_globals_var = $GLOBALS;
    
    // Isset & NOT empty
    if ( isset ( $ref_name_globals_var ) && ! empty( $ref_name_globals_var ) ) 
        // Isset
        $email_data = isset( $ref_name_globals_var['email_data'] ) ? $ref_name_globals_var['email_data'] : '';
        
        // NOT empty
        if ( ! empty( $email_data ) ) 
            // Example 1
            
            // When true
            if ( $email_data['is_email'] ) 
                echo '<p style="color: red; font-size: 30px;">This is a WooCommerce email notification</p>';
            
            
            // Example 2
            
            // Add the desired email IDs
            $target_emails = array( 'customer_processing_order', 'customer_on_hold_order', 'customer_refunded_order' );
            
            // Target specific WooCommerce email notifications
            if ( in_array( $email_data['email_id'], $target_emails ) ) 
                echo '<p style="color: red; font-size: 30px;">Email ID = ' . $email_data['email_id'] . '</p>';
                       
        
    

add_action( 'woocommerce_order_item_meta_start', 'action_woocommerce_order_item_meta_start', 10, 4 );

在这个答案中使用:

Determine only for WooCommerce admin email notification

How to target other WooCommerce order emails

【讨论】:

不错!我理解(我认为)这必须如何工作,所以我会尝试相应地调整它以满足我的需求。非常感谢!!!

以上是关于在 WooCommerce 电子邮件通知中使用“is_wc_endpoint_url()”函数的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 电子邮件通知中使用“is_wc_endpoint_url()”函数的替代方法

在 Woocommerce 购物车、结帐页面、订单和电子邮件通知中的产品标题上方显示品牌名称

在 Woocommerce 订单和电子邮件通知中显示产品品牌和名称

在 Woocommerce 订单电子邮件通知中获取用户 ID [重复]

从 WooCommerce 中的电子邮件通知中删除 BACS 指令

通过 WooCommerce 管理员电子邮件通知中的“woocommerce_email_order_meta”挂钩显示产品自定义字段