Попытка добавить плагин формы загрузки файлов для администратора.

Вопрос или проблема

Попытка добавить плагин формы загрузки файлов для администратора.

Я пытаюсь создать форму загрузки с моей административной страницы через плагин.

Я собрал кое-какой код из нескольких источников, в том числе из этого:
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) обычно возникает из-за неправильного кода на сервере, и в данном случае это может быть связано с нестандартными пробелами в коде или синтаксическими ошибками. Вы упомянули, что заменили "фейковые пробелы" на "обычные пробелы", что решило вашу проблему. Для других, кто сталкивается с подобной проблемой, рекомендую выполнить следующие шаги:

Шаги по отладке:

  1. Проверьте логи сервера: Ошибки 500 могут быть документированы в логах Apache или Nginx. Это может дать вам представление о том, что происходит.

  2. Синтаксические ошибки: Убедитесь, что в вашем коде нет неправильных символов или пробелов. Сохраняя файлы, используйте редактор, который показывает невидимые символы.

  3. Проверка настроек 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 для повышения безопасности.

Если у вас остались вопросы или возникли новые проблемы, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...