Установка изображения записи через форму на фронтенде
Я уже несколько дней пытаюсь решить эту проблему. Я успешно реализовал форму для отправки записей с фронтенда моего сайта. Но я не могу разобраться, как сделать так, чтобы загрузка изображений работала.
Я хочу, чтобы любое изображение, загруженное пользователем, автоматически прикреплялось к записи и становилось её миниатюрой.
Может кто-нибудь объяснить, как это сделать с моим существующим кодом?
Я просмотрел все похожие вопросы на этом форуме, но ни одно из решений мне не подходит.
<?
if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['insert_post'] )) { //проверяем, что наша форма была отправлена
//Если да, перенаправляем на панель управления
?><script language="javascript"><!--
location.replace("/dashboard/")
//-->
</script> <?php
$title = $_POST['thread_title']; //устанавливаем наш заголовок
if ($_POST['thread_description']=="") { // проверяем, было ли введено описание
$description = "See thread title..."; // если нет, используем заполнитель
} else {
$description = $_POST['thread_description']; //если да, используем его
}
$tags = $_POST['thread_tags']; //загружаем теги темы (пользовательская таксономия) в массив
$post = array( //наши аргументы для wp_insert_post
'post_title' => wp_strip_all_tags($title),
'post_content' => $description,
'post_category' => array('0' => $_POST['cat']),
'tax_input' => array('thread_tag' => $tags),
'post_status' => 'publish',
'post_type' => 'tsv_userpost'
);
$my_post_id = wp_insert_post($post); //отправляем нашу запись, сохраняем полученный ID
$current_user = wp_get_current_user(); //проверяем, кто авторизован
add_post_meta($my_post_id, '_your_custom_meta', $var); //добавляем пользовательские мета-данные после вставки записи
} else {
if(is_user_logged_in()) { // проверяем, что пользователь авторизован перед показом формы
$current_user = wp_get_current_user();
?>
<div id="postbox">
<form id="new_thread" name="new_thread" method="post" action="" enctype="multipart/form-data">
<input class="required" type="text" id="thread_title" value="" tabindex="1" name="thread_title" placeholder="Заголовок темы" />
<textarea id="thread_description" name="thread_description" cols="80" rows="20" tabindex="2"></textarea>
<div class="left">
<select name='cat' id='cat' class='postform required' tabindex="3">
<option value="" selected="selected">Выберите:</option>
<option class="writing" value="90">Текст</option>
<option class="image" value="91">Изображение</option>
<option class="video" value="92">Видео</option>
<option class="audio" value="94">Аудио</option>
<option class="link" value="95">Ссылка</option>
</select>
</div>
<input type="text" value="" tabindex="4" size="16" name="thread_tags" id="thread_tags" placeholder="Теги" />
<br />
<!-- изображения -->
<label for="images">Изображение записи:</label>
<input type="file" name="user-image-featured" id="user-image-featured" size="20">
<!-- Кнопка отправки -->
<br />
<input type="submit" value="Сохранить запись" tabindex="5" id="thread_submit" name="thread_submit" class="thread-button" />
<input type="hidden" name="insert_post" value="post" />
<?php wp_nonce_field( 'new_thread' ); ?>
</form>
</div>
<?php } else { echo 'пожалуйста, авторизуйтесь'; } } ?>

это можно сделать, запустив функцию
set_post_thumbnail( $my_post_id, $thumbnail_id );
не забудьте, сначала нужно обработать и загрузить изображение в медиабиблиотеку:
$uploaddir = wp_upload_dir();
$file = $_FILES[ ... что у вас есть в POST данных ... ];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $file , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
скрипт не тестировался — он адаптирован из версии, которую я создал. возможно, вы захотите изменить имя файла и тому подобное, но в целом он работает именно так :)

Спасибо! Я пробовал похожие функции, но безрезультатно. Может, я просто вставляю код не в то место? Куда именно нужно вставить эти два фрагмента кода в приведённом выше коде?

это не имеет особого значения. Вы можете создать запись до вложения или наоборот, главное - чтобы оба были созданы к моменту вызова set_post_thumbnail( $my_post_id, $thumbnail_id );

Это работает правильно!
$uploaddir = wp_upload_dir();
$file = $_FILES["post_Fimage"]["name"];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $_FILES["post_Fimage"]["tmp_name"] , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
//echo "<pre>";print_r($wp_filetype);echo "</pre>";
//echo "<pre>";print_r($_FILES);echo "</pre>";
set_post_thumbnail( $post_id, $attach_id );

/******* Этот код работает у меня! ********/
$uploaddir = wp_upload_dir();
$file = $_FILES["post_Fimage"]["name"];
$uploadfile = $uploaddir['path'] . '/' . basename( $file );
move_uploaded_file( $_FILES["post_Fimage"]["tmp_name"] , $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );
set_post_thumbnail( $post_id, $attach_id );

Могу ли я исправить ваш код?
$uploaddir = wp_upload_dir();
$file = $_FILES[ ... какие данные у вас в POST ... ];
$uploadfile = $uploaddir['path'] . '/' . basename( $file['name'] );
move_uploaded_file( $file['tmp_name'], $uploadfile );
$filename = basename( $uploadfile );
$wp_filetype = wp_check_filetype(basename($filename), null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit',
'menu_order' => $_i + 1000
);
$attach_id = wp_insert_attachment( $attachment, $uploadfile );

У меня такая же проблема. Изображение записи не импортируется корректно для поста, который только что отправлен через фронтенд.
Я вижу изображение в медиабиблиотеке, так что знаю, что до этого момента все работает.
Эта функция работает до комментария '//function works till here'.
Может кто-нибудь помочь?
function save_post ( $form ){
$errors = array();
$form_setting = $form->get_settings();
$form_fields = $form->get_fields();
$form_fields_files = $form->get_uploaded_files();
$form_id = $form_fields['formId'];
if ($form_id === 'fxuqcf') {
$post_title = isset($form_fields['post-titel']) ? $form_fields['post-titel'] : '';
$post_content = isset($form_fields['post-bericht']) ? $form_fields['post-bericht'] : '';
$post_category_name = isset($form_fields['post-categorie']) ? $form_fields['post-categorie'] : '';}
//получаем название категории
$post_category_id = get_category_by_slug($post_category_name)->term_id;
if (!$post_category_id) {
$errors[] = 'неверное название категории';
return $errors;}
//создаем массив данных поста
$new_post = array(
'post_type' => 'post',
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'publish',
'post_category' => array($post_category_id),);
//вставляем пост
$post_id = wp_insert_post($new_post);
//проверяем, корректно ли создан пост
if ($post_id && is_wp_error($post_id)){
//функция работает до этого места
if (!empty($form_fields_files['post-afbeelding'])){
$uploaded_files = $form_fields_files['post-afbeelding'];
$file = $uploaded_files[0];
$file_array = array(
'name' => basename($file['file']),
'tmp-name' => $file['file']);
if (file_exist($file['file'])){
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_id = media_handle_sideload($file_array, $post_id);
if (is_wp_error($attachment_id)){
$errors[] = 'Ошибка с изображением:' . $attachment_id->get_error_message();
}else {
$attachment_id = wp_insert_attachment();
set_post_thumbnail($post_id, $attachment_id);
}
}else {
$errors[] = 'Загруженный файл не существует.' ;
}
}
}
}
