Унаследование имени файла при загрузки из поля
Помогите пожалуйста с кодом, дописать его. Никак не пойму как сделать, что бы при загрузки файла на сервер, он наследовал название из поля которое я вставил в уже готовый код.
Сразу оговорюсь был взят за основу легкий плагин, написанный одним человечком как пример загрузки файлов на сервер. Вот ссылка если что: https://tokmakov.msk.ru/blog/item/373
Я хочу сделать, что бы файл, переименовывался присваивая имя из того поля, в котором пользователь будет писать комментарий перед выбором файла для загрузки, поле должно быть обязательным.
Вот код php-файла
<?php /* Plugin Name: Загрузка файлов Plugin URI: https://tokmakov.msk.ru Description: Позволяет загружать файлы зарегистрированным пользователям. Version: 1.0 Author: Евгений Токмаков Author URI: https://tokmakov.msk.ru */ register_activation_hook(__FILE__, function() { // проверяем права пользователя на активацию плагинов if (!current_user_can('activate_plugins')) { return; } // для загрузки файлов из публичной части у всех // пользователей должны быть права на это $subscriber = get_role('subscriber'); if (!$subscriber->has_cap('upload_files')) { $subscriber->add_cap('upload_files'); } }); register_deactivation_hook(__FILE__, function() { // проверяем права пользователя на деактивацию плагинов if (!current_user_can('deactivate_plugins')) { return; } // удаляем права на загрузку файлов, которую // предоставили на этапе активации плагина $subscriber = get_role('subscriber'); if ($subscriber->has_cap('upload_files')) { $subscriber->remove_cap('upload_files'); } }); /* * Подключаем js-файл, который будет загружать файлы с использованием AJAX */ add_action('wp_enqueue_scripts', function () { wp_enqueue_script( 'tokmakov-upload-media-js', // будет зарегистрирован под этим именем plugin_dir_url( __FILE__ ) . 'script.js', ['jquery'], // должен быть подключен после jquery null, // версии нет, поэтому null true // подключаем перед закрывающим тегом body ); // передаем на сторону клиента объект tokmakov_upload_media, // который содержит все необходимое для работы js-кода $config = array( 'upload_url' => admin_url('async-upload.php'), 'ajax_url' => admin_url('admin-ajax.php'), 'nonce_upload' => wp_create_nonce('media-form'), 'nonce_remove' => wp_create_nonce('remove-media'), 'nonce_message' => wp_create_nonce('admin-message'), ); wp_localize_script( 'tokmakov-upload-media-js', 'tokmakov_upload_media', $config ); // подключаем файл стилей, чтобы красиво оформить наш блок загрузки wp_enqueue_style( 'tokmakov-upload-media-css', // будет зарегистрирован под этим именем plugin_dir_url(__FILE__) . 'style.css' ); }); /* * Регистрируем шорткод [tokmakov-upload-media], который позволит вставить форму * загрузки файлов в любое место */ add_shortcode('tokmakov-upload-media', function () { $html = ''; if (is_user_logged_in()) { $html = <<<HTML <input type="text"/> <div class="tokmakov-upload-media"> <span class="loader"></span> <span class="result"></span> <span class="preview"></span> <span class="upload"> <input type="file" accept="image/*,audio/*,video/*"> <button>Загрузить</button> </span> </div> HTML; } return $html; }); /* * Удаляем ранее загруженный файл, если пользователь передумал */ add_action('wp_ajax_tokmakov_remove_media', function () { check_ajax_referer('remove-media'); $file_id = filter_var($_POST['file_id'], FILTER_VALIDATE_INT); if (!$file_id) { wp_send_json_error( ['message' => 'Некорректный идентификатор файла'] ); } if (false === wp_delete_attachment($file_id, true)) { wp_send_json_error( ['message' => 'Ошибка при удалении'] ); } else { wp_send_json_success( ['message' => 'Файл успешно удален'] ); } }); /* * Отправляем почтовое сообщение администратору о загрузке файла */ add_action('wp_ajax_tokmakov_upload_media', function () { check_ajax_referer('admin-message'); $file_id = filter_var($_POST['file_id'], FILTER_VALIDATE_INT); $author_id = filter_var($_POST['author_id'], FILTER_VALIDATE_INT); if ( ! ($file_id && $author_id)) { wp_send_json_error( ['message' => 'Некорректные данные файла или пользователя'] ); } $email= get_option('admin_email'); $subject = 'Загружен новый файл'; $user = get_user_by('id', $author_id); $user_name = $user->data->user_nicename; $user_mail = $user->data->user_email; $message = sprintf( 'Загружен новый файл пользователем %s (%s). Ссылка на файл: %s', $user_name, $user_mail, wp_get_attachment_url($file_id) ); $result = wp_mail($email, $subject, $message); if ($result) { wp_send_json_success( ['message' => 'Сообщение администратору успешно отправлено'] ); } else { wp_send_json_error( ['message' => 'Ошибка при отправке сообщения администратору'] ); } }); //В результате работы шорткода на страницу будет добавлен html-код: <div class="tokmakov-upload-media"> <span class="loader"></span> <span class="result"></span> <span class="preview"></span> <span class="upload"> <input type="file" accept="image/*,audio/*,video/*"> <button>Загрузить</button> </span> </div>
Добавленное поле в коде от которого должно наследоваться имя файла
<input type="text"/>
А вот код Java-скрипта:
jQuery(document).ready(function($) { // при клике на кнопке отправляем ajax-запрос $('.tokmakov-upload-media button').on('click', function() { var $button = $(this); var $block = $button.parent().parent(); var $upload = $block.children('span.upload'); var $input = $upload.children('input[type="file"]'); var $preview = $block.children('span.preview'); var $result = $block.children('span.result'); // очищаем сообщение о предыдущих загрузках $result.empty(); // если файл был выбран — загружаем его на сервер if ($input.prop('files').length) { // данные, которые будем отправлять на сервер var data = new FormData(); data.append('action', 'upload-attachment'); data.append('async-upload', $input.prop('files')[0]); data.append('_wpnonce', tokmakov_upload_media.nonce_upload); // отправляем ajax-запрос $.ajax({ url: tokmakov_upload_media.upload_url, type: 'POST', data: data, processData: false, contentType: false, dataType: 'json', beforeSend: function() { // перед отправкой запроса скрываем поле выбора // файла и кнопку отправки $upload.hide(); // показываем сообщение, что идет загрузка; это // нужно для больших файлов $result.html('Загрузка файла …'); }, success: function(response) { if (response.success) { $result.html('Файл успешно загружен'); // показываем ссылку для просмотра файла var attr = {href: response.data.url, target: '_blank'}; $('<a>', attr).text('Открыть файл').appendTo($preview); $preview.append(' '); // пробел между ссылками // показываем ссылку для удаления файла... var $remove = $('<a>', {href: '#'}).text('Удалить файл').appendTo($preview); // ...и назначаем для нее обработчик события $remove.on('click', function (e) { e.preventDefault(); var data = new FormData(); data.append('action', 'tokmakov_remove_media'); data.append('file_id', response.data.id); data.append('_wpnonce', tokmakov_upload_media.nonce_remove); $.ajax({ url: tokmakov_upload_media.ajax_url, type: 'POST', data: data, processData: false, contentType: false, dataType: 'json', success: function(response) { $result.html(response.data.message); if (response.success) { $preview.empty(); // предлагаем загрузить другой файл $input.val(''); $upload.show(); } } }); }); // отправляем сообщение администратору о загрузке файла var data = new FormData(); data.append('action', 'tokmakov_upload_media'); data.append('file_id', response.data.id); data.append('author_id', response.data.author); data.append('_wpnonce', tokmakov_upload_media.nonce_message); $.ajax({ url: tokmakov_upload_media.ajax_url, type: 'POST', data: data, processData: false, contentType: false, dataType: 'json', }); } else { $result.html('Ошибка при загрузке файла'); // предлагаем загрузить еще раз $input.val(''); $upload.show(); } }, error: function () { $result.html('Обратитесь к администратору'); } }); } else { $result.text('Выберите файл для загрузки'); } }); });
Помогите пожалуйста с правильностью до писания кода к этому плагину. Я только недавно начал обучение в голове небольшая "каша" и не как не могу сообразить, как реализовать данную тему. Посмотрел на вашем сайте, вот тут вроде что-то похожее, но так и не понял, применимо это к моей теме или нет (хук wp_unique_filename). Вот страница https://wp-kama.ru/question/kak-pomenyat-nazvanie-imya-zagruzhaemogo-fajla
Если не затруднит, объясните более подробнее, что, да как. Пожалуйста!