wordpress - 如果条件为真,请勿向 Woocommerce 发送新客户电子邮件

标签 wordpress rest api 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() 中的 Hook 隐式触发的。这意味着当我们的代码在该电子邮件 Hook 期间运行时,还没有可用的元数据。

接下来要检查的是转到用户被推到任何地方之前的那一刻。这将是 woocommerce_before_data_object_save,这次是一个 Action 。它为我们提供了两个对象,\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 的那一刻。然后我们在“启用电子邮件”期间跳得更远一点?检查以实际禁用给定用户的通知。

关于wordpress - 如果条件为真,请勿向 Woocommerce 发送新客户电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51505663/

相关文章:

wordpress - 在 WordPress Gutenberg Block Plugin 中包含图像 Assets

android - 是否有可用的 Android 设备代号 + 品牌名称的列表或 API?

wordpress - 如何从 WooCommerce 购物车中删除 Shipping?

wordpress - 解析 header X-XSS-Protection : 1; Over SSL 时出错

jquery - 如何将由 ajax HTTP POST 创建的资源的 ID 返回给客户端

javascript - Ajax、重定向和删除

java - 使用 Hibernate 从数据库检索列表时出现 ClassCastException

api - 如何在 Azure APIM 中获取 API 的订阅者 ID?

api - 使用 Facebook Connect 登录/创建帐户时,如何使用我自己网站的 API 进行身份验证?

html - 将填充应用于通过 WordPress 创建的 div 时出现问题