В процессе разработки сайтов на WordPress часто возникает задача автоматического сохранения данных пользователей, например, при заполнении форм, создания пользовательских профилей или сбора другой информации без использования дополнительных плагинов. В этой статье мы подробно рассмотрим, как реализовать такую функциональность с помощью собственного кода, опираясь на возможности WordPress и PHP.
Почему стоит использовать собственный код для сохранения данных пользователя в WordPress
Хотя существует множество плагинов для сбора и сохранения пользовательских данных, у них бывают ограничения по гибкости, производительности и безопасности. Использование собственного кода позволяет полностью контролировать процесс, интегрировать логику в тему или собственный плагин, а также оптимизировать под конкретные задачи и сценарии.
Кроме того, отказ от сторонних плагинов снижает нагрузку на сайт и уменьшает возможные конфликты с другими компонентами.
Создание формы для сбора данных пользователя
Первым шагом будет создание HTML-формы, которая будет принимать данные от пользователя. Допустим, нам нужно получить имя, email и телефон.
<form method="post" action="">
<label for="wprobot_name">Имя:</label>
<input type="text" id="wprobot_name" name="wprobot_name" required>
<label for="wprobot_email">Email:</label>
<input type="email" id="wprobot_email" name="wprobot_email" required>
<label for="wprobot_phone">Телефон:</label>
<input type="tel" id="wprobot_phone" name="wprobot_phone">
<input type="submit" name="wprobot_submit" value="Отправить">
</form>
Такую форму можно добавить в файл темы, например, в шаблон страницы или в виджет с поддержкой HTML.
Обработка и валидация данных в WordPress
После отправки формы данные нужно обработать на сервере. В WordPress для этого идеально подойдет хук init. Создадим функцию wprobot_handle_user_data, которая проверит форму, валидирует и сохранит информацию.
add_action('init', 'wprobot_handle_user_data');
function wprobot_handle_user_data() {
if (isset($_POST['wprobot_submit'])) {
// Проверка nonce для безопасности
if (!isset($_POST['wprobot_nonce']) || !wp_verify_nonce($_POST['wprobot_nonce'], 'wprobot_save_user_data')) {
wp_die('Ошибка безопасности. Попробуйте еще раз.');
}
// Получаем и очищаем данные
$name = sanitize_text_field($_POST['wprobot_name']);
$email = sanitize_email($_POST['wprobot_email']);
$phone = sanitize_text_field($_POST['wprobot_phone']);
// Валидация email
if (!is_email($email)) {
wp_die('Введен некорректный email.');
}
// Дальше можно сохранить данные
wprobot_save_user_data($name, $email, $phone);
}
}
Обратите внимание на использование функций sanitize_text_field и sanitize_email для безопасности. Также обязательно используйте nonce для защиты от CSRF-атак. В форму нужно добавить поле nonce:
<?php wp_nonce_field('wprobot_save_user_data', 'wprobot_nonce'); ?>
Сохранение данных в пользовательские поля или таблицу
В зависимости от задачи, данные можно сохранить как мета-поля пользователя, в отдельной таблице базы данных или в виде новой записи (поста). Рассмотрим вариант сохранения в таблице wp_usermeta для зарегистрированных пользователей.
function wprobot_save_user_data($name, $email, $phone) {
// Получаем ID текущего пользователя
$user_id = get_current_user_id();
if (!$user_id) {
wp_die('Пользователь не авторизован.');
}
update_user_meta($user_id, 'wprobot_name', $name);
update_user_meta($user_id, 'wprobot_phone', $phone);
// Обновим email
wp_update_user(array(
'ID' => $user_id,
'user_email' => $email
));
// Сообщение об успехе
add_action('wp_footer', function() {
echo '<div class="notice success">Данные успешно сохранены.</div>';
});
}
Если пользователи не зарегистрированы, можно сохранять данные в отдельной таблице. Для этого создайте таблицу через хук register_activation_hook в своем плагине или вручную в базе данных.
Пример создания таблицы для хранения пользовательских данных
function wprobot_create_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wprobot_user_data';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
email varchar(100) NOT NULL,
phone varchar(20) DEFAULT '',
date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wprobot_create_table');
Чтобы сохранить данные в эту таблицу, используйте:
function wprobot_save_user_data_to_table($name, $email, $phone) {
global $wpdb;
$table_name = $wpdb->prefix . 'wprobot_user_data';
$wpdb->insert(
$table_name,
array(
'name' => $name,
'email' => $email,
'phone' => $phone,
'date' => current_time('mysql')
),
array('%s','%s','%s','%s')
);
}
Автоматическое сохранение данных с помощью AJAX
Чтобы улучшить UX, можно реализовать автосохранение данных формы без перезагрузки страницы с помощью AJAX. В WordPress для этого используются специальные хуки и скрипты.
Регистрация AJAX обработчика
add_action('wp_ajax_wprobot_save_user_data', 'wprobot_ajax_save_user_data');
add_action('wp_ajax_nopriv_wprobot_save_user_data', 'wprobot_ajax_save_user_data');
function wprobot_ajax_save_user_data() {
check_ajax_referer('wprobot_ajax_nonce', 'security');
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$phone = sanitize_text_field($_POST['phone']);
if (!is_email($email)) {
wp_send_json_error('Некорректный email');
}
// Например, сохраняем в таблицу
wprobot_save_user_data_to_table($name, $email, $phone);
wp_send_json_success('Данные сохранены');
}
Подключение скрипта и отправка AJAX запроса
function wprobot_enqueue_scripts() {
wp_enqueue_script('wprobot_ajax_script', get_template_directory_uri() . '/js/wprobot-ajax.js', array('jquery'), null, true);
wp_localize_script('wprobot_ajax_script', 'wprobot_ajax_obj', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wprobot_ajax_nonce')
));
}
add_action('wp_enqueue_scripts', 'wprobot_enqueue_scripts');
Пример JS кода для отправки данных
jQuery(document).ready(function($) {
$('#wprobot_form input').on('change', function() {
var data = {
action: 'wprobot_save_user_data',
security: wprobot_ajax_obj.nonce,
name: $('#wprobot_name').val(),
email: $('#wprobot_email').val(),
phone: $('#wprobot_phone').val()
};
$.post(wprobot_ajax_obj.ajax_url, data, function(response) {
if(response.success) {
console.log('Данные успешно сохранены');
} else {
console.log('Ошибка: ' + response.data);
}
});
});
});
Использование плагина Clearfy Pro для оптимизации и безопасности
Если вы хотите дополнительно обезопасить и оптимизировать работу с пользовательскими данными, обратите внимание на плагин Clearfy Pro. Он помогает отключать ненужные скрипты, усиливает безопасность и позволяет контролировать различные аспекты сайта, что важно при работе с пользовательскими данными.
Выводы и рекомендации по безопасности
При реализации автоматического сохранения данных пользователей без плагинов обязательно используйте следующие меры безопасности:
- Всегда проверяйте nonce для формы или AJAX запросов.
- Очищайте и валидируйте все данные с помощью встроенных функций WordPress.
- Обрабатывайте ошибки и информируйте пользователя корректно.
- Сохраняйте данные в безопасном месте, учитывая права доступа.
- Используйте HTTPS для защиты передачи данных.
Таким образом, вы получите надежную систему сбора и сохранения пользовательских данных, не перегружая сайт лишними плагинами и поддерживая максимальный контроль над процессом.