'error', 'text' => esc_html__('Invalid email format', 'woodmart') )); } wp_die(); } /** * Send Verification Code * Generates a random code, encrypts it, stores it in a cookie, and sends it via email. */ add_action('wp_ajax_send_code', 'send_code'); add_action('wp_ajax_nopriv_send_code', 'send_code'); function send_code() { $email = sanitize_email($_POST['email']); if (!is_email($email)) { wp_die(json_encode(['status' => 'error', 'text' => 'Invalid email'])); } // Generate a random 4-digit code $code = sprintf("%04d", mt_rand(1000, 9999)); // Store code in a secure session for 5 minutes session_start(); $_SESSION['login_code'] = [ 'code' => $code, 'email' => $email, 'expires' => time() + (5 * 60) ]; session_write_close(); // Prepare email content $language = function_exists('pll_current_language') ? pll_current_language() : 'en'; if ($language === 'ru') { $subject = "Проверочный код Cosmopet - $code"; $message = "Привет, это Cosmopet.\nВаш проверочный код: $code\nДействителен 5 минут."; } else { $subject = "Cosmopet Verification Code - $code"; $message = "Hello, this is CosmoPet.\nYour verification code: $code\nValid for 5 minutes."; } // Configure email headers $headers = array( 'From: Cosmopet ', 'content-type: text/plain; charset=utf-8', 'Reply-To: pro@cosmopet.shop', ); // Send email with fallback logging $sent = wp_mail($email, $subject, $message, $headers); if ($sent) { wp_die(json_encode(['status' => 'success', 'message' => 'Code sent'])); } else { error_log("Email failed to send to $email. Error: " . json_encode(error_get_last())); wp_die(json_encode(['status' => 'error', 'text' => 'Failed to send code'])); } } /** * Check Verification Code * Validates the user-entered code, logs in or registers the user. */ add_action('wp_ajax_check_code', 'check_code'); add_action('wp_ajax_nopriv_check_code', 'check_code'); function check_code() { header("Content-Type: application/json"); $code = sanitize_text_field($_POST['code']); $email = sanitize_email($_POST['email']); session_start(); if (isset($_SESSION['login_code']) && is_array($_SESSION['login_code'])) { $stored_data = $_SESSION['login_code']; if ($stored_data['email'] === $email && $stored_data['code'] === $code && $stored_data['expires'] > time()) { // Generate a random password $password = wp_generate_password(12, true, false); if (email_exists($email)) { // Log in existing user $user = get_user_by('email', $email); wp_set_password($password, $user->ID); $login = wp_signon([ 'user_login' => $email, 'user_password' => $password, 'remember' => true ]); if (!is_wp_error($login)) { // Redirect to admin dashboard update_user_meta($user->ID, 'activated', true); wp_die(json_encode(['status' => 'success_auth', 'redirect' => admin_url()])); } } else { // Register new user $user_id = wp_create_user($email, $password, $email); if (!is_wp_error($user_id)) { wp_update_user([ 'ID' => $user_id, 'display_name' => $email ]); $login = wp_signon([ 'user_login' => $email, 'user_password' => $password, 'remember' => true ]); if (!is_wp_error($login)) { update_user_meta($user_id, 'activated', true); wp_die(json_encode(['status' => 'success_reg', 'redirect' => admin_url()])); } } } } } // Cleanup expired session data if (isset($_SESSION['login_code']) && $stored_data['expires'] <= time()) { unset($_SESSION['login_code']); } session_write_close(); wp_die(json_encode(['status' => 'error', 'text' => 'Invalid or expired code'])); } /** * Logout Redirect * Redirects to the homepage after user logout. */ add_action('wp_logout', 'logout_redirect'); function logout_redirect() { wp_redirect('/'); exit(); } // Отправка кода и проверка Email add_action( 'wp_ajax_email_activate', 'send_activation_email' ); add_action( 'wp_ajax_nopriv_email_activate', 'send_activation_email' ); function send_activation_email() { error_log(123); $user = wp_get_current_user(); $activation_key = sha1($user->user_email . time()); // Generate a unique activation key update_field('uuid', $activation_key, 'user_' . get_current_user_id()); // Save the key in user meta $activation_link = home_url("/activate/$activation_key"); if(pll_current_language() === 'ru'){ $subject = "Активация аккаунта COSMOPET -".$string; $message = " Остался последний шаг!\n Пройдите по ссылке для активации аккаунта:\n ".$activation_link; } else { $subject = "Account activation COSMOPET -".$string; $message = "Last step!\n Follow the link to activate your account\n ".$activation_link; } wp_mail($user->user_email, $subject, $message); } add_action('init', 'custom_register_activation_endpoint'); function custom_register_activation_endpoint() { add_rewrite_rule('^activate/([^/]*)/?', 'index.php?activation_key=$matches[1]', 'top'); add_rewrite_tag('%activation_key%', '([^&]+)'); } add_action('template_redirect', 'custom_handle_activation_request'); add_action('template_redirect', 'custom_handle_activation_request'); function get_user_by_acf_field_value($field_value) { // Prepare the arguments for WP_User_Query $args = array( 'meta_query' => array( array( 'key' => 'uuid', // Change to your ACF field key 'value' => $field_value, 'compare' => '=', // You can use other comparison operators if needed ), ), ); // Execute the query $user_query = new WP_User_Query($args); // Check for results if (!empty($user_query->get_results())) { return $user_query->get_results(); // Returns an array of WP_User objects } else { return null; // No users found } } function custom_handle_activation_request() { if (get_query_var('activation_key')) { $activation_key = sanitize_text_field(get_query_var('activation_key')); $users = get_user_by_acf_field_value($activation_key); if ($users) { foreach ($users as $user) { $user->set_bio(); // delete_user_meta($user->ID, 'uuid'); // Clean up the activation key update_field('uuid', '', 'user_' . $user->ID); update_field('activated', true, 'user_' . $user->ID); wp_set_auth_cookie($user->ID); wp_redirect('/my-account/'); // Redirect to the homepage or a custom page var_dump($user); exit; } } } }