Carga de Archivos AJAX en WordPress - FrontEnd

16 ago 2015, 20:25:24
Vistas: 57.2K
Votos: 6

He estado leyendo todos los tutoriales que he podido encontrar sobre carga de archivos AJAX desde el frontend en WordPress. Por el momento ninguno me funciona. El que tiene más sentido para mí es este: http://theaveragedev.com/wordpress-files-ajax/

Aquí está mi código:

En mi archivo de plantilla example.php

<script>var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>"</script>
<form id="file_form">
    <?php wp_nonce_field('ajax_file_nonce', 'security'); ?>
    <input type="hidden" name="action" value="my_file_upload">
    <label for="file_upload">Es una carga de archivo...</label>
    <input type="file" name="file_upload">
    <input type="submit" value="Ir">
</form>

Esto está en ajax-file-upload.js

jQuery(document).ready(function(){
    var form_data = {};
    $(this).find('input').each(function(){
        form_data[this.name] = $(this).val();
    });
    $('#file_form').ajaxForm({
        url: ajax_url, // está en el lado admin, hazlo tú mismo en el frontend
        data: form_data,
        type: 'POST',
        contentType: 'json',
        success: function(response){
            alert(response.message);
        }
    });
});

Esto está en mi functions.php

function q_scripts(){
    $src = get_template_directory_uri().'/js/ajax-file-upload.js';
    wp_enqueue_script('my_ajax_file_uploader_thing', $src, array('jquery', 'jquery-form'));
}
add_action('init', 'q_scripts');

function handle_file_upload(){
    check_ajax_referer('ajax_file_nonce', 'security');

    if(!(is_array($_POST) && is_array($_FILES) && defined('DOING_AJAX') && DOING_AJAX)){
        return;
    }

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

    $response = array();

    foreach($_FILES as $file){
        $file_info = wp_handle_upload($file, $upload_overrides);

        // hacer algo con la información del archivo...
        $response['message'] = '¡Listo!';
    }

    echo json_encode($response);
    die();
}

He intentado agregar el enctype al elemento form y esto no funcionó. El error que sigo recibiendo es una alerta que dice 'undefined'. ¿Alguien sabe cómo puedo corregir este problema?

EDICIÓN

El problema de 'undefined' ya se ha solucionado ya que edité el archivo js para tener un evento click y cambié el selector para el bucle de entrada del formulario:

jQuery(document).ready(function($){
    $('#file_form :submit').click(function() {
        var form_data = {};
        $('#file_form').find('input').each(function () {
            form_data[this.name] = $(this).val();
        });
        console.log(form_data);
        $('#file_form').ajaxForm({
            url: ajax_url, // está en el lado admin, hazlo tú mismo en el frontend
            data: form_data,
            type: 'POST',
            contentType: 'json',
            success: function (response) {
                alert(response.message);
            },
            error: function (response) {
                console.log('error');
            }
        });
        return false;
    });
});

Los archivos aún no se están subiendo a la carpeta de medios. También quiero obtener la URL de carga una vez que se haya subido.

Estoy escribiendo en la consola el objeto file para ver qué está sucediendo. Aquí hay un ejemplo:

Object {security: "e6db2a6eee", _wp_http_referer: "/chat?sessionappid=138", action: "my_file_upload", file_upload: "C:\fakepath\download.jpg", "": "Go"}

¿Hay algo mal con esto y es por eso que no se está cargando?

2
Comentarios

Te falta el parámetro action en tu js. https://codex.wordpress.org/AJAX_in_Plugins

shanebp shanebp
16 ago 2015 21:22:44

Hola Shane (¿no eres Shane de BuddyPress?). El parámetro action se pasa como un campo oculto en el formulario. He decidido usar una solución diferente. Estoy usando Simple Ajax Upload para subir los archivos a un directorio diferente.

hootsmctoots84 hootsmctoots84
16 ago 2015 22:54:07
Todas las respuestas a la pregunta 3
4
13

Hola, aquí tienes un tutorial para cargar archivos mediante AJAX en el front-end de WordPress con este código:

En mi archivo de plantilla example.php

<form enctype="multipart/form-data">
   <input type="text" name="support_title" class="support-title">
   <input type="file" id="sortpicture" name="upload">
   <input class="save-support" name="save_support" type="button" value="Guardar">
 </form>

Este es el código en ajax-file-upload.js

jQuery(document).on('click', '.save-support', function (e) {
    var supporttitle = jQuery('.support-title').val();
    var querytype = jQuery('.support-query').val();
    var file_data = jQuery('#sortpicture').prop('files')[0];
    
    var form_data = new FormData();
    
    if (supporttitle == '') {
        jQuery('.support-title').css({"border": "1px solid red"});
        return false;
    } else {
        jQuery('.support-title').css({"border": "1px solid #e3ecf0"});
    }

    form_data.append('file', file_data);
    form_data.append('action', 'md_support_save');
    form_data.append('supporttitle', supporttitle);

    jQuery.ajax({
        url: '<?php echo admin_url("admin-ajax.php"); ?>',
        type: 'post',
        contentType: false,
        processData: false,
        data: form_data,
        success: function (response) {
            jQuery('.Success-div').html("Formulario enviado correctamente");
        },  
        error: function (response) {
            console.log('error');
        }
    });
});

