Caricamento File AJAX WordPress - FrontEnd
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?

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();
}

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

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

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 })

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;
});

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";
}
}
}
}
}
