在 WooCommerce 电子邮件通知中使用 "is_wc_endpoint_url()" 函数的替代方法
Alternative to using "is_wc_endpoint_url()" function in WooCommerce email notifications
最近问了两个解决方案,得到了答案:
一些订单商品。仅适用于在已完成订单上发送的 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 );
可以通过应用全局变量
来替代使用 is_wc_endpoint_url()
进行 WooCommerce 电子邮件通知
要确定它是否是 WooCommerce 电子邮件通知,我们可以通过钩子 (woocommerce_email_before_order_table
) 创建一个全局变量,该变量仅适用于 WooCommerce 电子邮件通知
// 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->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 );
在这个答案中使用:
最近问了两个解决方案,得到了答案:
一些订单商品。仅适用于在已完成订单上发送的 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 );
可以通过应用全局变量
来替代使用is_wc_endpoint_url()
进行 WooCommerce 电子邮件通知
要确定它是否是 WooCommerce 电子邮件通知,我们可以通过钩子 (woocommerce_email_before_order_table
) 创建一个全局变量,该变量仅适用于 WooCommerce 电子邮件通知
// 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->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 );
在这个答案中使用: