Диагностика задачи: зачем нужно логирование входов в WordPress
Система логирования входов в WordPress помогает отслеживать попытки авторизации пользователей, выявлять подозрительную активность и анализировать поведение на сайте. Встроенных функций для детального логирования нет, и многие используют плагины. Но для контроля без сторонних расширений можно реализовать простое логирование через код. Это особенно актуально, если плагинов в проекте много, и вы хотите минимизировать нагрузку.
Пошаговое решение: добавляем собственное логирование событий входа
1. Подключение хука для отслеживания успешной авторизации
WordPress предоставляет хук wp_login, который срабатывает после успешного входа пользователя. Используем его для записи данных в отдельную таблицу базы данных.
function custom_login_log($user_login, $user) {
global $wpdb;
$table = $wpdb->prefix . 'login_log';
$time = current_time('mysql');
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$wpdb->insert(
$table,
[
'user_login' => $user_login,
'user_id' => $user->ID,
'login_time' => $time,
'ip_address' => $ip
]
);
}
add_action('wp_login', 'custom_login_log', 10, 2);2. Создание таблицы для хранения логов
Для хранения данных создадим таблицу при активации темы или плагина. Если вы добавляете код в functions.php, запустите этот код один раз вручную или через активацию темы.
function create_login_log_table() {
global $wpdb;
$table = $wpdb->prefix . 'login_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
user_login VARCHAR(60) NOT NULL,
user_id BIGINT(20) UNSIGNED NOT NULL,
login_time DATETIME NOT NULL,
ip_address VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY login_time (login_time)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_login_log_table');3. Добавление страницы в админку для просмотра логов
Чтобы анализировать логи, создадим страницу в админке с таблицей последних входов.
function add_login_log_menu() {
add_menu_page(
'Логи входа',
'Логи входа',
'manage_options',
'login-log',
'render_login_log_page',
'dashicons-admin-users',
80
);
}
add_action('admin_menu', 'add_login_log_menu');
function render_login_log_page() {
global $wpdb;
$table = $wpdb->prefix . 'login_log';
$logs = $wpdb->get_results("SELECT * FROM $table ORDER BY login_time DESC LIMIT 100");
echo '<h1>Последние 100 входов</h1>';
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>ID</th><th>Логин</th><th>ID пользователя</th><th>Время входа</th><th>IP адрес</th></tr></thead>';
echo '<tbody>';
if ($logs) {
foreach ($logs as $log) {
echo '<tr>';
echo '<td>' . esc_html($log->id) . '</td>';
echo '<td>' . esc_html($log->user_login) . '</td>';
echo '<td>' . esc_html($log->user_id) . '</td>';
echo '<td>' . esc_html($log->login_time) . '</td>';
echo '<td>' . esc_html($log->ip_address) . '</td>';
echo '</tr>';
}
} else {
echo '<tr><td colspan="5">Логов не найдено</td></tr>';
}
echo '</tbody></table>';
}Проверка результата после внедрения
1. Войдите на сайт под разными пользователями.
2. Зайдите в админ-панель → "Логи входа" (Меню > Логи входа).
3. Убедитесь, что отображаются свежие записи с корректными логинами, ID, временем и IP.
4. Для дополнительной проверки запросите данные напрямую из базы (через phpMyAdmin или командной строкой):
SELECT * FROM wp_login_log ORDER BY login_time DESC LIMIT 5;Частые ошибки и как их исправить
- Таблица не создаётся: проверьте, что
register_activation_hookвызывается в плагине, а не в теме. Для темы таблицу создайте отдельным скриптом или временно вызовите функцию вручную. - Ошибки доступа к базе: убедитесь, что глобальная переменная
$wpdbподключена и используется корректно. - Неправильный IP адрес: в некоторых случаях
$_SERVER['REMOTE_ADDR']может содержать IP прокси; для реального IP используйте дополнительные проверки, например,HTTP_X_FORWARDED_FOR. - Отсутствие доступа к странице логов: проверьте права пользователя, страница доступна только администраторам (capability
manage_options).
Практические советы по безопасности и производительности
- Регулярно очищайте таблицу логов, чтобы избежать роста базы. Добавьте CRON-задачу для удаления старых записей, например старше 1 года.
- Не храните пароли или другие чувствительные данные в логах.
- Ограничьте доступ к админке для просмотра логов только доверенным администраторам.
- Для повышения производительности используйте индексы в таблице по полям
user_idиlogin_time.
Сравнение вариантов реализации логирования
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Готовые плагины (например, WP Activity Log) | Готовое решение, удобный интерфейс, дополнительные функции (уведомления) | Нагрузка на сайт, возможные конфликты, платные версии | Использовать на больших проектах с нуждой в расширенном аудите |
| Собственный код с таблицей в базе | Минимальная нагрузка, контроль, гибкость | Требует разработки, нет интерфейса по умолчанию | Добавить простую админ-страницу, как в примере |
| Логирование в файл | Простота, не нагружает базу | Трудности с анализом, безопасность доступа к файлам | Использовать для временного аудита или отладки |