Este es el código en functions.php

add_action('wp_ajax_md_support_save', 'md_support_save');
add_action('wp_ajax_nopriv_md_support_save', 'md_support_save');

function md_support_save(){
    $support_title = !empty($_POST['supporttitle']) ? 
    $_POST['supporttitle'] : 'Título de Soporte';

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

    if ($movefile && !isset($movefile['error'])) {
        echo "Archivo subido correctamente";
    } else {
        /**
         * Error generado por _wp_handle_upload()
         * @see _wp_handle_upload() en wp-admin/includes/file.php
         */
        echo $movefile['error'];
    }
    die();
}
18 abr 2017 11:04:28
Comentarios

¿Eso es una pregunta o una respuesta? Por favor no publiques volcados de código sin ninguna explicación.

fuxia fuxia
18 abr 2017 11:27:05

ok, hemos actualizado mi código y esta es la respuesta para el tutorial de subida de archivos AJAX en el front-end de WordPress

Adnan Limdiwala Adnan Limdiwala
18 abr 2017 16:36:11

La respuesta funciona bien. ¿Por qué esto no está marcado como respuesta correcta? Hay un error en el código js. El original era --> }error: y el correcto es }, error: (faltaba la coma después de })

Alaksandar Jesus Gene Alaksandar Jesus Gene
14 nov 2017 15:43:30

¡Guau... Esto funcionó para mí! ¡Gracias!

Neenu Chandran Neenu Chandran
11 ago 2020 08:37:29
0

HTML

<form id="article_form" name="article_form" class="wordpress-ajax-form" method="post" action="<?php echo admin_url('admin-ajax.php'); ?>" enctype="multipart/form-data" >
          <input type="file" name="uploadedfiles" id="uploadedfiles"  accept="image/*"  >
          <br>
          <input type="hidden" name="action" value="custom_action">
          <br>
          <button>Enviar</button>
       </form>

JS

 $(".wordpress-ajax-form").submit(function(evt){  

  evt.preventDefault();
  var formData = new FormData($(this)[0]);

  $.ajax({
    url: $('#article_form').attr('action'),
    type: 'POST',
    data: formData,
    async: true,
    cache: false,
    contentType: false,
    enctype: 'multipart/form-data',
    processData: false,
    success: function (response) {
    // alert(response);
    alert('¡Artículo creado exitosamente!');
    }
  });
  return false;
  });  
13 feb 2020 09:54:31
1

todos los códigos para function.php


if (!empty($_POST) || (!empty($_FILES))) {
    require_once (ABSPATH . '/wp-admin/includes/file.php');
    require_once (ABSPATH . '/wp-admin/includes/image.php');
    global $wpdb;
    if (isset($_POST['submit'])) {
        // Subir Logo del Expositor
        $file = $_FILES['uploaded_doc'];
        if (!empty($file)) {
            $uploads = wp_upload_dir();
            // Crear directorio 'user_avatar' si no existe
            $folderPath = ABSPATH . 'wp-content/uploads/Reports';
            if (!file_exists($folderPath)) {
                mkdir($folderPath, 0777, true);
            }

                 $ext = end((explode(".", $_FILES['uploaded_doc']['name'])));            
                if( $ext== 'pdf' || $ext== 'docx' ){                    
                $ABSPATH_userAvatarFullImage = ABSPATH . 'wp-content/uploads/Reports/' . time() . '.' . $ext;
                if (move_uploaded_file($_FILES['uploaded_doc']['tmp_name'], $ABSPATH_userAvatarFullImage)) {                        
                    $data = array(
                    'title' => $_POST['title'],
                    'arabic_title' => $_POST['arabic_title'],
                    'principle_investigators' => $_POST['principle_investigators'],
                    'co_investgators' => $_POST['co_investgators'],
                    'coverage_area' => $_POST['coverage_area'],
                    'publication_year' => $_POST['publication_year'],
                    'types' => $_POST['types'],
                    'uploaded_doc' => $_FILES['uploaded_doc']['name'],
                    'create_date'=> date('Y-m-d H:i:s') 

                    );          
        $table = $wpdb->prefix . "reports_publication";         
        $result = $wpdb->insert($table, $data);

                }
                echo "1";
                }else{
                    echo "Archivo no tiene el formato correcto";
                }

        }


}
}

}

10 jul 2017 10:22:22
Comentarios

necesito una explicación

730wavy 730wavy
11 nov 2017 20:07:34