Вопрос или проблема
Я уже несколько дней пытаюсь разобраться с этой проблемой. Я успешно реализовал форму для отправки постов с фронтенда моего сайта. Но я не могу понять, как заставить загрузку изображений работать.
Я хочу, чтобы любое изображение, загруженное пользователем, автоматически прикреплялось к посту и становилось его изображением по умолчанию.
Может ли кто-то объяснить, как сделать это с моим существующим кодом?
Я просмотрел все соответствующие вопросы на этом форуме, и ни одно из решений не сработало для меня.
<?
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 = "Смотрите заголовок темы..."; // если нет, используем заполнителя
} 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'] . "https://wordpress.stackexchange.com/" . 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 );
я не тестировал скрипт – он адаптирован из версии, которую я создал. возможно, вы захотите изменить имя файла и подобные вещи, но в целом это работает таким образом 🙂
Это работает правильно!
$uploaddir = wp_upload_dir();
$file = $_FILES["post_Fimage"]["name"];
$uploadfile = $uploaddir['path'] . "https://wordpress.stackexchange.com/" . 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'] . "https://wordpress.stackexchange.com/" . 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'] . "https://wordpress.stackexchange.com/" . 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 );
Возможно, вам стоит сначала проверить поле recapcha, если вы используете recapcha. recaptcha не позволит отправить пост или запрос.
У меня такая же проблема. Изображение по умолчанию неправильно импортируется в пост, который только что был отправлен с фронтенда. Я вижу изображение в медиатеке, так что я знаю, что это работает до этой точки.
Эта функция работает до ‘//функция работает до здесь’. Можете помочь мне?
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[] = 'Загруженный файл не существует.' ;
}
}
}
}
Ответ или решение
Установка изображений к записи через форму на фронтенде: Полное руководство
Если вы хотите интегрировать загрузку изображений и установить их как "избранные" (featured images) для записей, создаваемых на фронтенде вашего сайта, в этой статье я подробно объясню, как это сделать, основываясь на вашем текущем коде.
Шаг 1: Подготовка формы
Убедитесь, что ваша форма HTML включает поле для загрузки изображения. В вашем случае это уже реализовано:
<label for="images">Изображение для записи:</label>
<input type="file" name="user-image-featured" id="user-image-featured" size="20">
Обратите внимание, что атрибут enctype="multipart/form-data"
должен быть установлен на форме для корректной передачи файлов.
Шаг 2: Обработка загрузки изображения
В вашем обработчике формы, после создания записи с помощью wp_insert_post
, вам нужно добавить код для загрузки изображения и установки его как featured image
. Вот пример, как это сделать:
if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['insert_post'])) {
// Ваш существующий код...
$my_post_id = wp_insert_post($post); // Сохраните ID новой записи
// Проверяем, было ли загружено изображение
if (!empty($_FILES['user-image-featured']['name'])) {
$uploaded_file = $_FILES['user-image-featured'];
// Подключаем необходимые функции для работы с медиа
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_upload('user-image-featured', $my_post_id);
if (is_wp_error($attachment_id)) {
// Ошибка при загрузке, обработайте её
echo 'Ошибка загрузки изображения: ' . $attachment_id->get_error_message();
} else {
// Устанавливаем изображение как "избранное"
set_post_thumbnail($my_post_id, $attachment_id);
}
}
// Перенаправление после успешной записи
echo "<script>location.replace('/dashboard/');</script>";
}
Объяснение кода
-
Проверка наличия загруженного файла: Мы проверяем, есть ли значение для
$_FILES['user-image-featured']['name']
, чтобы убедиться, что пользователь загрузил файл. -
Подключение медиабиблиотеки: Необходимо загрузить функции для обработки медиафайлов WordPress, чтобы мы могли работать с изображениями.
-
Загрузка изображения: Функция
media_handle_upload
обрабатывает загрузку файла и прикрепляет его к созданной записи. Если возникает ошибка, она обрабатывается для вывода сообщений. -
Установка изображения как "избранного": Если загрузка прошла успешно, изображение устанавливается как "избранное" для созданной записи через
set_post_thumbnail
.
Шаг 3: Проверка и настройки
После того, как вы внесли изменения, протестируйте функциональность формы:
- Проверьте, правильно ли загружается изображение и устанавливается как "избранное".
- Убедитесь, что в случае ошибки отображается сообщение об ошибке, чтобы вы могли отладить ситуацию.
Заключение
Теперь вы знаете, как прикрепить загружаемое изображение к записи, создаваемой через форму на фронтенде вашего сайта. Это решение не только улучшит взаимодействие пользователей с вашим сайтом, но и сделает его более интересным и визуально привлекательным. Надеюсь, данное руководство было вам полезно!