как загрузить изображение с помощью wp_handle_upload

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

Привет, я новичок на WordPress, не мог бы кто-нибудь сказать, как мне загрузить несколько изображений с помощью wp_handle_upload в цикле

for($i=1;$i<count($_FILES['myfile']['name']);$i++){

    $uploadedfile = $_FILES['myfile'].$i;

    $upload_overrides = array( 'test_form'.$i => false );

    $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );

    if ( $movefile && !isset( $movefile['error'] ) ) {
      //  echo "Файл действителен и был успешно загружен.\n";

        $dir_path= $movefile['url'];

    } else {

        echo $movefile['error'];
    }
}//конец цикла

Вот мой пример, как загрузить несколько изображений:

add_action( 'add_meta_boxes',   'my_test_metabox' );

function my_test_metabox() {
    add_meta_box( 'my_test_metabox', 'Загрузка файла', 'my_test_metabox_out', 'post' );
}

add_action('post_edit_form_tag', 'update_edit_form' );
function update_edit_form() {
    echo ' enctype="multipart/form-data"';
}

function my_test_metabox_out( $post ) {

    $files = get_post_meta( $post->ID, 'my_files', true );
    if( ! empty( $files ) ) {
        echo 'Загруженные файлы:' . "\r\n";
        foreach( $files as $file ) {
            echo '<img src="' . $file['url'] . '" width="100" height="100" />';
        }
        echo "\r\n";
    }
    echo 'Загрузить файлы:' . "\r\n";
    echo '<input type="file" name="my_files[]" multiple />';

}

add_action( 'save_post', 'my_files_save' );

function my_files_save( $post_id ) {

    if( ! isset( $_FILES ) || empty( $_FILES ) || ! isset( $_FILES['my_files'] ) )
        return;

    if ( ! function_exists( 'wp_handle_upload' ) ) {
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
    }
    $upload_overrides = array( 'test_form' => false );

    $files = $_FILES['my_files'];
    foreach ($files['name'] as $key => $value) {
      if ($files['name'][$key]) {
        $uploadedfile = array(
            'name'     => $files['name'][$key],
            'type'     => $files['type'][$key],
            'tmp_name' => $files['tmp_name'][$key],
            'error'    => $files['error'][$key],
            'size'     => $files['size'][$key]
        );
        $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );

        if ( $movefile && !isset( $movefile['error'] ) ) {
            $ufiles = get_post_meta( $post_id, 'my_files', true );
            if( empty( $ufiles ) ) $ufiles = array();
            $ufiles[] = $movefile;
            update_post_meta( $post_id, 'my_files', $ufiles );

        }
      }
    }

}

Привет, вот код, который я использовал в своем плагине, надеюсь, ты поймешь его, и если возникнут проблемы, ты можешь спросить меня:

if(isset($_FILES))
    {
        for ($i=1; $i < count($_FILES) ; $i++) 
        { 

            $uploadedfile = $_FILES['question_'.$i];
            ?>
            <script type="text/javascript">
            $(document).ready(function(){
                var nam = <?php echo "question".$i; ?>
                var namm = $("."+nam).prev().attr('name');

            });
            </script>
            <?php

        $upload_overrides = array( 'test_form' => false );

        $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );

        if ( $movefile && !isset( $movefile['error'] ) ) {
            //echo "Файл действителен, и был успешно загружен.\n";
            $filename = $movefile['file'];
        } else {
            /**
             * Ошибка, вызванная _wp_handle_upload()
             * @see _wp_handle_upload() в wp-admin/includes/file.php
             */
            echo $movefile['error'];
        }

        // $filename должен быть путем к файлу в директории загрузки.
        //$filename="/path/to/uploads/2013/03/filename.jpg";

        // Получить путь к директории загрузки.
        $wp_upload_dir = wp_upload_dir();

        $url = $wp_upload_dir['url'] . "https://wordpress.stackexchange.com/" . basename( $filename );
        echo $url."<br>";

    }           
    }

Вот мой HTML код:-

    $question =get_post_meta($trivia->ID,'question',true);

     $c = 0;
     $id = uniqid();
    if ( count( $question ) > 0 ) {
        if(is_array($question)){

        foreach( $question as $questions ) {
            if ( isset( $questions['question'] ) ) {

                printf('<p>Вопрос: <input type="text" name="question[%1$s][question]" value="%2$s"> -- <span class="remove_question">%3$s</span><span class="add_answer">   Добавить ответ</span></p>',   $c,$questions['question'],__('Удалить вопрос'));
                for($i = 1; $i<=count($questions['answers']); $i++)
                {
                    if($questions['answers'][$i]['image'])
                    {
                        printf('<p>Опция %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Статус <input type="text" value="%2$s" name="question[%4$s][answers][%5$s][status]"> Изображение <input type="text" name="question[%4$s][answers][%5$s][image]" value="https://wordpress.stackexchange.com/questions/201676/%6$s"><img src="https://wordpress.stackexchange.com/questions/201676/%6$s" height="100" widht="100"> -- <span class="remove_answer">%3$s</span></p>', $questions['answers'][$i]['answer'] ,$questions['answers'][$i]['status'], __('Удалить ответ'), $c, $i,$questions['answers'][$i]['image']);
                    }
                    else
                    {
                        printf('<p>Опция %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Статус <input type="text" value="%2$s" name="question[%4$s][answers][%5$s][status]"> -- <span class="remove_answer">%3$s</span></p>', $questions['answers'][$i]['answer'] ,$questions['answers'][$i]['status'], __('Удалить ответ'), $c, $i);
                    }
                }
                $c = $c +1;
            }
        }
    }
}
 ?>
