Carga de Archivos AJAX en WordPress - FrontEnd
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?

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

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

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

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

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

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