Încărcare fișiere prin AJAX în WordPress - FrontEnd
Am citit toate tutorialele despre încărcarea fișierelor prin AJAX în WordPress pe frontend pe care le-am putut găsi. Momentan nimic nu funcționează pentru mine. Cel care mi se pare cel mai logic este acesta: http://theaveragedev.com/wordpress-files-ajax/
Iată codul meu:
În fișierul meu 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">Este o încărcare de fișier...</label>
<input type="file" name="file_upload">
<input type="submit" value="Trimite">
</form>
Acesta este în 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, // pe partea de admin, trebuie să-l faci singur pe frontend
data: form_data,
type: 'POST',
contentType: 'json',
success: function(response){
alert(response.message);
}
});
});
Acesta este în 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);
// fă ceva cu informațiile fișierului...
$response['message'] = 'Gata!';
}
echo json_encode($response);
die();
}
Am încercat să adaug enctype la elementul form și nu a funcționat. Eroarea pe care o primesc constant este o alertă care spune 'undefined'. Știe cineva cum pot corecta această problemă?
EDITARE
Problema cu 'undefined' a dispărut acum deoarece am editat fișierul js pentru a avea un eveniment de click și am schimbat selectorul pentru bucla input-ului formularului:
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, // pe partea de admin, trebuie să-l faci singur pe frontend
data: form_data,
type: 'POST',
contentType: 'json',
success: function (response) {
alert(response.message);
},
error: function (response) {
console.log('eroare');
}
});
return false;
});
});
Fișierele tot nu sunt încărcate în folderul media. De asemenea, vreau să primesc URL-ul încărcat odată ce s-a încărcat.
Scriu în consolă obiectul file pentru a vedea ce se întâmplă. Iată un exemplu:
Object {security: "e6db2a6eee", _wp_http_referer: "/chat?sessionappid=138", action: "my_file_upload", file_upload: "C:\fakepath\download.jpg", "": "Go"}
Este ceva în neregulă cu acesta și de aceea nu se încarcă?
Bună! Ai nevoie să folosești acest cod pentru un tutorial de încărcare de fișiere AJAX în WordPress pe partea de front-end. Iată codul meu:
În fișierul meu de 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="Salvează">
</form>
Acesta este codul din 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("Formular trimis cu succes")
},
error: function (response) {
console.log('error');
}
});
});
});
Acesta este codul din 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'] : 'Titlu Suport';
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 "Fișier încărcat cu succes";
} else {
/**
* Eroare generată de _wp_handle_upload()
* @see _wp_handle_upload() în wp-admin/includes/file.php
*/
echo $movefile['error'];
}
die();
}

Este aceasta o întrebare sau un răspuns? Te rog să nu postezi fragmente de cod fără nicio explicație.

ok, am actualizat codul meu și acesta este răspunsul pentru tutorialul de încărcare de fișiere prin AJAX în WordPress pe partea de front-end

Răspunsul funcționează corect. De ce nu este marcat ca răspuns corect? Există o eroare în codul js. Originalul era --> }error: iar varianta corectă este }, error: (lipsește virgula după })

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>Trimite</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('Articol creat cu succes!!!');
}
});
return false;
});

toate codurile pentru 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'])) {
// Încărcare Logo Expozant
$file = $_FILES['uploaded_doc'];
if (!empty($file)) {
$uploads = wp_upload_dir();
// Crează directorul 'user_avatar' dacă nu există
$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 "Fișierul nu este în formatul corect";
}
}
}
}
}
