В этом материале разберём, как из формы на фронтенде WordPress не только создавать новую запись кастомного типа (CPT), но и прикреплять к ней таксономии (например, “Локация”, “Тип недвижимости”) и изображения (Featured Image). Такой подход идеально подходит для сайтов с пользовательским контентом: досок объявлений, каталогов недвижимости, бизнес-порталов и т.п.
Привязка таксономий через wp_set_object_terms
Когда пользователь заполняет форму и выбирает, например, локацию и тип недвижимости, эти данные нужно сохранить как термины соответствующих таксономий. WordPress предоставляет для этого встроенную функцию — wp_set_object_terms().
Пример использования:
if ( ! empty($_POST['property_location']) ) {
wp_set_object_terms(
$post_id, // ID поста
intval($_POST['property_location']), // ID термина
'location' // слаг таксономии
);
}
if ( ! empty($_POST['property_type']) ) {
wp_set_object_terms(
$post_id,
intval($_POST['property_type']),
'property_type'
);
}
Важно передавать именно ID термина, а не его имя. Если передать строку, WordPress создаст новый термин вместо того, чтобы привязать существующий. Поэтому перед отправкой данных конвертируем значение в целое число через intval() — это гарантирует корректную привязку.
Загрузка изображений с фронтенда
Теперь добавим возможность загружать изображения. Предположим, что форма содержит поле type="file" для загрузки картинок. После отправки формы файлы доступны через массив $_FILES.
Сначала проверяем, что пользователь действительно загрузил файл:
if ( ! empty($_FILES['property_image']['name']) ) {
$file = $_FILES['property_image'];
}
Далее стоит убедиться, что загруженный файл имеет допустимый тип — JPEG, JPG или PNG. Для этого создадим простую функцию валидации:
function property_image_validation($file_name) {
$allowed = ['jpg', 'jpeg', 'png'];
$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
return in_array($ext, $allowed);
}
Используем её перед загрузкой:
if ( property_image_validation($file['name']) ) {
// Загрузка
}
Загрузка и прикрепление изображения к посту
Чтобы прикрепить изображение к посту как Featured Image, можно использовать стандартные функции ядра WordPress.
Для начала подключаем необходимые файлы ядра (если код выполняется вне админки):
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
Теперь можно воспользоваться функцией media_handle_upload():
$attachment_id = media_handle_upload('property_image', $post_id);
Эта функция сама загружает файл в папку /uploads/, создаёт запись вложения (attachment) и возвращает ID этого вложения.
Чтобы назначить изображение как Featured Image (миниатюру поста), используем:
if ( ! is_wp_error($attachment_id) ) {
set_post_thumbnail($post_id, $attachment_id);
}
Проверка загрузки и вывод результатов
После сохранения данных полезно добавить проверку результата и вывести сообщение пользователю, что объект успешно создан и отправлен на модерацию:
if ( $post_id ) {
echo '<p>Объявление успешно отправлено и ожидает модерации!</p>';
} else {
echo '<p>Произошла ошибка при сохранении данных.</p>';
}
А чтобы форма не отображалась повторно после успешной отправки, можно скрыть её условием:
if ( empty($success_message) ) {
// форма
} else {
echo '<div class="success-message">'.$success_message.'</div>';
}
Практическая логика на фронтенде
Итак, процесс выглядит следующим образом:
- Пользователь заполняет форму (заголовок, описание, цена, локация, тип, изображение).
- После отправки:
- создаётся новая запись кастомного типа (
property); - к ней привязываются выбранные термины таксономий (
location,property_type); - изображение загружается и назначается как Featured Image;
- пользователь получает сообщение о том, что объект успешно добавлен.
- создаётся новая запись кастомного типа (
Такой подход позволяет пользователям сайта самостоятельно публиковать объявления или объекты без доступа в админ-панель WordPress.
Полезные советы
- Для безопасности добавляйте проверку
wp_verify_nonce()при отправке формы. - Если нужно разрешить загрузку нескольких изображений — просто создайте цикл
foreach ($_FILES['images']['name'] as $key => $value)и обрабатывайте каждое вложение отдельно. - Чтобы автоматически устанавливать статус поста “ожидает модерации”, используйте
'post_status' => 'pending'. - При необходимости можно расширить функционал и добавить уведомление администратору о новом объекте через
wp_mail().
Итог
Теперь форма добавления объектов с фронтенда WordPress полностью функциональна:
- создаёт записи кастомного типа (CPT),
- прикрепляет термины таксономий,
- загружает изображение и делает его Featured Image,
- отображает сообщение об успешной отправке.
Такой инструмент делает ваш сайт интерактивным и удобным для пользователей, а администратор получает готовый контент прямо в админке.