Отправка записи и загрузка изображения из фронтенда
Я пытаюсь сделать что-то похожее на описанное выше. Я хочу дать пользователям возможность создавать записи и загружать изображения через фронтенд. Я уже сделал форму для создания записей, и она работает.
Я следовал ответу Robin I Knight и попробовал его решение upload-post-thumbnail-from-the-front-end. К сожалению, у меня не получилось заставить это работать. Нужно ли что-то изменить или отредактировать?
Спасибо.

Если вы говорите о ответе, который я опубликовал здесь, то он просто загружает файл в iframe для достижения "Ajax-подобной" отправки.
Если у вас уже есть форма, которая обрабатывает отправку поста, вы можете просто добавить поле для загрузки файла в вашу форму:
<form ...
...
<input type="file" name="thumbnail" id="thumbnail">
...
...
</form>
Убедитесь, что ваша форма имеет атрибут enctype="multipart/form-data"
.
Затем в вашем скрипте обработки формы, после создания поста (предполагая, что вы используете wp_insert_post();
), сохраните ID поста в новой переменной:
$new_post = wp_insert_post($post_array);
и после этого добавьте:
if (!function_exists('wp_generate_attachment_metadata')){
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
if ($_FILES) {
foreach ($_FILES as $file => $array) {
if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
return "Ошибка загрузки : " . $_FILES[$file]['error'];
}
$attach_id = media_handle_upload( $file, $new_post );
}
}
if ($attach_id > 0){
//и если вы хотите установить это изображение как миниатюру поста, используйте:
update_post_meta($new_post,'_thumbnail_id',$attach_id);
}
и ваше изображение будет загружено и сохранено как миниатюра поста.

Спасибо @Bainternet. Я пытался заставить его вставить миниатюру, но по какой-то причине, когда я заменил '$new_post' на '$pid', миниатюра поста вставилась

Лол, я такой тупой. Только сейчас дошло, почему нужно было использовать '$pid'
У меня была эта строка $pid = wp_insert_post($new_post);

Да, большое спасибо за вашу помощь. Теперь, когда я разобрался, самое время добавить немного ajax :)

@Bainternet♦ спасибо за ваш ответ, он полезный, но как заставить это работать с несколькими изображениями. Я изменил свой input на <input type="file" id="image" name="image[]" multiple="multiple" >, но теперь ничего не загружается. - любая помощь, пожалуйста?

HTML-разметка:
<p>
<label for="custom-upload">Загрузить новое изображение:</label>
<input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
</p>
<?php
/*Получение изображения*/
$attachment = get_post_meta($postid, 'custom_image');
if($attachment[0]!='')
{
echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
}
?>
Загрузка изображения:
<?php
global $post; /*Глобальный объект записи*/
$post_id = $post->ID; /*Получение ID текущей записи*/
$upload = $_FILES['upload']; /*Получение загруженного изображения из формы*/
add_custom_image($post_id, $upload); /*Вызов функции загрузки изображения*/
function add_custom_image($post_id, $upload)
{
$uploads = wp_upload_dir(); /*Получение пути к папке загрузок WordPress*/
if (is_writable($uploads['path'])) /*Проверка доступности папки для записи*/
{
if ((!empty($upload['tmp_name']))) /*Проверка, что изображение не пустое*/
{
if ($upload['tmp_name']) /*Проверка, что изображение загружено во временную директорию*/
{
$file=handle_image_upload($upload); /*Вызов нашей функции для НЕПОСРЕДСТВЕННОЙ загрузки изображения*/
$attachment = array /*Создание вложения для нашей записи*/
(
'post_mime_type' => $file['type'], /*Тип вложения*/
'post_parent' => $post_id, /*ID записи*/
);
$aid = wp_insert_attachment($attachment, $file['file'], $post_id); /*Добавление вложения к записи и возврат ID вложения*/
$a = wp_generate_attachment_metadata($aid, $file['file'] ); /*Генерация метаданных для нового вложения*/
$prev_img = get_post_meta($post_id, 'custom_image'); /*Получение ранее загруженного изображения*/
if(is_array($prev_img))
{
if($prev_img[0] != '') /*Если изображение существует*/
{
wp_delete_attachment($prev_img[0]); /*Удаление предыдущего изображения*/
}
}
update_post_meta($post_id, 'custom_image', $aid); /*Сохранение ID вложения в метаданных*/
if ( !is_wp_error($aid) )
{
wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) ); /*При отсутствии ошибок, обновление метаданных нового изображения*/
}
}
}
else
{
echo 'Пожалуйста, загрузите изображение.';
}
}
}
function handle_image_upload($upload)
{
global $post;
if (file_is_displayable_image( $upload['tmp_name'] )) /*Проверка, что это изображение*/
{
/*обработка загруженного файла*/
$overrides = array('test_form' => false);
$file=wp_handle_upload($upload, $overrides);
}
return $file;
}
?>
