Продолжаем разрабатывать функционал добавления пользовательских записей Custom Post Type с фронтенда WordPress. В предыдущем уроке мы создали базовую форму и подключили шаблон страницы. Теперь улучшим форму, добавив в неё метабоксы, поля для выбора агента, цену, период, а также реализуем базовую защиту от неавторизованных пользователей и подделки запросов.
Создание дополнительных полей формы (Metaboxes)
На первом этапе мы добавляем дополнительные поля для пользовательского типа записи — например, тип недвижимости, цена, период, агент и другие характеристики.
Чтобы не писать однотипные элементы несколько раз, удобнее вынести общие части в переменные или отдельные функции. Это не только ускоряет разработку, но и делает код чище и понятнее.
Пример структуры Metabox
Для каждого поля мы создаём соответствующий HTML-блок с меткой и элементом ввода. Например, поле выбора типа недвижимости (property_type):
<p>
<label for="property_type">Тип недвижимости</label>
<select name="property_type" id="property_type" required>
<option value="" selected>Не выбрано</option>
<option value="apartment">Квартира</option>
<option value="house">Дом</option>
<option value="land">Земельный участок</option>
</select>
</p>
Тот же принцип можно использовать для других полей. Главное — правильно прописывать id, name и индексы, если планируется использовать массивы для передачи данных.
Добавление поля “Цена” и “Период”
Следующим шагом создаём поля для цены и периода сдачи или продажи недвижимости.
<p>
<label for="property_price">Цена</label>
<input type="number" name="property_price" id="property_price" placeholder="Введите цену" required>
</p>
<p>
<label for="property_period">Период (месяц, год...)</label>
<input type="text" name="property_period" id="property_period" placeholder="Укажите период">
</p>
Тип number подойдёт для цены, а для периода можно использовать обычный text, чтобы пользователь мог указать произвольное значение.
Поле выбора агента
Интересная часть формы — поле для выбора агента. Так как агенты — это пользователи сайта, нужно динамически подгрузить их список из базы данных WordPress. При этом текущий пользователь по умолчанию будет выбран как агент, если он авторизован.
<?php
$current_user = wp_get_current_user();
$agents = get_posts([
'post_type' => 'agent',
'post_status' => 'publish',
'numberposts' => -1,
]);
?>
<p>
<label for="property_agent">Агент</label>
<select name="property_agent" id="property_agent">
<option value="<?php echo esc_attr($current_user->ID); ?>" selected>
<?php echo esc_html($current_user->display_name); ?> (Я)
</option>
<?php foreach ($agents as $agent): ?>
<option value="<?php echo esc_attr($agent->ID); ?>">
<?php echo esc_html($agent->post_title); ?>
</option>
<?php endforeach; ?>
</select>
</p>
Таким образом, в списке будут доступны все агенты, опубликованные в CPT agent, а текущий пользователь автоматически устанавливается как выбранный по умолчанию.
Добавление кнопки отправки и защиты формы
Теперь в конце формы добавляем кнопку «Добавить» и несколько важных скрытых полей, которые обеспечат безопасность при отправке данных.
<p>
<input type="hidden" name="action" value="add_property">
<?php wp_nonce_field('add_property_action', 'add_property_nonce'); ?>
<input type="submit" value="Добавить объект">
</p>
Что делает этот код:
action="add_property"— помогает определить, какой обработчик должен принимать данные формы.wp_nonce_field()— создаёт защитное полеnonce, предотвращающее CSRF-атаки и подделку запросов.submit— стандартная кнопка для отправки формы.
Ограничение доступа — только для авторизованных пользователей
Форма добавления объекта должна быть доступна только авторизованным пользователям. Для этого достаточно простой проверки перед выводом формы:
<?php if ( is_user_logged_in() ) : ?>
<!-- Здесь форма добавления объекта -->
<?php else : ?>
<p>Чтобы добавить объект, необходимо <a href="<?php echo wp_login_url(get_permalink()); ?>">войти в систему</a>.</p>
<?php endif; ?>
Таким образом, неавторизованные посетители видят только уведомление с предложением войти, а зарегистрированные пользователи получают доступ к форме.
Заключение
Мы реализовали продвинутую форму для добавления Custom Post Type (например, недвижимости) с фронтенда.
Теперь она поддерживает:
- выбор типа, локации и других параметров;
- поля с метабоксами (цена, период, агент);
- защиту через nonce;
- проверку авторизации пользователя.
На следующем шаге останется подключить обработку формы, сохранение данных в базу и загрузку изображений, чтобы полностью завершить функционал фронтенд-добавления записей.