Как загрузить изображения используя wp_handle_upload

4 сент. 2015 г., 14:12:54
Просмотры: 33.3K
Голосов: 5

Привет, я новичок в 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'] ) ) {
        // Файл корректен и успешно загружен

        $dir_path= $movefile['url'];


    } else {

        echo $movefile['error'];
    }
}//конец цикла
8
Комментарии

Попробуйте объяснить, что вам нужно сделать.. Непонятно, чего вы хотите достичь.. И не используйте $_POST или $_FILES напрямую для вставки данных в базу данных.. Всегда санируйте их!!

Maikal Maikal
4 сент. 2015 г. 14:20:09

Извините, я обновил код, посмотрите снова пожалуйста

Hafiz Usman aftab Hafiz Usman aftab
4 сент. 2015 г. 14:35:49

Все еще не понимаю.. Что нужно сделать? Что вы имеете в виду под "обновлением нескольких метабоксов в цикле"? Вот пример загрузки нескольких файлов: http://stackoverflow.com/questions/4178873/php-uploading-multiple-files

Maikal Maikal
4 сент. 2015 г. 14:46:38

извините, опечатка, я хочу загружать несколько изображений, а не несколько метабоксов, очень извиняюсь, что потратил ваше время, но пожалуйста, подскажите, как можно загружать несколько изображений с помощью wp_handle_upload

Hafiz Usman aftab Hafiz Usman aftab
4 сент. 2015 г. 14:54:27

смотрите ссылку в моем предыдущем комментарии, там есть помеченный ответ, который подходит под ваши нужды.

Maikal Maikal
4 сент. 2015 г. 14:57:39

ошибка wp_handle_upload в приведенном выше коде

Hafiz Usman aftab Hafiz Usman aftab
4 сент. 2015 г. 15:28:38

я проверил вашу ссылку, но ничего не изменилось - файл так и не переместился

Hafiz Usman aftab Hafiz Usman aftab
4 сент. 2015 г. 15:30:11

у вас есть необходимые права на папки? вы можете загружать медиафайлы через админку? что именно говорит ошибка?

Maikal Maikal
4 сент. 2015 г. 15:32:14
Показать остальные 3 комментариев
Все ответы на вопрос 3
0

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

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" alt="Загруженное изображение" title="Превью изображения" />';
        }
        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 );

        }
      }
    }

}
4 сент. 2015 г. 15:57:41
8

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

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 "File is valid, and was successfully uploaded.\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'] . '/' . 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="%6$s"><img src="%6$s" height="100" width="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
4 сент. 2015 г. 15:08:22
Комментарии

ваш код не решает, если я правильно понял, вопрос. Насколько я понял, у него есть атрибут multiple в input...

Maikal Maikal
4 сент. 2015 г. 15:12:12

Да, ему нужно только это, попробуй разобраться в моем коде, прежде чем что-то говорить..

dev dev
4 сент. 2015 г. 15:15:32

я понимаю твой код.. в html у тебя что-то вроде: <input type="file" name"question_1" /><input type="file" name"question_2" /> и т.д., но у него <input type="file" name"questions" multiple /> и это большая разница в php при обработке загрузки..

Maikal Maikal
4 сент. 2015 г. 15:25:38

пожалуйста, отправьте ваш HTML-код, я также хочу увидеть вашу технику

Hafiz Usman aftab Hafiz Usman aftab
4 сент. 2015 г. 15:26:56

Я обновил свой код с HTML..@HafizUsmanaftab

dev dev
4 сент. 2015 г. 15:33:14

Да, но небольшая правка может сработать @Maikal

dev dev
4 сент. 2015 г. 15:33:57

Я понимаю, что нужно немного изменить, но глядя на его пример кода — он не знает PHP.. @dev

Maikal Maikal
4 сент. 2015 г. 16:23:04

@Maikal прав

Hafiz Usman aftab Hafiz Usman aftab
5 сент. 2015 г. 09:36:29
Показать остальные 3 комментариев
0

Функция для обработки загрузки изображения для input типа file с именем '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>';
    }
}
19 окт. 2024 г. 10:50:09