parent
b4afa6279a
commit
a62fe7a812
@ -0,0 +1,202 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
|
||||||
|
// Динамическое определение BOT_USERNAME |
||||||
|
$site_url = site_url(); |
||||||
|
if ($site_url === 'https://cosmopet-test-ru.cp.good-production.xyz') { |
||||||
|
define('BOT_USERNAME', 'cosmopet_test_RU_bot'); |
||||||
|
} elseif ($site_url === 'https://cosmopet-test-ae.cp.good-production.xyz') { |
||||||
|
define('BOT_USERNAME', 'cosmopet_test_AE_bot'); |
||||||
|
} else { |
||||||
|
define('BOT_USERNAME', 'cosmopet_test_default_bot'); // Фallback на случай других доменов |
||||||
|
} |
||||||
|
|
||||||
|
// Функция получения данных Telegram |
||||||
|
function getTelegramUserData() { |
||||||
|
if (isset($_SESSION['tg_user'])) { |
||||||
|
return $_SESSION['tg_user']; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
// Функция вывода Telegram Widget |
||||||
|
function tgWidget() { |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
|
||||||
|
?> |
||||||
|
<div id="telegram-widget-container"></div> |
||||||
|
<?php |
||||||
|
} else { |
||||||
|
$current_user = wp_get_current_user(); |
||||||
|
echo "<h1>Hello, " . esc_html($current_user->display_name) . "!</h1>"; |
||||||
|
echo "<p><a href='" . wp_logout_url() . "'>Log out</a></p>"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function tgScript(){ |
||||||
|
$bot_username = BOT_USERNAME; |
||||||
|
?> |
||||||
|
|
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
var s = document.createElement('script'); |
||||||
|
s.src = 'https://telegram.org/js/telegram-widget.js?2'; |
||||||
|
s.async = true; |
||||||
|
s.setAttribute('data-telegram-login', '<?php echo $bot_username?>');
|
||||||
|
s.setAttribute('data-size', 'large'); |
||||||
|
s.setAttribute('data-onauth', 'onTelegramAuth(user)'); |
||||||
|
s.setAttribute('data-request-access', 'write'); |
||||||
|
document.getElementById('telegram-widget-container').appendChild(s); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
|
||||||
|
// Обработчик авторизации через Telegram |
||||||
|
add_action('wp_ajax_ontelegramauth', 'onTelegramAuth'); |
||||||
|
add_action('wp_ajax_nopriv_ontelegramauth', 'onTelegramAuth'); |
||||||
|
|
||||||
|
function onTelegramAuth() { |
||||||
|
// Получаем данные от Telegram |
||||||
|
$auth_data = [ |
||||||
|
'id' => sanitize_text_field($_POST['userid']), |
||||||
|
'first_name' => sanitize_text_field($_POST['fname']), |
||||||
|
'last_name' => sanitize_text_field($_POST['lname']), |
||||||
|
'username' => sanitize_text_field($_POST['username'] ?? ''), |
||||||
|
]; |
||||||
|
|
||||||
|
if (!$auth_data['id']) { |
||||||
|
wp_die(json_encode(['status' => 'error', 'message' => 'Invalid Telegram data'])); |
||||||
|
} |
||||||
|
|
||||||
|
// Проверяем существование пользователя по tg_account |
||||||
|
$users = get_users([ |
||||||
|
'meta_key' => 'tg_account', |
||||||
|
'meta_value' => $auth_data['id'], |
||||||
|
'number' => 1 |
||||||
|
]); |
||||||
|
|
||||||
|
$password = wp_generate_password(12, true, false); // Генерация безопасного пароля |
||||||
|
|
||||||
|
if ($users) { |
||||||
|
// Существующий пользователь |
||||||
|
$user = $users[0]; |
||||||
|
wp_set_password($password, $user->ID); |
||||||
|
$login = wp_signon([ |
||||||
|
'user_login' => $user->user_login, |
||||||
|
'user_password' => $password, |
||||||
|
'remember' => true |
||||||
|
]); |
||||||
|
|
||||||
|
if (!is_wp_error($login)) { |
||||||
|
session_start(); |
||||||
|
$_SESSION['tg_user'] = $auth_data; |
||||||
|
session_write_close(); |
||||||
|
wp_die(json_encode(['status' => 'success', 'redirect' => admin_url()])); |
||||||
|
} |
||||||
|
} else { |
||||||
|
// Новый пользователь |
||||||
|
$username = sanitize_user($auth_data['username'] ?: $auth_data['first_name'] . '_' . $auth_data['last_name'], true); |
||||||
|
$username = wp_slash($username); // Экранируем для безопасности |
||||||
|
$user_id = wp_create_user($username, $password, $username . '@telegram.com'); |
||||||
|
|
||||||
|
if (!is_wp_error($user_id)) { |
||||||
|
wp_update_user([ |
||||||
|
'ID' => $user_id, |
||||||
|
'display_name' => $auth_data['first_name'] . ' ' . $auth_data['last_name'], |
||||||
|
'first_name' => $auth_data['first_name'], |
||||||
|
'last_name' => $auth_data['last_name'] |
||||||
|
]); |
||||||
|
add_user_meta($user_id, 'tg_account', $auth_data['id']); |
||||||
|
add_user_meta($user_id, 'tg_username', $auth_data['username']); |
||||||
|
|
||||||
|
$login = wp_signon([ |
||||||
|
'user_login' => $username, |
||||||
|
'user_password' => $password, |
||||||
|
'remember' => true |
||||||
|
]); |
||||||
|
|
||||||
|
if (!is_wp_error($login)) { |
||||||
|
session_start(); |
||||||
|
$_SESSION['tg_user'] = $auth_data; |
||||||
|
session_write_close(); |
||||||
|
wp_die(json_encode(['status' => 'success', 'redirect' => admin_url()])); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
wp_die(json_encode(['status' => 'error', 'message' => 'Login failed'])); |
||||||
|
} |
||||||
|
|
||||||
|
// Функция привязки Telegram к существующему пользователю |
||||||
|
add_action('wp_ajax_linktelegram', 'linkTelegram'); |
||||||
|
add_action('wp_ajax_nopriv_linktelegram', 'linkTelegram'); |
||||||
|
|
||||||
|
function linkTelegram() { |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
wp_die(json_encode(['status' => 'error', 'message' => 'Not logged in'])); |
||||||
|
} |
||||||
|
|
||||||
|
$tg_id = sanitize_text_field($_POST['userid']); |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
|
||||||
|
add_user_meta($user_id, 'tg_account', $tg_id); |
||||||
|
wp_update_user([ |
||||||
|
'ID' => $user_id, |
||||||
|
'first_name' => sanitize_text_field($_POST['fname']), |
||||||
|
'last_name' => sanitize_text_field($_POST['lname']) |
||||||
|
]); |
||||||
|
|
||||||
|
wp_die(json_encode(['status' => 'success'])); |
||||||
|
} |
||||||
|
|
||||||
|
// Функция обновления email |
||||||
|
add_action('wp_ajax_email_link', 'emailLink'); |
||||||
|
add_action('wp_ajax_nopriv_email_link', 'emailLink'); |
||||||
|
|
||||||
|
function emailLink() { |
||||||
|
if (!is_user_logged_in()) { |
||||||
|
wp_die(json_encode(['status' => 'error', 'message' => 'Not logged in'])); |
||||||
|
} |
||||||
|
|
||||||
|
$email = sanitize_email($_POST['email']); |
||||||
|
$user_id = get_current_user_id(); |
||||||
|
|
||||||
|
if (email_exists($email)) { |
||||||
|
wp_die(json_encode(['status' => 'error', 'message' => 'Email is already registered'])); |
||||||
|
} |
||||||
|
|
||||||
|
wp_update_user(['ID' => $user_id, 'user_email' => $email]); |
||||||
|
wp_die(json_encode(['status' => 'success'])); |
||||||
|
} |
||||||
|
|
||||||
|
// Добавление и настройка колонки Telegram |
||||||
|
add_filter('manage_users_columns', 'add_tg_account_column'); |
||||||
|
function add_tg_account_column($columns) { |
||||||
|
$columns['tg_username'] = 'Telegram'; |
||||||
|
return $columns; |
||||||
|
} |
||||||
|
|
||||||
|
add_action('manage_users_custom_column', 'add_tg_account_column_content', 10, 3); |
||||||
|
function add_tg_account_column_content($value, $column_name, $user_id) { |
||||||
|
if ('tg_username' == $column_name) { |
||||||
|
$tg_username = get_user_meta($user_id, 'tg_username', true); |
||||||
|
return $tg_username ? '<a href="https://t.me/' . esc_attr($tg_username) . '" target="_blank">@' . esc_html($tg_username) . '</a>' : '<span style="color:#ccc;">не указан</span>'; |
||||||
|
} |
||||||
|
return $value; |
||||||
|
} |
||||||
|
|
||||||
|
add_filter('manage_users_sortable_columns', 'make_tg_account_column_sortable'); |
||||||
|
function make_tg_account_column_sortable($columns) { |
||||||
|
$columns['tg_username'] = 'tg_username'; |
||||||
|
return $columns; |
||||||
|
} |
||||||
|
|
||||||
|
add_action('pre_get_users', 'handle_tg_account_sorting'); |
||||||
|
function handle_tg_account_sorting($query) { |
||||||
|
if (!is_admin() || !$query->is_main_query()) return; |
||||||
|
if ('tg_username' === $query->get('orderby')) { |
||||||
|
$query->set('meta_key', 'tg_username'); |
||||||
|
$query->set('orderby', 'meta_value'); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue