wordpress 如果条件为真,不要发送Woocommerce新客户电子邮件

e5nszbig  于 2022-12-03  发布在  WordPress
关注(0)|答案(2)|浏览(178)

如果我使用REST API将新客户添加到Woo,我需要避免发送新客户电子邮件。REST API文档没有提到这一点,也没有设置可以阻止“WC_Email_Customer_New_Account”电子邮件的参数
我已经尝试了10种不同的方法,我将列出最近的方法

  • 直接编辑Woo源代码class-wc-emails.php。即使这样也不行,因为当我收集用户 meta时,它仍然是空白的,只有用户ID和漂亮的名称
  • 创建一个检查外部API的插件,如果满足某个条件,则执行remove_action('woocommerce_created_customer_notification', array($email_class->emails['WC_Email_Customer_New_Account'], 'trigger'));
  • 处理插件内的一切,但我有同样的问题1。
disbfnqx

disbfnqx1#

我想我成功地完成了它。我的目标是通过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 );

它仍然不起作用。因为这是 *before object保存 *,当我们将$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。然后我们在“email enabled?”检查期间再跳一点,以实际禁用给定用户的通知。

gstyhher

gstyhher2#

试试这个
请访问:
WooCommerce -〉设置-〉电子邮件选项卡
您可以找到选项是“新帐户”。单击管理按钮。
取消选中“启用此电子邮件通知”。

相关问题