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/functions.php

944 lines
31 KiB

<?php
require_once __DIR__ . '/vendor/autoload.php'; // для работы Composer пакетов (библиотек)
// Initialize Timber.
Timber\Timber::init();
/* Подключение файлов с разной бизнес-логикой */
// function require_all_temp_functions() {
// foreach (glob(__DIR__ . '/temp-functions/*.php') as $file) {
// require_once $file;
// }
// }
// require_all_temp_functions();
// require once вместо include использовать!
require_once __DIR__ . '/temp-functions/cart-logic.php';
require_once __DIR__ . '/temp-functions/timber-logic.php';
require_once __DIR__ . '/temp-functions/woocommerce-logic.php';
require_once __DIR__ . '/temp-functions/modules-logic.php';
require_once __DIR__ . '/temp-functions/ajax-logic.php';
require_once __DIR__ . '/temp-functions/shortcodes-logic.php';
add_action('init', function() {
if (function_exists('wpseo_load_textdomain')) {
wpseo_load_textdomain();
}
if (function_exists('pll_load_textdomain')) {
pll_load_textdomain();
}
}, 1);
/* Вставить в поиск по модулям */
$modules_path = get_template_directory() . '/modules/*/editor-blocks/*/editor-block-controller.php';
foreach (glob($modules_path) as $file) {
require_once $file; // Подключаем каждый найденный файл
}
// include_module('blog');
require_once('modules/blog/module-ajax-controller.php'); // !!! внутри него include_module('blog');
require_once('modules/forms/module-ajax-controller.php');
require_once('modules/shop/module-ajax-controller.php');
require_once('modules/profile/module-ajax-controller.php');
require_once('modules/footer/module-ajax-controller.php');
require_once('modules/author/module-ajax-controller.php');
add_action('wp', 'my_custom_checkout_code');
function my_custom_checkout_code() {
if (function_exists('is_checkout') && is_checkout() && !is_order_received_page()) {
include_component('shop', 'checkout');
}
}
include_module('forms');
include_module('layout');
// include_module('forms');
// include_module('shop');
// include_module('profile');
// include_module('footer');
// include_module('author');
// include_module('layout');
class WooProduct extends Timber\Post {
protected $wc_product;
public function __construct ($pid = null) {
parent::__construct($pid);
$this->wc_product = wc_get_product($this->ID);
}
public function price() {
return $this->wc_product->get_price();
}
public function get_price_html() {
return $this->wc_product->get_price_html();
}
public function get_attr() {
return $this->wc_product->get_attribute('pa_compound');
}
public function get_test() {
return 'test';
}
};
add_filter('timber/post/classmap', function ($classmap) {
$custom_classmap = [
'product' => WooProduct::class,
];
return array_merge($classmap, $custom_classmap);
});
//Ajax подгрузка товаров в архиве
add_action( 'wp_ajax_nopriv_get_products', 'get_products' );
add_action( 'wp_ajax_get_products', 'get_products' );
function get_products() {
global $post;
if (function_exists('WC')) {
WC();
}
// Потом Timber
$context = Timber::context();
$context['get_page'] = empty($_POST['get_page']) ? 1 : $_POST['get_page'];
$context['criteria_for_new_product'] = date('Y-m-d', strtotime('-30 days'));
$context['get_category'] = isset($_POST['get_category']) ? $_POST['get_category'] : NULL;
$context['get_category_type'] = isset($_POST['get_category_type']) ? $_POST['get_category_type'] : NULL;
// Задаем количество постов для подзагрузки Ajax
$posts_per_page = 12;
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => $posts_per_page,
'paged' => $context['get_page'],
'has_password' => FALSE
);
$count_args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'has_password' => FALSE
);
if ($context['get_category'] != NULL) {
$categories = [
'tax_query' => array(
array(
'taxonomy' => $context['get_category_type'],
'field' => 'term_id',
'terms' => array($context['get_category']),
'operator' => 'IN'
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => 'exclude-from-catalog',
'operator' => 'NOT IN'
)
)
];
$args = array_merge($args, $categories);
$count_args = array_merge($count_args, $categories);
}
$products = new WP_Query($args);
$products = new Timber\PostQuery($products, 'Timber\Integrations\WooCommerce\Product');
$context['posts'] = $products;
$context['count'] = count(Timber::get_posts($count_args));
if ($context['count'] <= $context['get_page'] * $posts_per_page) {
$context['ended'] = true;
}
Timber::render( 'woocommerce/archive-product/archive-product-ajaxload.twig', $context );
die();
}
function get_product_info ($id, $type) {
if (!$id) {
return '';
}
$product = wc_get_product($id);
if (!$product) {
return '';
}
if ($type == 'price') {
return $product->get_price();
} elseif ($type == 'weight') {
return $product->get_weight() ? $product->get_weight() . ' кг' : '';
}
return '';
}
function get_add_to_cart_button ($id) {
$product = wc_get_product( $id );
return '<a href="'. $product->add_to_cart_url(). '" value="'. esc_attr( $product->get_id() ) .'"
class="ajax_add_to_cart add_to_cart_button button button--gradient button--base button--100-perc" data-product_id="'. $id .'">'. pll__('Добавить в корзину') .'</a>';
}
function get_collection_siblings ($term) {
if (!$term) {
return [];
}
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'order' => 'ASC',
'order_by' => 'name',
'tax_query' => [
[
'taxonomy' => 'pa_collection',
'terms' => $term,
'field' => 'id',
]
],
);
$siblings = get_posts($args);
$sibl_arr = [];
foreach( $siblings as $sibling ) {
$sibl_arr [] = $sibling;
}
return $sibl_arr;
}
register_sidebar( array(
'name' => 'Сайдбар для фильтров товаров',
'id' => 'sidebar_filters',
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
) );
/**
* 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();
}
add_filter( 'woocommerce_price_trim_zeros', '__return_true' );
function add_comment_like() {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$wpdb->show_errors();
if (!is_user_logged_in()) {
wp_send_json_error('Необходимо авторизоваться');
die();
}
$comment_id = isset($_POST['comment_id']) ? intval($_POST['comment_id']) : 0;
$user_id = get_current_user_id();
if ($comment_id) {
$comment_exists = get_comment($comment_id);
if (!$comment_exists) {
echo '0';
die();
}
$existing_like = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d AND user_id = %d",
$comment_id, $user_id
));
if (!$existing_like) {
$result = $wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'comment_id' => $comment_id,
'date_added' => current_time('mysql')
),
array('%d', '%d', '%s')
);
} else {
$result = $wpdb->delete(
$table_name,
array(
'user_id' => $user_id,
'comment_id' => $comment_id
),
array('%d', '%d')
);
}
$likes = get_comment_likes_count($comment_id);
wp_send_json(array(
'count' => $likes,
'is_liked' => !$existing_like
));
} else {
wp_send_json(array('count' => 0, 'is_liked' => false));
}
die();
}
add_action('wp_ajax_add_comment_like', 'add_comment_like');
function add_post_like() {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
if (!is_user_logged_in()) {
wp_send_json_error('Необходимо авторизоваться');
die();
}
$post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
$user_id = get_current_user_id();
if ($post_id) {
$existing_like = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d AND user_id = %d",
$post_id, $user_id
));
if (!$existing_like) {
$wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'post_id' => $post_id,
'date_added' => current_time('mysql')
),
array('%d', '%d', '%s')
);
} else {
$wpdb->delete(
$table_name,
array(
'user_id' => $user_id,
'post_id' => $post_id
),
array('%d', '%d')
);
}
$likes = get_post_likes_count($post_id);
wp_send_json(array(
'count' => $likes,
'is_liked' => !$existing_like
));
}
die();
}
add_action('wp_ajax_add_post_like', 'add_post_like');
function check_user_likes() {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
if (!is_user_logged_in()) {
wp_send_json_error('Необходимо авторизоваться');
die();
}
$user_id = get_current_user_id();
$liked_posts = $wpdb->get_col($wpdb->prepare(
"SELECT post_id FROM $table_name WHERE user_id = %d AND post_id > 0",
$user_id
));
$liked_comments = $wpdb->get_col($wpdb->prepare(
"SELECT comment_id FROM $table_name WHERE user_id = %d AND comment_id > 0",
$user_id
));
$response = array(
'posts' => $liked_posts,
'comments' => $liked_comments
);
echo json_encode($response);
die();
}
add_action('wp_ajax_check_user_likes', 'check_user_likes');
function get_post_likes_count($post_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d",
$post_id
));
return $count ? $count : 0;
}
function get_comment_likes_count($comment_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d",
$comment_id
));
return $count ? $count : 0;
}
function is_user_liked_post($post_id) {
if (!is_user_logged_in()) {
return false;
}
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$user_id = get_current_user_id();
$result = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE post_id = %d AND user_id = %d",
$post_id, $user_id
));
return $result > 0;
}
function is_user_liked_comment($comment_id) {
if (!is_user_logged_in()) {
return false;
}
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$user_id = get_current_user_id();
$result = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE comment_id = %d AND user_id = %d",
$comment_id, $user_id
));
return $result > 0;
}
add_filter('comment_form_logged_in', '__return_empty_string');
// Создание таблицы
function create_likes_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'cosmopet_likes';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
post_id bigint(20) DEFAULT '0',
comment_id bigint(20) DEFAULT '0',
date_added datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY post_id (post_id),
KEY comment_id (comment_id),
KEY user_id (user_id),
UNIQUE KEY user_post (user_id, post_id, comment_id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
add_action('after_switch_theme', 'create_likes_table');
add_filter('woocommerce_product_data_tabs', function($tabs) {
$tabs['composition_tab'] = array(
'label' => 'Состав',
'target' => 'composition_product_data',
'class' => array('composition_tab'),
'priority' => 60,
);
$tabs['feeding_tab'] = array(
'label' => 'Рекомендации по кормлению',
'target' => 'feeding_product_data',
'class' => array('feeding_tab'),
'priority' => 61,
);
$tabs['important_tab'] = array(
'label' => 'Важно',
'target' => 'important_product_data',
'class' => array('important_tab'),
'priority' => 62,
);
return $tabs;
});
add_action('woocommerce_product_data_panels', function() {
global $post;
$composition = get_post_meta($post->ID, '_composition', true);
echo '<div id="composition_product_data" class="panel woocommerce_options_panel">';
woocommerce_wp_textarea_input([
'id' => '_composition',
'label' => 'Состав',
'desc_tip' => true,
'description' => 'Введите состав товара',
'value' => $composition
]);
echo '</div>';
});
add_action('woocommerce_product_data_panels', function() {
global $post;
$feeding = get_post_meta($post->ID, '_feeding_recommendations', true);
echo '<div id="feeding_product_data" class="panel woocommerce_options_panel">';
woocommerce_wp_textarea_input([
'id' => '_feeding_recommendations',
'label' => 'Рекомендации по кормлению',
'desc_tip' => true,
'description' => 'Введите рекомендации по кормлению',
'value' => $feeding
]);
echo '</div>';
});
add_action('woocommerce_product_data_panels', function() {
global $post;
$important = get_post_meta($post->ID, '_important', true);
echo '<div id="important_product_data" class="panel woocommerce_options_panel">';
woocommerce_wp_textarea_input([
'id' => '_important',
'label' => 'Важно',
'desc_tip' => true,
'description' => 'Введите важную информацию',
'value' => $important
]);
echo '</div>';
});
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['_composition'])) {
update_post_meta($post_id, '_composition', sanitize_textarea_field($_POST['_composition']));
}
if (isset($_POST['_feeding_recommendations'])) {
update_post_meta($post_id, '_feeding_recommendations', sanitize_textarea_field($_POST['_feeding_recommendations']));
}
if (isset($_POST['_important'])) {
update_post_meta($post_id, '_important', sanitize_textarea_field($_POST['_important']));
}
});
// Добавление поля для выбора рекомендуемых товаров
function register_recommended_products_acf_field() {
if (function_exists('acf_add_local_field_group')) {
acf_add_local_field_group(array(
'key' => 'group_recommended_products',
'title' => 'Рекомендуемые товары',
'fields' => array(
array(
'key' => 'field_recommended_products',
'label' => 'Выберите рекомендуемые товары',
'name' => 'recommended_products',
'type' => 'relationship',
'instructions' => 'Выберите товары, которые будут отображаться в секции "вашему питомцу может понравиться"',
'required' => 0,
'conditional_logic' => 0,
'post_type' => array(
0 => 'product',
),
'filters' => array(
0 => 'search',
1 => 'taxonomy',
),
'return_format' => 'object',
'min' => '',
'max' => 8,
),
),
'location' => array(
array(
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'product',
),
),
),
'menu_order' => 0,
'position' => 'normal',
'style' => 'default',
'label_placement' => 'top',
'instruction_placement' => 'label',
'hide_on_screen' => '',
));
}
}
add_action('acf/init', 'register_recommended_products_acf_field');
add_action('wp_footer', 'remove_view_cart_button_js');
function remove_view_cart_button_js() {
?>
<script>
jQuery(document).ready(function($) {
$(document).on('added_to_cart', function() {
$('.added_to_cart.wc-forward').remove();
});
});
</script>
<?php
}
// Для кнопки "Применить фильтр"
add_filter('wbw_filter_submit_button_text', 'change_wbw_filter_button_text');
function change_wbw_filter_button_text($text) {
return 'Ваш текст'; // Например, "Фильтровать" или "Поиск"
}
// Для кнопки сброса (если есть)
add_filter('wbw_filter_reset_button_text', 'change_wbw_reset_button_text');
function change_wbw_reset_button_text($text) {
return 'Сбросить';
}
add_action('wp_ajax_get_cart_fragment', 'get_cart_fragment_callback');
add_action('wp_ajax_nopriv_get_cart_fragment', 'get_cart_fragment_callback');
function get_cart_fragment_callback() {
// Проверяем nonce для безопасности
check_ajax_referer('woocommerce-cart', 'security', false);
// Получаем содержимое корзины
ob_start();
wc_get_template('shop/cart-contents.twig', [], '', get_template_directory() . '/templates/');
$contents = ob_get_clean();
// Получаем футер корзины
ob_start();
wc_get_template('modal-basket-footer.twig', [], '', get_template_directory() . '/templates/');
$footer = ob_get_clean();
// Получаем данные корзины
$cart = WC()->cart;
$count = $cart->get_cart_contents_count();
$total = $cart->get_total('raw'); // Числовая сумма
$total_html = wc_cart_totals_order_total_html(); // Форматированная сумма
wp_send_json_success([
'contents' => $contents,
'footer' => $footer,
'count' => $count,
'total' => $total_html,
'total_raw' => $total
]);
}
add_action('template_redirect', 'custom_redirect_cart_page');
function custom_redirect_cart_page() {
if (is_cart()) {
wp_redirect(home_url('/'));
exit;
}
}
add_action('wp_enqueue_scripts', 'remove_woocommerce_styles_on_checkout', 9999);
function remove_woocommerce_styles_on_checkout() {
// Проверяем, что мы на странице чекаута
if (function_exists('is_checkout') && is_checkout() && !is_order_received_page()) {
wp_deregister_style('woocommerce-layout');
wp_deregister_style('woocommerce-smallscreen');
wp_deregister_style('woocommerce-general');
// Дополнительно: отключить другие стили WooCommerce
wp_dequeue_style('select2');
wp_deregister_style('select2');
}
}
// Добавляем hreflang теги для cosmopet.shop
add_action('wp_head', 'custom_hreflang_shop', 6);
function custom_hreflang_shop() {
if (!is_admin() && function_exists('pll_get_post') && function_exists('pll_languages_list')) {
// Защищаем от дублирования
static $hreflang_added = false;
if ($hreflang_added) {
return;
}
$hreflang_added = true;
// Домены для языков
$ru_domain = 'https://cosmopet-test-ru.cp.good-production.xyz';
$en_domain = 'https://cosmopet-test-ae.cp.good-production.xyz';
// Текущий пост/страница
$current_post_id = get_the_ID();
if (!$current_post_id) {
// Для случаев, когда get_the_ID() не работает (например, архивы)
$current_path = trailingslashit($_SERVER['REQUEST_URI']);
$query_string = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '';
$ru_url = $ru_domain . $current_path . $query_string;
$en_url = $en_domain . $current_path . $query_string;
} else {
// Получаем переводы поста/страницы
$ru_post_id = pll_get_post($current_post_id, 'ru');
$en_post_id = pll_get_post($current_post_id, 'en');
// Формируем URL с учетом перевода и параметров запроса
$query_string = $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '';
$ru_url = $ru_post_id ? get_permalink($ru_post_id) . $query_string : $ru_domain . trailingslashit($_SERVER['REQUEST_URI']) . $query_string;
$en_url = $en_post_id ? get_permalink($en_post_id) . $query_string : $en_domain . trailingslashit($_SERVER['REQUEST_URI']) . $query_string;
}
// Выводим hreflang-теги
echo '<link rel="alternate" hreflang="ru-RU" href="' . esc_url($ru_url) . '" />' . "\n";
echo '<link rel="alternate" hreflang="en-AE" href="' . esc_url($en_url) . '" />' . "\n";
}
}
add_action('wp_head', 'custom_checkout_padding');
function custom_checkout_padding() {
// Проверяем, что это страница Checkout
if (is_checkout() && !is_admin()) {
?>
<style type="text/css">
main.wrapper {
padding-top: 100px;
padding-bottom: 50px;
}
</style>
<?php
}
}
// Отправка кода и проверка 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;
}
}
}
}