Добавление записей произвольного типа через фронтенд
Я пытаюсь разобраться, как сделать так, чтобы на моем сайте WordPress можно было добавлять элементы типа portfolio
через фронтенд. Плагины вроде WP-User-Frontend позволяют публиковать записи с фронтенда, но работают только с записями блога.
Есть ли какие-то способы или плагины, похожие на wp-user-frontend, но позволяющие добавлять записи произвольных типов?

Если вы готовы заплатить за это, плагин Gravity Forms позволяет создавать формы, которые сопоставляются с вашими пользовательскими типами записей (даже с обычными типами записей и страниц), а также с пользовательскими полями.
Для тех, кто не готов платить и хочет разобраться самостоятельно, можно создать форму на фронтенде, которая будет отправлять данные в любой выбранный вами тип записи, и это довольно просто.
Вот базовый пример:
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "my_post_type") {
// сохраняем переменные POST в переменные для дальнейшего использования
// сейчас самое время выполнить базовую проверку ошибок/валидацию,
// чтобы убедиться, что данные для этих значений установлены
$title = $_POST['title'];
$content = $_POST['content'];
$post_type = 'my_custom_post';
$custom_field_1 = $_POST['custom_1'];
$custom_field_2 = $_POST['custom_2'];
// массив аргументов для вставки через wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => $post_type
);
// вставляем запись в базу данных, передавая $new_post в wp_insert_post
// сохраняем ID записи в переменной $pid
$pid = wp_insert_post($new_post);
// используем $pid (ID записи) для добавления метаданных
add_post_meta($pid, 'meta_key', $custom_field_1, true);
add_post_meta($pid, 'meta_key', $custom_field_2, true);
}
Ваша HTML-форма будет выглядеть примерно так:
<form method="post" name="front_end" action="" >
<input type="text" name="title" value="Мой заголовок записи" />
<input type="text" name="content" value="Содержание моей записи" />
<input type="text" name="custom_1" value="Содержание пользовательского поля 1" />
<input type="text" name="custom_2" value="Содержание пользовательского поля 2" />
<button type="button">Отправить</button>
<input type="hidden" name="action" value="my_post_type" />
</form>
Вы можете поместить весь этот код в файл шаблона вашей темы. Обычно я бы пошел дальше и вынес логику обработки (PHP) в функцию в файле functions.php, подключенную к хуку, однако это будет работать и внутри файла темы.
Этот пример является лишь базовым и не содержит серьезной проверки ошибок и валидации. Однако он дает вам основу для того, чтобы отправлять данные с фронтенда в ваши типы записей на бэкенде.
Также существует множество руководств по этой теме на WPSE — если выполнить поиск, можно найти массу полезной информации.

<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "front_post") {
// сохраняем переменные POST в переменные для дальнейшего использования
// сейчас хорошее время для базовой проверки ошибок/валидации
// чтобы убедиться, что данные для этих значений установлены
$title = $_POST['title'];
$content = $_POST['content'];
$tags = $_POST['tag'];
$custom_field = $_POST['custom_1'];
$post_type = 'frontpost';
// массив аргументов для вставки с помощью wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'tags_input' => $tags,
'post_status' => 'publish',
'post_category' => array('0',$_POST['cat']),
'post_type' => $post_type
);
// вставляем пост в базу данных, передавая $new_post в wp_insert_post
// сохраняем ID поста в переменной $pid
// теперь используем $pid (ID поста) для добавления метаданных
$pid=wp_insert_post($new_post);
// используем $pid (ID поста) для добавления метаданных
add_post_meta($pid, 'cust_key', $custom_field);
}
?>
<div class="front-form col-sm-6">
<form method="post" name="front_end" action="" >
<input type="text" name="title" placeholder="Заголовок FrontPost" required />
<textarea name="content" placeholder="Содержание FrontPost" rows="5" ></textarea>
<input type="text" name="tag" placeholder="Теги FrontPost" />
<input type="text" name="custom_1" placeholder="Содержание произвольного поля" />
<span><?php wp_dropdown_categories( 'tab_index=10&taxonomy=category&hide_empty=0' ); ?></span>
<button type="submit">Отправить</button>
<input type="hidden" name="action" value="front_post" />
</form>
</div>
Попробуй это, это поможет тебе..! Аакиб :)

вставить запись
add_action('init', function() {
if (isset($_POST['submit'])) {
if (!is_user_logged_in()) {
echo 'Вы должны быть авторизованы, чтобы опубликовать запись.';
return;
}
$title = sanitize_text_field($_POST['name']);
$description = sanitize_textarea_field($_POST['description']);
$create_post = array(
'post_status' => 'publish',
'post_type' => 'user', // Убедитесь, что тип записи 'user' зарегистрирован
'post_title' => $title,
'post_content' => $description,
);
$post_id = wp_insert_post($create_post);
if(isset($_FILES['fileToUpload']) && !empty($_FILES['fileToUpload']['name'])){
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attachement_id = media_handle_upload('fileToUpload',$post_id);
if(is_wp_error($attachement_id)){
echo 'Ошибка загрузки!';
}else{
set_post_thumbnail($post_id,$attachement_id);
}
}
return $post_id ? 'Запись успешно создана' : 'Ошибка при создании записи';
if ($post_id) {
$state = sanitize_text_field($_POST['state']);
$country = sanitize_text_field($_POST['country']);
$pincode = sanitize_text_field($_POST['pincode']);
$college = sanitize_text_field($_POST['college']);
update_post_meta($post_id, 'state', $state);
update_post_meta($post_id, 'country', $country);
update_post_meta($post_id, 'pincode', $pincode);
update_post_meta($post_id, 'college', $college);
echo 'Запись успешно создана!';
} else {
echo 'Не удалось создать запись.';
}
}
});
HTML часть
<style cdn>
<div class="container">
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="post_id" value="<?php echo $post_idd ?>"
<div class="row mt-3">
<div class="col-sm-6">
<label>Имя</label>
<input type="text" name="name" class="form-control" value="<?php echo isset($user_name) ? $user_name : ''; ?>">
</div>
<div class="col-sm-6">
<label>Описание</label>
<input type ="text" name= "description" class="form-control" value="<?php echo isset($user_description) ? $user_description : ''; ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-12">
<label> Выберите изображение для загрузки </label>
<input type="file" name="fileToUpload" id="fileToUpload" class="form-control" value=" <?php echo isset($image) ? $image : ''; ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-4">
<label>Область/Штат</label>
<input type ="text" name= "state" class="form-control" value="<?php echo isset($state) ? $state : ''; ?>">
</div>
<div class="col-sm-4">
<label>Страна</label>
<input type ="text" name= "country" class="form-control" value="<?php echo isset($country) ? $country : ''; ?>">
</div>
<div class="col-sm-4">
<label>Почтовый индекс</label>
<input type ="text" name= "pincode" class="form-control" value="<?php echo isset($pincode) ? $pincode : '' ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-12">
<label>Название учебного заведения </label>
<input type ="text" name= "college" class="form-control" value="<?php echo isset($college) ? $college : ''; ?>">
</div>
</div>
<?php if( isset($_GET['post_id']) && $_GET['post_id']!=""){?>
<div class="row mb-5 mt-3">
<div class="col-sm-12">
<input type="submit" name="update" value="обновить" class="btn btn-primary">
</div>
<?php } else {
?>
</div>
<div class="row mb-5 mt-3">
<div class="col-sm-12">
<input type="submit" name="submit" value="отправить" class="btn btn-primary">
</div>
</div>
<?php }
?>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
