在 Woocommerce 中以编程方式发送重置密码电子邮件通知 [英] Send the reset password email notifications programatically in Woocommerce

查看:79
本文介绍了在 Woocommerce 中以编程方式发送重置密码电子邮件通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在自动注册的客人在我的 woocommerce 网站上首次订购后向他们发送重置密码的电子邮件.

I would like to send the reset password email to the automatically registered guests after their first order on my woocommerce website.

这是我的钩子函数:

function wc_register_guests($order_id) {
    // get all the order data
    $order = new WC_Order($order_id);

    //get the user email from the order
    $order_email = $order->billing_email;

    // check if there are any users with the billing email as user or email
    $email = email_exists($order_email);
    $user = username_exists($order_email);

    // if the UID is null, then it's a guest checkout
    if ($user == false && $email == false) {

        $random_password = wp_generate_password();

        // create new user with email as username & newly created pw
        $user_id = wp_create_user($order_email, $random_password, $order_email);

        //WC guest customer identification
        update_user_meta($user_id, 'guest', 'yes');

        //user's billing data
        update_user_meta($user_id, 'billing_address_1', $order->billing_address_1);
        update_user_meta($user_id, 'billing_address_2', $order->billing_address_2);
        update_user_meta($user_id, 'billing_city', $order->billing_city);
        update_user_meta($user_id, 'billing_company', $order->billing_company);
        update_user_meta($user_id, 'billing_country', $order->billing_country);
        update_user_meta($user_id, 'billing_email', $order->billing_email);
        update_user_meta($user_id, 'billing_first_name', $order->billing_first_name);
        update_user_meta($user_id, 'billing_last_name', $order->billing_last_name);
        update_user_meta($user_id, 'billing_phone', $order->billing_phone);
        update_user_meta($user_id, 'billing_postcode', $order->billing_postcode);
        update_user_meta($user_id, 'billing_state', $order->billing_state);

        // user's shipping data
        update_user_meta($user_id, 'shipping_address_1', $order->shipping_address_1);
        update_user_meta($user_id, 'shipping_address_2', $order->shipping_address_2);
        update_user_meta($user_id, 'shipping_city', $order->shipping_city);
        update_user_meta($user_id, 'shipping_company', $order->shipping_company);
        update_user_meta($user_id, 'shipping_country', $order->shipping_country);
        update_user_meta($user_id, 'shipping_first_name', $order->shipping_first_name);
        update_user_meta($user_id, 'shipping_last_name', $order->shipping_last_name);
        update_user_meta($user_id, 'shipping_method', $order->shipping_method);
        update_user_meta($user_id, 'shipping_postcode', $order->shipping_postcode);
        update_user_meta($user_id, 'shipping_state', $order->shipping_state);

        wc_update_new_customer_past_orders($user_id);
    }
}
add_action('woocommerce_thankyou', 'wc_register_guests', 10, 1);

推荐答案

要从用户 ID 发送客户重置密码电子邮件通知:

To send the Customer reset password email-notification you will use from a user ID:

$user = new WP_User( intval($user_id) );
$reset_key = get_password_reset_key( $user );
$wc_emails = WC()->mailer()->get_emails();
$wc_emails['WC_Email_Customer_Reset_Password']->trigger( $user->user_login, $reset_key );

查看这个相关的源代码函数.

现在,从 Woocommerce 3+ 开始,您不能再直接获得 WC_Order 属性,而应该使用 WC_Order 可用方法...
您还应该设置客户"用户角色...

Now since Woocommerce 3+ you can't get anymore the WC_Order properties directly and instead you should use the WC_Order available methods…
Also you should set the "customer" user role…

所以我重新审视了你的代码:

So I have revisited your code a bit:

add_action('woocommerce_thankyou', 'wc_register_new_customers', 10, 1);
function wc_register_new_customers( $order_id ) {
    if(is_user_logged_in()) return; // Only for unlogged users

    // Get an instance of the WC_Order object
    $order = wc_get_order($order_id);

    // Get the customer billing email from the order
    $billing_email = $order->get_billing_email();

    // check if there are any users with the billing email as user or email
    $email = email_exists( $billing_email );
    $user = username_exists( $billing_email );

    // if the UID is null, then it's a guest checkout
    if ( $user == false && $email == false ) {

        $random_password = wp_generate_password();

        // Create new user with email as username & newly created pw
        $user_id = wp_create_user( $billing_email, $random_password, $billing_email );

        // WC guest customer identification
        update_user_meta( $user_id, 'guest', 'yes' );

        //user's billing data
        update_user_meta( $user_id, 'billing_address_1', $order->get_billing_address_1() );
        update_user_meta( $user_id, 'billing_address_2', $order->get_billing_address_2() );
        update_user_meta( $user_id, 'billing_city', $order->get_billing_city() );
        update_user_meta( $user_id, 'billing_company', $order->get_billing_company() );
        update_user_meta( $user_id, 'billing_country', $order->get_billing_country() );
        update_user_meta( $user_id, 'billing_email', $order->get_billing_email() );
        update_user_meta( $user_id, 'billing_first_name', $order->get_billing_first_name() );
        update_user_meta( $user_id, 'billing_last_name', $order->get_billing_last_name() );
        update_user_meta( $user_id, 'billing_phone', $order->get_billing_phone() );
        update_user_meta( $user_id, 'billing_postcode', $order->get_billing_postcode() );
        update_user_meta( $user_id, 'billing_state', $order->get_billing_state() );

        // user's shipping data
        update_user_meta( $user_id, 'shipping_address_1', $order->get_shipping_address_1() );
        update_user_meta( $user_id, 'shipping_address_2', $order->get_shipping_address_2() );
        update_user_meta( $user_id, 'shipping_city', $order->get_shipping_city() );
        update_user_meta( $user_id, 'shipping_company', $order->get_shipping_company() );
        update_user_meta( $user_id, 'shipping_country', $order->get_shipping_country() );
        update_user_meta( $user_id, 'shipping_first_name', $order->get_shipping_first_name() );
        update_user_meta( $user_id, 'shipping_last_name', $order->get_shipping_last_name() );
        update_user_meta( $user_id, 'shipping_method', $order->get_shipping_method() );
        update_user_meta( $user_id, 'shipping_postcode', $order->get_shipping_postcode() );
        update_user_meta( $user_id, 'shipping_state', $order->get_shipping_state() );

        // Update to "customer" user role
        update_user_meta( $user_id, 'wp_capabilities', array('customer' => true) );

        wc_update_new_customer_past_orders( $user_id );

        // Get WP_User
        $user = new WP_User( intval( $user_id ) );

        // Creates, stores, then returns a password reset key for user.
        $reset_key = get_password_reset_key( $user );

        // Send the WC_email Customer Reset Password
        $wc_emails = WC()->mailer()->get_emails();
        $wc_emails['WC_Email_Customer_Reset_Password']->trigger( $user->user_login, $reset_key );
    }
}

代码位于活动子主题(或活动主题)的 function.php 文件中.

Code goes in function.php file of your active child theme (or active theme).

经过测试并有效.

这篇关于在 Woocommerce 中以编程方式发送重置密码电子邮件通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