wordpress - 如果条件为真,请勿发送 Woocommerce 新客户电子邮件
问题描述
如果我使用 REST API 将新客户添加到 Woo,我需要避免发送新客户电子邮件。REST API 文档没有讨论这个问题,也没有设置可以阻止“WC_Email_Customer_New_Account”电子邮件的参数
我已经尝试了大约 10 种不同的东西,我会列出最近的
直接编辑 Woo 源代码 class-wc-emails.php。即使这样也行不通,因为当我收集用户元数据时,它仍然是空白的,只有用户 ID 和好听的名字
创建一个检查外部 API 以及是否满足条件的插件
remove_action('woocommerce_created_customer_notification', array($email_class->emails['WC_Email_Customer_New_Account'], 'trigger'));
处理插件内的所有内容,但我遇到与 1 相同的问题。
解决方案
我想我设法成功了。我的目标是通过 WooCommerce REST API(客户端点)创建用户(客户),而不是触发新帐户电子邮件。
第一个嫌疑人是woocommerce_email_enabled_customer_new_account
过滤器。它给了我们\WP_User
和\WC_Email_Customer_Completed_Order
对象。第一个想法显然是get_user_meta()
与用户竞争。
add_filter( 'woocommerce_email_enabled_customer_new_account', function( $enabled, $user, $email ) {
/**
* @var bool $enabled
* @var \WP_User $user
* @var \WC_Email_Customer_Completed_Order $email
*/
$isOurGuy = 'foobar' === get_user_meta( $user->ID, 'meta_key_is_so_meta', true );
if ( $isOurGuy ) {
return false;
}
return $enabled;
}, 10, 3 );
事实证明,REST 端点处理程序只能在创建用户后推送元数据,并且电子邮件通知是通过\WC_Emails()
. 这意味着当我们的代码在该电子邮件挂钩期间运行时,还没有可用的元数据。
接下来要检查的是在用户被推到任何地方之前的那一刻。那将是woocommerce_before_data_object_save
,这次是一个动作。它给了我们两个对象,\WC_Customer
和\WC_Customer_Data_Store
。该\WC_Customer
对象有我们的元数据,耶!让我们将现有代码封装到另一个处理程序中。
add_action( 'woocommerce_before_data_object_save', function( $customer, $store ) {
/**
* @var \WC_Customer $customer
* @var \WC_Customer_Data_Store $store
*/
if ( !( $customer instanceof \WC_Customer ) ) { // I guess other object types may end up here, let's make sure we only get to work with customers.
return;
}
$isOurGuy = 'foobar' === $customer->get_meta( 'meta_key_is_so_meta', true );
if ( !$isOurGuy ) {
return;
}
add_filter( 'woocommerce_email_enabled_customer_new_account', function( $enabled, $user, $email ) use ( $customer ) {
/**
* @var bool $enabled
* @var \WP_User $user
* @var \WC_Email_Customer_Completed_Order $email
*/
if ( $customer->get_id() !== $user->ID ) { // Is it our guy?
return $enabled;
}
return false;
}, 10, 3 );
}, 10, 2 );
它仍然不起作用。因为这是在对象保存之前$customer
,所以当我们捕获到我们的范围时,用户并不存在。所以$customer->get_id()
返回 0(零)。看来我们在时间上有点过头了——需要向前推进。woocommerce_created_customer
似乎是一个不错的候选人。它为我们提供了新的用户 ID。
让我们一起编译所有内容。
add_action( 'woocommerce_before_data_object_save', function( $customer, $store ) {
/**
* @var \WC_Customer $customer
* @var \WC_Customer_Data_Store $store
*/
if ( !( $customer instanceof \WC_Customer ) ) { // I guess other object types may end up here, let's make sure we only get to work with customers.
return;
}
$isOurGuy = 'foobar' === $customer->get_meta( 'meta_key_is_so_meta', true );
if ( !$isOurGuy ) {
return;
}
/**
* Hook into the Customer Created event to capture the new customer ID.
*/
add_action( 'woocommerce_created_customer', function( $customerId ) {
add_filter( 'woocommerce_email_enabled_customer_new_account', function( $enabled, $user, $email ) use ( $customerId ) {
/**
* @var bool $enabled
* @var \WP_User $user
* @var \WC_Email_Customer_Completed_Order $email
*/
if ( $customerId !== $user->ID ) { // Is it our guy?
return $enabled;
}
return false;
}, 10, 3 );
}, 1 ); // NB: Email is also hooked here with priority 10.
}, 10, 2 );
现在让我们回顾一下。我们连接到数据存储并捕获\WC_Customer
保存对象的那一刻。我们执行自定义的基于元数据的逻辑来决定是否继续。然后我们跳到创建用户以检索其 ID 的那一刻。然后我们在“启用电子邮件?”期间跳得更远一点。检查以实际禁用给定用户的通知。
推荐阅读
- c++ - 如何将 QDockWidgets 添加为选项卡?
- java - 当我尝试从 Zuul 代理验证 JWT 时,为什么会出现 403 被禁止?
- gitlab - 如何使用 Gitlab API 触发 Gitlab-CI 管道以获取最新标签?
- css - 在Bootstrap中将8张相同大小的卡片放在一行中
- angular - 发生未处理的异常:未在工作区中设置配置“es”
- python - 减少python中的图像通道
- python - python zipline:如何使用分钟数据导入数据包
- html - Outlook HTML 签名格式
- python - 从 Django 中的按钮获取 URL 参数
- javascript - 如何在 Typescript 中对重载函数进行命名导出?