Cómo subir imágenes usando wp_handle_upload

4 sept 2015, 14:12:54
Vistas: 33.3K
Votos: 5

Hola, soy nuevo en WordPress. ¿Alguien puede decirme cómo puedo subir múltiples imágenes usando wp_handle_upload en un bucle?

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'] ) ) {
        // El archivo es válido y se subió correctamente.

        $dir_path= $movefile['url'];


    } else {

        echo $movefile['error'];
    }
}//fin del bucle
8
Comentarios

intenta explicar qué necesitas hacer... no está claro lo que quieres lograr.. y no uses $_POST o $_FILES para insertar datos directamente en la base de datos.. ¡siempre sanitízalos!

Maikal Maikal
4 sept 2015 14:20:09

lo siento, actualicé el código ahora, por favor revisa de nuevo

Hafiz Usman aftab Hafiz Usman aftab
4 sept 2015 14:35:49

Aún no entiendo... ¿qué se debe hacer? ¿a qué te refieres con 'actualizar múltiples meta boxes en un ciclo'? aquí hay un ejemplo de cómo subir múltiples archivos: http://stackoverflow.com/questions/4178873/php-uploading-multiple-files

Maikal Maikal
4 sept 2015 14:46:38

disculpa el error de escritura, quiero subir múltiples imágenes no múltiples metaboxes, de verdad lo siento por hacerte perder el tiempo pero por favor dime cómo puedo subir múltiples imágenes usando wp_handle_upload

Hafiz Usman aftab Hafiz Usman aftab
4 sept 2015 14:54:27

mira el enlace en mi comentario anterior, hay una respuesta marcada que se ajusta a tus necesidades.

Maikal Maikal
4 sept 2015 14:57:39

error en wp_handle_upload en el código anterior

Hafiz Usman aftab Hafiz Usman aftab
4 sept 2015 15:28:38

revisé tu enlace pero no hay nada diferente, el mismo archivo no se mueve

Hafiz Usman aftab Hafiz Usman aftab
4 sept 2015 15:30:11

¿tienes los permisos necesarios en las carpetas? ¿puedes subir medios a través del panel? ¿qué dice el error?

Maikal Maikal
4 sept 2015 15:32:14
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 3
0

Aquí está mi ejemplo de cómo subir múltiples imágenes:

add_action( 'add_meta_boxes',   'my_test_metabox' );

function my_test_metabox() {
    add_meta_box( 'my_test_metabox', 'Subida de archivos', '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 'Archivos subidos:' . "\r\n";
        foreach( $files as $file ) {
            echo '<img src="' . $file['url'] . '" width="100" height="100" />';
        }
        echo "\r\n";
    }
    echo 'Subir archivos:' . "\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 sept 2015 15:57:41
8

Hola, aquí está el código que utilicé en mi plugin, espero que lo entiendas y si tienes algún problema puedes preguntarme:-

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 {
            /**
             * Error generado por _wp_handle_upload()
             * @see _wp_handle_upload() en wp-admin/includes/file.php
             */
            echo $movefile['error'];
        }

        // $filename debería ser la ruta a un archivo en el directorio de subidas.
        //$filename = '/path/to/uploads/2013/03/filename.jpg';


        // Obtiene la ruta al directorio de subidas.
        $wp_upload_dir = wp_upload_dir();

        $url = $wp_upload_dir['url'] . '/' . basename( $filename );
        echo $url."<br>";

    }           
    }

Aquí está mi código 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>Pregunta: <input type="text" name="question[%1$s][question]" value="%2$s"> -- <span class="remove_question">%3$s</span><span class="add_answer">   Añadir Respuesta</span></p>',   $c,$questions['question'],__('Eliminar Pregunta'));
                for($i = 1; $i<=count($questions['answers']); $i++)
                {
                    if($questions['answers'][$i]['image'])
                    {
                        printf('<p>Opción %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Estado <input type="text" value="%2$s" name="question[%4$s][answers][%5$s][status]"> Imagen <input type="text" name="question[%4$s][answers][%5$s][image]" value="%6$s"><img src="%6$s" height="100" widht="100"> -- <span class="remove_answer">%3$s</span></p>', $questions['answers'][$i]['answer'] ,$questions['answers'][$i]['status'], __('Eliminar Respuesta'), $c, $i,$questions['answers'][$i]['image']);
                    }
                    else
                    {
                        printf('<p>Opción %5$s <input type="text" value="%1$s" name="question[%4$s][answers][%5$s][answer]"> Estado <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'], __('Eliminar Respuesta'), $c, $i);
                    }
                }
                $c = $c +1;
            }
        }
    }
}
 ?>
<span id="question_here"></span>
<span class="add_question"><?php _e('Añadir Pregunta'); ?></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>Pregunta: <input type="text" name="question['+count+'][question]" value=""> -- <span class="remove_question">Eliminar pregunta</span><span class="add_answer"> Añadir Respuesta</span></p>' );
            return false;
        });
        $(".remove_question").live('click', function() {
            $(this).parent().remove();
        });


        $(".add_answer").live('click',function(){
            countt = countt + 1;
            $('#question_here').append('<p>Respuesta <input type="text" name="question['+count+'][answers]['+countt+'][answer]"> Estado <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="Subir Imagen" /><span class="remove_answer">Eliminar</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 sept 2015 15:08:22
Comentarios

tu código no resuelve, si entendí correctamente, la pregunta. Según lo que entendí, él tiene el atributo multiple en el input..

Maikal Maikal
4 sept 2015 15:12:12

Si, solo necesita esto, trata de entender mi código, luego di algo..

dev dev
4 sept 2015 15:15:32

Entiendo tu código.. en html tienes algo como: <input type="file" name"question_1" /><input type="file" name"question_2" /> etc., pero él tiene <input type="file" name"questions" multiple /> y esa es una gran diferencia en php al manejar la subida..

Maikal Maikal
4 sept 2015 15:25:38

por favor envía también tu código html, quiero ver tu técnica

Hafiz Usman aftab Hafiz Usman aftab
4 sept 2015 15:26:56

He actualizado mi código con html..@HafizUsmanaftab

dev dev
4 sept 2015 15:33:14

Sí, pero con un pequeño ajuste puede funcionar @Maikal

dev dev
4 sept 2015 15:33:57

Entiendo que hay poco que cambiar, pero según veo su ejemplo de código, no sabe PHP.. @dev

Maikal Maikal
4 sept 2015 16:23:04

@Maikal tiene razón

Hafiz Usman aftab Hafiz Usman aftab
5 sept 2015 09:36:29
Mostrar los 3 comentarios restantes
0

función para manejar la subida de imágenes para el input tipo archivo con nombre 'email_image'.

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

    // Usar la función de WordPress para manejar la subida de archivos
    $movefile = wp_handle_upload($uploadedfile, $upload_overrides);

    if ($movefile && !isset($movefile['error'])) {
        // Guardar la URL de la imagen
        update_option('ccd_email_image', $movefile['url']);
        echo '<div class="updated"><p>¡Detalles de contacto guardados!</p></div>';
    } else {
        echo '<div class="error"><p>' . $movefile['error'] . '</p></div>';
    }
}
19 oct 2024 10:50:09