You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
cosmopet-architecture/wp-content/themes/cosmopet/temp-functions/login-logic.php

238 lines
8.1 KiB

<?php
/**
* Email Validation
* Validates the format of the provided email via AJAX.
*/
add_action('wp_ajax_email_validate', 'email_validate');
add_action('wp_ajax_nopriv_email_validate', 'email_validate');
function email_validate() {
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) {
header("Content-Type: application/json");
echo json_encode(array(
'status' => '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 <pro@cosmopet.shop>',
'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;
}
}
}
}