Вопрос или проблема
Попытка добавить плагин формы загрузки файлов для администратора.
Я пытаюсь создать форму загрузки с моей административной страницы через плагин.
Я собрал кое-какой код из нескольких источников, в том числе из этого:
https://www.htmlgoodies.com/beyond/cms/create-a-file-uploader-in-wordpress.html
Я получаю ошибку 500, когда отправляю форму, и не понимаю, почему или как отладить дальше.
Это неправильный способ создания формы загрузки файлов?
Мой плагин состоит из двух файлов:
wp-content/plugins/test_upload/test_upload.php
<?php
/*
Название плагина: test_upload
Версия: 1.0
*/
add_action('admin_menu', 'test_plugin_setup_menu');
function test_plugin_setup_menu(){
add_menu_page(
'Тестовая загрузка', 'Тестовая загрузка', 'manage_options', 'test-upload', 'upload_page'
);
}
function upload_page(){
?>
<h1>Форма тестовой загрузки</h1>
<form id="upload_form" action="/wp-content/plugins/test_upload/main.php" enctype="multipart/form-data" method="post" target="messages">
<p><input name="upload" id="upload" type="file" accept="text/csv" /></p>
<p><input id="btnSubmit" type="submit" value="Загрузить выбранный csv файл" /></p>
<iframe name="messages" id="messages"></iframe>
</form>
<?php
}
wp-content/plugins/test_upload/main.php
<?php
// предоставляет доступ к окружению WP
require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');
/* импорт
вы получаете следующую информацию для каждого файла:
$_FILES['field_name']['name']
$_FILES['field_name']['size']
$_FILES['field_name']['type']
$_FILES['field_name']['tmp_name']
*/
if($_FILES['upload']['name']) {
if(!$_FILES['upload']['error']) {
// проверяем файл
$new_file_name = strtolower($_FILES['upload']['tmp_name']);
// не должен превышать 300 КБ
if($_FILES['upload']['size'] > (300000)) {
// wp_die генерирует визуально привлекательный элемент сообщения
wp_die('Размер вашего файла слишком велик.');
}
else {
// файл прошел проверку
// Эти файлы необходимо включить как зависимости при работе на фронтенде.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
// Позвольте WordPress обработать загрузку.
// Помните, 'upload' - это имя нашего поля ввода файла в нашей форме выше.
$file_id = media_handle_upload( 'upload', 0 );
if ( is_wp_error( $file_id ) ) {
wp_die('Ошибка при загрузке файла!');
} else {
wp_die('Ваше меню было успешно импортировано.');
}
}
}
else {
// задайте это как возвращаемое сообщение
wp_die('Ошибка: '.$_FILES['upload']['error']);
}
}
?>
Оказалось, что код правильный, проблема в том, что сайт учебника, из которого я скопировал/вставил, использовал странные, нестандартные символы пробелов вместо обычных пробелов. Я заменил “фальшивые пробелы” на “обычные пробелы”, и теперь все работает.
Чтобы понять это, мне нужно было посмотреть в журнал ошибок Apache, а не в журнал ошибок WordPress. Это в конечном итоге привело меня сюда: https://stackoverflow.com/questions/11493751/unexpected-t-string-in-if-clause-with-spaces
Ответ или решение
Конечно, давайте разберем вашу задачу и предоставим полное решение на русском языке.
Вы пытаетесь реализовать форму загрузки файлов на странице администратора вашего сайта WordPress через плагин. Из вашего описания видно, что вы столкнулись с ошибкой 500 при отправке формы, и, как выяснилось, проблема была связана с некорректными символами пробелов в коде.
1. Основные моменты вашего кода
Ваш плагины состоят из двух файлов:
wp-content/plugins/test_upload/test_upload.php
wp-content/plugins/test_upload/main.php
В основном файле плагина вы создаете страницу, на которой располагается форма для загрузки файла. Форма пытается отправить файл на main.php
, который обрабатывает загрузку.
2. Проблема с ошибкой 500
Ошибка 500 (Internal Server Error) обычно возникает из-за неправильного кода на сервере, и в данном случае это может быть связано с нестандартными пробелами в коде или синтаксическими ошибками. Вы упомянули, что заменили "фейковые пробелы" на "обычные пробелы", что решило вашу проблему. Для других, кто сталкивается с подобной проблемой, рекомендую выполнить следующие шаги:
Шаги по отладке:
-
Проверьте логи сервера: Ошибки 500 могут быть документированы в логах Apache или Nginx. Это может дать вам представление о том, что происходит.
-
Синтаксические ошибки: Убедитесь, что в вашем коде нет неправильных символов или пробелов. Сохраняя файлы, используйте редактор, который показывает невидимые символы.
- Проверка настроек PHP: Убедитесь, что настройки вашего PHP (например,
file_uploads
,upload_max_filesize
,post_max_size
) поддерживают загрузку файлов.
3. Рекомендации по коду
Ниже приведу исправленный и улучшенный вариант ваших файлов.
wp-content/plugins/test_upload/test_upload.php
<?php
/*
Plugin Name: test_upload
Version: 1.0
*/
add_action('admin_menu', 'test_plugin_setup_menu');
function test_plugin_setup_menu() {
add_menu_page(
'Test Upload', 'Test Upload', 'manage_options', 'test-upload', 'upload_page'
);
}
function upload_page() {
?>
<h1>Test Upload Form</h1>
<form id="upload_form" action="<?php echo admin_url('admin-ajax.php'); ?>" enctype="multipart/form-data" method="post">
<input name="upload" id="upload" type="file" accept=".csv" required/>
<input id="btnSubmit" type="submit" value="Upload selected csv file"/>
<?php wp_nonce_field('file_upload_action', 'file_upload_nonce'); ?>
</form>
<?php
}
wp-content/plugins/test_upload/main.php
<?php
// Включаем доступ к окружению WP
require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');
if (isset($_POST['upload']) && check_admin_referer('file_upload_action', 'file_upload_nonce')) {
if ($_FILES['upload']['name']) {
if (!$_FILES['upload']['error']) {
// Проверка размера файла
if ($_FILES['upload']['size'] > (300 * 1024)) { // 300 KB
wp_die('Ваш файл превышает допустимый размер.');
} else {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
$file_id = media_handle_upload('upload', 0);
if (is_wp_error($file_id)) {
wp_die('Ошибка при загрузке файла!');
} else {
wp_die('Ваш файл успешно загружен.');
}
}
} else {
wp_die('Ошибка: ' . $_FILES['upload']['error']);
}
}
}
?>
4. Заключение
После внесенных исправлений и детального изучения логов, вы должны получить рабочую форму загрузки, которая будет обрабатывать файлы CSV. Всегда полезно генерировать и проверять nonce для повышения безопасности.
Если у вас остались вопросы или возникли новые проблемы, не стесняйтесь обращаться за помощью!