<span id="question_here"></span>
<span class="add_question"><?php _e('Добавить вопрос'); ?></span>
<script>
    var $ =jQuery.noConflict();
    $(document).ready(function() {
        var count = <?php echo $c; ?>;
         var countt = 0;
        $(".add_question").click(function() {
            count = count + 1;
            countt = 0;
            $('#question_here').append('<p>Вопрос: <input type="text" name="question['+count+'][question]" value=""> -- <span class="remove_question">Удалить вопрос</span><span class="add_answer"> Добавить ответ</span></p>' );
            return false;
        });
        $(".remove_question").live('click', function() {
            $(this).parent().remove();
        });

        $(".add_answer").live('click',function(){
            countt = countt + 1;
            $('#question_here').append('<p>Ответ <input type="text" name="question['+count+'][answers]['+countt+'][answer]"> Статус <input type="text" name="question['+count+'][answers]['+countt+'][status]"><input id="question_'+count+'_answers_'+countt+'_image" type="text" size="36" name="question['+count+'][answers]['+countt+'][image]" value="" /><input class="upload_image_button" type="button" value="Загрузить изображение" /><span class="remove_answer">Удалить</span></p>');
        })
         $('.upload_image_button').live('click',function() {
         formfield = $('#upload_image').attr('name');
         tb_show('', 'media-upload.php?type=image&amp;TB_iframe=true');

         return false;
        });

         window.send_to_editor = function(html) {
         imgurl = $('img',html).attr('src');
         $('#question_'+count+'_answers_'+countt+'_image').val(imgurl);
         tb_remove();
        }
        $(".remove_answer").live('click', function() {
            $(this).parent().remove();
        });

    });
    </script>
</div><?php

функция обработки загрузки изображения для поля ввода типа файл и имени ’email_image’.

if (!empty($_FILES[’email_image’][‘name’])) {
$uploadedfile = $_FILES[’email_image’];
$upload_overrides = array(‘test_form’ => false);

                // Используйте функцию WordPress для обработки загрузки файла
                $movefile = wp_handle_upload($uploadedfile, $upload_overrides);

                if ($movefile && !isset($movefile['error'])) {
                    // Сохраните URL изображения
                    update_option('ccd_email_image', $movefile['url']);
                    echo '<div class="updated"><p>Данные контакта сохранены!</p></div>';
                } else {
                    echo '<div class="error"><p>' . $movefile['error'] . '</p></div>';
                }
            }

.

Ответ или решение

Чтобы загрузить несколько изображений с помощью функции wp_handle_upload в WordPress, необходимо правильно конфигурировать как HTML-форму, так и соответствующие функции обработки загруженных файлов. В этом ответе вы найдете подробное руководство о том, как это сделать.

Шаг 1: Создание формы для загрузки файлов

Для начала вам нужно создать HTML-форму, которая будет позволять пользователям загружать несколько изображений. Убедитесь, что в вашей форме установлен атрибут enctype равный multipart/form-data. Это необходимо для правильной работы с файлами.

function my_test_metabox_out( $post ) {
    // Отображение загруженных файлов
    $files = get_post_meta( $post->ID, 'my_files', true );
    if( !empty($files) ) {
        echo 'Загруженные файлы:<br>';
        foreach( $files as $file ) {
            echo '<img src="' . esc_url($file['url']) . '" width="100" height="100" />';
        }
        echo '<br>';
    }

    // Поле для загрузки файлов
    echo 'Загрузите файлы:<br>';
    echo '<input type="file" name="my_files[]" multiple />';
}

Шаг 2: Обработка загрузок файлов

Теперь необходимо обработать загрузку файлов, когда форма отправляется. Вы можете сделать это в обработчике события save_post.

add_action( 'save_post', 'my_files_save' );

function my_files_save( $post_id ) {
    if ( ! isset( $_FILES ) || empty( $_FILES ) || ! isset( $_FILES['my_files'] ) ) return;

    // Подключаем необходимые функции
    if ( ! function_exists( 'wp_handle_upload' ) ) {
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
    }

    $upload_overrides = array( 'test_form' => false );
    $files = $_FILES['my_files'];

    foreach ( $files['name'] as $key => $value ) {
        if ($files['name'][$key]) {
            $uploadedfile = array(
                'name'     => $files['name'][$key],
                'type'     => $files['type'][$key],
                'tmp_name' => $files['tmp_name'][$key],
                'error'    => $files['error'][$key],
                'size'     => $files['size'][$key]
            );

            // Загрузка файла
            $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );

            if ( $movefile && ! isset( $movefile['error'] ) ) {
                // Получаем существующие файлы и добавляем новый
                $ufiles = get_post_meta( $post_id, 'my_files', true );
                if ( empty( $ufiles ) ) $ufiles = array();
                $ufiles[] = $movefile; // Добавляем перемещение файла в массив
                update_post_meta( $post_id, 'my_files', $ufiles ); // Обновляем мета-данные
            }
        }
    }
}

Шаг 3: Работа с загруженными файлами

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

$files = get_post_meta( $post->ID, 'my_files', true );
if ( ! empty( $files ) ) {
    foreach ( $files as $file ) {
        echo '<img src="' . esc_url($file['url']) . '" width="100" height="100" />';
    }
}

Заключение

Используя вышеуказанные шаги, вы сможете создать функциональность загрузки нескольких изображений в WordPress с использованием функции wp_handle_upload. Не забудьте протестировать код и убедиться, что все работает корректно. Если возникнут ошибки, проверьте, правильно ли настроены PHP и разрешения на папки загрузки.

Эта инструкция поможет вам эффективно использовать загрузку файлов в вашем проекте WordPress. Вы также можете адаптировать этот код под более специфические требования вашего проекта.

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

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