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