Caricamento File AJAX WordPress - FrontEnd

16 ago 2015, 20:25:24
Visualizzazioni: 57.2K
Voti: 6

Ho letto tutti i tutorial che ho trovato sul caricamento file AJAX in WordPress lato frontend. Al momento nessuno funziona per me. Quello che mi sembra più sensato è questo: http://theaveragedev.com/wordpress-files-ajax/

Ecco il mio codice:

Nel mio file template 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">È un caricamento file...</label>
    <input type="file" name="file_upload">
    <input type="submit" value="Vai">
</form>

Questo è in 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, // lato admin, da implementare sul frontend
        data: form_data,
        type: 'POST', 
        contentType: 'json',
        success: function(response){
            alert(response.message);
        }
    });
});

Questo è nel mio 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);

        // fai qualcosa con le informazioni del file...
        $response['message'] = 'Fatto!';
    }

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

add_action('wp_ajax_my_file_upload', 'handle_file_upload');

Ho provato ad aggiungere l'enctype all'elemento form ma non ha funzionato. L'errore che continuo a ricevere è un alert che dice 'undefined'. Qualcuno sa come posso correggere questo problema?

MODIFICA

Il problema 'undefined' è stato risolto modificando il file js per avere un evento click e cambiando il selettore per il loop degli input del form:

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, // lato admin, da implementare sul frontend
            data: form_data,
            type: 'POST',
            contentType: 'json',
            success: function (response) {
                alert(response.message);
            },
            error: function (response) {
                console.log('errore');
            }
        });
        return false;
    });
});

I file non vengono ancora caricati nella cartella media. Inoltre, vorrei ottenere l'URL del file caricato una volta completato l'upload.

Sto scrivendo sulla console l'oggetto file per vedere cosa succede. Ecco un esempio:

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

C'è qualcosa di sbagliato in questo e per questo motivo non sta caricando?

2
Commenti

Manca il parametro action nel tuo js. https://codex.wordpress.org/AJAX_in_Plugins

shanebp shanebp
16 ago 2015 21:22:44

Ciao Shane (non sei il Shane di BuddyPress?). Il parametro action viene passato come campo nascosto nel form. Ho deciso di usare una soluzione diversa. Sto usando Simple Ajax Upload per caricare i file in una directory diversa.

hootsmctoots84 hootsmctoots84
16 ago 2015 22:54:07
Tutte le risposte alla domanda 3
4
13

Ciao, ecco il codice per il tutorial sull'upload di file AJAX in WordPress front-end:

Nel mio file template 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="Salva">
 </form>

Questo è il codice in 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("Modulo inviato con successo")
                            },  
                            error: function (response) {
                             console.log('errore');
                            }

                        });
                    });

                });

Questo è il codice in 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'] : 'Titolo Supporto';

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

    // echo $movefile['url'];
      if ($movefile && !isset($movefile['error'])) {
         echo "File caricato con successo";
    } else {
        /**
         * Errore generato da _wp_handle_upload()
         * @see _wp_handle_upload() in wp-admin/includes/file.php
         */
        echo $movefile['error'];
    }
    die();
 }
18 apr 2017 11:04:28
Commenti

È una domanda o una risposta? Per favore non postare dump di codice senza alcuna spiegazione.

fuxia fuxia
18 apr 2017 11:27:05

ok abbiamo aggiornato il mio codice e questa è la risposta per il tutorial su come caricare file via AJAX in WordPress front-end

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

La risposta funziona bene. Perché non è stata segnata come risposta corretta? C'è un errore nel codice js. L'originale era --> }error: e quello corretto è }, error: (mancava la virgola dopo })

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

Wow.. Questo ha funzionato per me! Grazie!

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>Invia</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('Articolo creato con successo!!!');
    }
  });
  return false;
  });  
13 feb 2020 09:54:31
1

tutti i codici per 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'])) {
        // Carica il Logo dell'Espositore
        $file = $_FILES['uploaded_doc'];
        if (!empty($file)) {
            $uploads = wp_upload_dir();
            // Crea la directory 'user_avatar' se non esiste
            $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 "File non nel formato corretto";
                }

        }


}
}

}

10 lug 2017 10:22:22
Commenti

ho bisogno di una spiegazione

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