WordPress AJAX Загрузка Файлов - Фронтенд

16 авг. 2015 г., 20:25:24
Просмотры: 57.2K
Голосов: 6

Я просмотрел все туториалы по загрузке файлов через AJAX во WordPress на фронтенде, которые смог найти. Пока ничего не работает. Наиболее понятным мне показался этот: http://theaveragedev.com/wordpress-files-ajax/

Вот мой код:

В файле шаблона 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">Это загрузка файла...</label>
    <input type="file" name="file_upload">
    <input type="submit" value="Отправить">
</form>

Это в файле 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, // на стороне админки, сделайте сами на фронтенде
        data: form_data,
        type: 'POST',
        contentType: 'json',
        success: function(response){
            alert(response.message);
        }
    });
});

Это в моем 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);

        // сделать что-то с информацией о файле...
        $response['message'] = 'Готово!';
    }

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

add_action('wp_ajax_my_file_upload', 'handle_file_upload');

Я пробовал добавить enctype в элемент формы, но это не помогло. Я продолжаю получать оповещение с текстом 'undefined'. Кто-нибудь знает, как исправить эту проблему?

РЕДАКТИРОВАНИЕ

Проблема с 'undefined' теперь исчезла, так как я отредактировал js файл, добавив событие click и изменив селектор для цикла ввода формы:

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, // на стороне админки, сделайте сами на фронтенде
            data: form_data,
            type: 'POST',
            contentType: 'json',
            success: function (response) {
                alert(response.message);
            },
            error: function (response) {
                console.log('error');
            }
        });
        return false;
    });
});

Файлы все еще не загружаются в папку медиафайлов. Я также хочу получить URL загруженного файла после загрузки.

Я вывожу в консоль объект файла, чтобы видеть, что происходит. Вот пример:

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

Есть ли что-то неправильное в этом и является ли это причиной того, что загрузка не работает?

2
Комментарии

В вашем JavaScript отсутствует параметр action. https://codex.wordpress.org/AJAX_in_Plugins

shanebp shanebp
16 авг. 2015 г. 21:22:44

Привет, Шейн (разве ты не Шейн из BuddyPress?). Параметр action передается как скрытое поле в форме. Я решил использовать другое решение. Я использую Simple Ajax Upload для загрузки файлов в другую директорию.

hootsmctoots84 hootsmctoots84
16 авг. 2015 г. 22:54:07
Все ответы на вопрос 3
4
13

Привет! Вот код для реализации загрузки файлов через AJAX на фронтенде WordPress.

В моем файле шаблона 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="Сохранить">
 </form>

Код в файле ajax-file-upload.js:

jQuery(document).on('click', '.save-support', function (e) {
    var supporttitle = jQuery('.support-title').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("Форма успешно отправлена")
        },  
        error: function (response) {
            console.log('Ошибка');
        }
    });
});

Код в 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'] : 'Название поддержки';

    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 "Файл успешно загружен";
    } else {
        // Ошибка, сгенерированная _wp_handle_upload()
        // @see _wp_handle_upload() в wp-admin/includes/file.php
        echo $movefile['error'];
    }
    die();
}
18 апр. 2017 г. 11:04:28
Комментарии

Это вопрос или ответ? Пожалуйста, не публикуйте дампы кода без каких-либо пояснений.

fuxia fuxia
18 апр. 2017 г. 11:27:05

Хорошо, мы обновили мой код, и это ответ для руководства по загрузке файлов через AJAX во фронтенде WordPress

Adnan Limdiwala Adnan Limdiwala
18 апр. 2017 г. 16:36:11

Ответ работает отлично. Почему он не отмечен как правильный? В коде js была ошибка. Исходный вариант был --> }error: а правильный вариант }, error: (пропущена запятая после })

Alaksandar Jesus Gene Alaksandar Jesus Gene
14 нояб. 2017 г. 15:43:30

Вау... Это сработало для меня! Спасибо!

Neenu Chandran Neenu Chandran
11 авг. 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>Отправить</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('Статья успешно создана!!!');
    }
  });
  return false;
  });  
13 февр. 2020 г. 09:54:31
1

все коды для 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'])) {
        // Загрузка логотипа экспонента
        $file = $_FILES['uploaded_doc'];
        if (!empty($file)) {
            $uploads = wp_upload_dir();
            // Создаем директорию 'user_avatar', если она не существует
            $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 "Файл не в том формате";
                }

        }


}
}

}

10 июл. 2017 г. 10:22:22
Комментарии

нужно объяснение

730wavy 730wavy
11 нояб. 2017 г. 20:07:34