Отправка записи и загрузка изображения из фронтенда

13 мар. 2011 г., 15:51:50
Просмотры: 49.3K
Голосов: 12

Я пытаюсь сделать что-то похожее на описанное выше. Я хочу дать пользователям возможность создавать записи и загружать изображения через фронтенд. Я уже сделал форму для создания записей, и она работает.

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

Спасибо.

0
Все ответы на вопрос 2
6
23

Если вы говорите о ответе, который я опубликовал здесь, то он просто загружает файл в 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);
            }

и ваше изображение будет загружено и сохранено как миниатюра поста.

13 мар. 2011 г. 19:25:43
Комментарии

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

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
13 мар. 2011 г. 21:44:15

Лол, я такой тупой. Только сейчас дошло, почему нужно было использовать '$pid'

У меня была эта строка $pid = wp_insert_post($new_post);

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
13 мар. 2011 г. 21:47:07

Рад, что ты разобрался, и что самое главное - ты понял суть.

Bainternet Bainternet
13 мар. 2011 г. 22:05:22

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

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
14 мар. 2011 г. 00:35:15

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

Ehab Fawzy Ehab Fawzy
11 мар. 2012 г. 13:41:48

К сожалению, у меня только один аккаунт на Stackoverflow, поэтому я могу поставить только один апвоут этому вопросу. Идеальный ответ.

hemnath mouli hemnath mouli
27 сент. 2015 г. 10:04:40
Показать остальные 1 комментариев
0

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;
}
?>
29 мар. 2011 г. 15:34:39