В этом уроке разберём, как обрабатывать данные, отправленные из формы на фронтенде WordPress, и сохранять их в базу данных как запись кастомного типа (Custom Post Type). Мы создадим обработчик формы, добавим базовую защиту, запишем данные в таблицу постов через wp_insert_post() и сохраним дополнительные поля в метабоксы через update_post_meta().
Проверка данных и авторизации пользователя
Первое, что нужно сделать перед обработкой данных — убедиться, что форма действительно была отправлена и что пользователь авторизован. Для этого в шаблоне, где расположена форма, прописываем проверку:
if ( isset($_POST['action']) && is_user_logged_in() ) {
// Обработка данных
}
Это базовая защита, предотвращающая несанкционированные попытки отправки формы неавторизованными пользователями.
Проверка безопасности через Nonce
В форме мы заранее создавали скрытое поле wp_nonce_field(), которое WordPress использует для проверки подлинности запроса. Теперь нужно добавить проверку на серверной стороне:
if ( ! wp_verify_nonce( $_POST['add_property_nonce'], 'add_property_action' ) ) {
wp_die('Ошибка безопасности: неверный токен формы.');
}
Эта строка предотвращает подделку запроса (CSRF) и гарантирует, что данные отправлены именно с вашего сайта.
Формирование массива данных для wp_insert_post
Теперь создаём массив с минимально необходимыми данными для новой записи. Это:
post_title— заголовок;post_content— описание;post_type— тип записи (наш CPT, напримерproperty);post_author— ID пользователя, который отправил форму;post_status— статус публикации.
$current_user = wp_get_current_user();
$new_post = [
'post_title' => sanitize_text_field($_POST['property_title']),
'post_content' => sanitize_textarea_field($_POST['property_description']),
'post_type' => 'property',
'post_author' => $current_user->ID,
'post_status' => 'pending', // Ожидает модерации
];
Используем sanitize_text_field() и sanitize_textarea_field() для защиты от внедрения вредоносного HTML или JavaScript.
Добавление записи в базу данных
Добавляем новую запись с помощью стандартной функции WordPress:
$property_id = wp_insert_post($new_post);
Если всё прошло успешно, функция вернёт ID новой записи. Мы можем проверить это:
if ( $property_id && $property_id > 0 ) {
// Пост успешно добавлен
}
Сохранение данных метабоксов
После создания поста можно обновить его дополнительные поля (метаданные). Для этого используем функцию update_post_meta().
if ( $property_id > 0 ) {
if ( !empty($_POST['property_type']) ) {
update_post_meta($property_id, 'property_type', sanitize_text_field($_POST['property_type']));
}
if ( !empty($_POST['property_price']) ) {
update_post_meta($property_id, 'property_price', intval($_POST['property_price']));
}
if ( !empty($_POST['property_period']) ) {
update_post_meta($property_id, 'property_period', sanitize_text_field($_POST['property_period']));
}
if ( !empty($_POST['property_agent']) && $_POST['property_agent'] !== 'disabled' ) {
update_post_meta($property_id, 'property_agent', intval($_POST['property_agent']));
}
}
Такой подход позволяет динамически обновлять все нужные поля, если они были заполнены в форме.
Дополнительные рекомендации
- Статус публикации.
Использованиеpost_status => 'pending'позволяет администратору проверить контент перед публикацией. Это особенно важно, если форма доступна всем авторизованным пользователям. - Система уведомлений.
Можно добавить всплывающее сообщение или перенаправление после успешной отправки:wp_redirect( add_query_arg( 'status', 'success', get_permalink() ) ); exit; - Валидация данных.
Перед сохранением можно проверять корректность введённых значений, например, что цена — число, а описание не пустое. - Обработка файлов.
Если форма предусматривает загрузку изображений, их можно прикрепить к созданному посту черезmedia_handle_upload().
Результат
Теперь форма на фронтенде WordPress полностью функциональна:
- Пользователь вводит данные и отправляет их.
- Сервер проверяет авторизацию и nonce.
wp_insert_post()создаёт новую запись в базе.update_post_meta()сохраняет все дополнительные поля.- Администратор видит новый пост в статусе “Ожидает модерации” (pending).