Установить изображение миниатюры Формы на фронтенде

Вопрос или проблема

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

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

Может ли кто-то объяснить, как сделать это с моим существующим кодом?

Я просмотрел все соответствующие вопросы на этом форуме, и ни одно из решений не сработало для меня.

                <?

            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>";
}

Объяснение кода

  1. Проверка наличия загруженного файла: Мы проверяем, есть ли значение для $_FILES['user-image-featured']['name'], чтобы убедиться, что пользователь загрузил файл.

  2. Подключение медиабиблиотеки: Необходимо загрузить функции для обработки медиафайлов WordPress, чтобы мы могли работать с изображениями.

  3. Загрузка изображения: Функция media_handle_upload обрабатывает загрузку файла и прикрепляет его к созданной записи. Если возникает ошибка, она обрабатывается для вывода сообщений.

  4. Установка изображения как "избранного": Если загрузка прошла успешно, изображение устанавливается как "избранное" для созданной записи через set_post_thumbnail.

Шаг 3: Проверка и настройки

После того, как вы внесли изменения, протестируйте функциональность формы:

  • Проверьте, правильно ли загружается изображение и устанавливается как "избранное".
  • Убедитесь, что в случае ошибки отображается сообщение об ошибке, чтобы вы могли отладить ситуацию.

Заключение

Теперь вы знаете, как прикрепить загружаемое изображение к записи, создаваемой через форму на фронтенде вашего сайта. Это решение не только улучшит взаимодействие пользователей с вашим сайтом, но и сделает его более интересным и визуально привлекательным. Надеюсь, данное руководство было вам полезно!

Оцените материал
Добавить комментарий

Капча загружается...