Редактирование пользовательских объявлений (Custom Post Types) с фронтенда — важный элемент любого сайта с пользовательским контентом: досок объявлений, каталогов недвижимости, профилей и т.д.
В этой статье разберём, как реализовать редактирование постов с фронтенда в WordPress, используя стандартные функции ядра — без сторонних плагинов и конструкторов.
- Логика редактирования объявлений с фронтенда
- Определяем режим редактирования
- Проверяем права пользователя
- Заполнение формы существующими данными
- Выбор значения в выпадающем списке
- Передача ID поста при отправке формы
- Обработка формы: добавление и редактирование
- Особенности работы с изображениями
- Удобство и UX
- Результат
- Заключение
Логика редактирования объявлений с фронтенда
Когда пользователь создаёт новое объявление, мы используем форму, которая отправляет данные через wp_insert_post.
Для редактирования логика почти идентичная, но вместо создания нового поста нам нужно обновить существующий с помощью wp_update_post.
Ключевая идея:
- если в URL есть параметр
?edit=ID, значит пользователь открывает режим редактирования; - если параметра нет — показывается форма добавления нового объявления.
Определяем режим редактирования
В файле с формой добавления объявлений добавляем проверку:
if ( isset($_GET['edit']) && !empty($_GET['edit']) ) {
// Режим редактирования
} else {
// Режим добавления
}
Если параметр edit существует, получаем ID поста:
$edit_id = intval( sanitize_text_field($_GET['edit']) );
$property = get_post($edit_id);
Проверяем права пользователя
Перед тем как показать форму редактирования, важно убедиться, что:
- Пост действительно существует.
- Он принадлежит текущему пользователю.
- Его тип соответствует нашему кастомному типу (
property,advert, и т.д.).
if ( $property && $property->post_type === 'property' ) {
if ( $property->post_author == get_current_user_id() ) {
// Можно редактировать
}
}
Если проверки не пройдены, стоит показать сообщение об ошибке или редирект.
Заполнение формы существующими данными
Теперь подставим данные поста и метаполя в форму.
Например, для заголовка и описания:
<input type="text" name="post_title" value="<?php echo esc_attr($property->post_title); ?>">
<textarea name="post_content"><?php echo esc_textarea($property->post_content); ?></textarea>
Для метаполей используем get_post_meta():
<input type="text" name="price" value="<?php echo esc_attr( get_post_meta($property->ID, 'property_price', true) ); ?>">
Выбор значения в выпадающем списке
Если у вас в форме есть select, например, для локации или типа недвижимости, можно автоматически выделить текущий термин так:
$terms = get_terms([
'taxonomy' => 'location',
'hide_empty' => false,
]);
$current_term = wp_get_post_terms($property->ID, 'location', ['fields' => 'ids']);
$current_term_id = $current_term ? $current_term[0] : '';
foreach ($terms as $term) {
$selected = $term->term_id == $current_term_id ? 'selected' : '';
echo '<option value="'.$term->term_id.'" '.$selected.'>'.$term->name.'</option>';
}
Передача ID поста при отправке формы
Чтобы форма знала, какой пост обновлять, добавляем скрытое поле:
<input type="hidden" name="property_id" value="<?php echo esc_attr($property->ID); ?>">
Обработка формы: добавление и редактирование
На этапе обработки данных в functions.php проверяем $_POST['action']:
if ( isset($_POST['action']) && $_POST['action'] === 'edit_property' ) {
$property_id = intval($_POST['property_id']);
$post_data = [
'ID' => $property_id,
'post_title' => sanitize_text_field($_POST['post_title']),
'post_content' => wp_kses_post($_POST['post_content']),
'post_status' => 'pending',
];
wp_update_post($post_data);
update_post_meta($property_id, 'property_price', sanitize_text_field($_POST['price']));
update_post_meta($property_id, 'property_period', sanitize_text_field($_POST['period']));
echo '<p>Объявление успешно обновлено!</p>';
}
Здесь функция wp_update_post() обновляет пост по ID, а update_post_meta() — сохраняет все связанные метаполя.
Особенности работы с изображениями
Если пользователь не загружает новое изображение, старое остаётся без изменений.
Чтобы обновить изображение, нужно реализовать загрузку файла и задать post_thumbnail:
if ( !empty($_FILES['thumbnail']['name']) ) {
$attachment_id = media_handle_upload('thumbnail', $property_id);
set_post_thumbnail($property_id, $attachment_id);
}
Удобство и UX
После успешного редактирования можно добавить ссылки:
<a href="/my-properties/">Вернуться к списку объявлений</a>
<a href="/add-property/">Добавить новое объявление</a>
Результат
Теперь на вашем сайте работает полноценная логика:
- пользователь может добавлять объявления;
- и редактировать уже созданные с фронтенда, без доступа к админке.
С помощью wp_update_post() и стандартных функций WordPress вы легко реализуете эту механику для любых типов контента — товаров, объявлений, профилей и т.д.
Заключение
Используя всего несколько функций WordPress — get_post(), get_post_meta(), wp_update_post() и update_post_meta() — можно реализовать безопасное и гибкое редактирование пользовательских записей прямо с фронтенда.
Это значительно упрощает взаимодействие пользователей с вашим сайтом и делает его полноценной платформой для контента.