Добавьте загрузку файла с проверкой в пользовательскую форму.

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

У меня есть страница с кастомной формой обратной связи, в которую я пытаюсь добавить поле загрузки, которое проверяет размер и тип файла. До добавления проверки всё работало.

    <?php
            /* Template Name: Contact-Page-with-upload
            *
            * Кастомная страница обратной связи на PHP. Добавьте или измените поля формы на строке 28 и в самой форме.
            * jQuery используется для добавления/удаления класса ошибки Bootstrap для недействительных полей.
            */

            /**
             * Получение класса ошибки
             *
             * @return string;
             */
            function getErrorClass($failedKeys, $key)
            { 
              if(isset($failedKeys) && is_array($failedKeys) && in_array($key, $failedKeys))
              {
                return 'has-error';
              }

              return '';
            }

            if(isset($_POST) && !empty($_POST))
            {
              // Новая строка
              $nL = "<br />";

              // Функция генерации ответа
              $response = "";

              // Функция для генерации ответа
              function my_contact_form_generate_response($type, $message)
              {
                global $response;

                if($type == "success") $response = "<div class="success alert alert-success" role="alert" id='success-message'>{$message} <i class="glyphicon glyphicon-thumbs-up"></i></div>";
                else $response = "<div class="error alert alert-danger" role="alert" id='error-message'>{$message} <i class="glyphicon glyphicon-thumbs-down"></i> </div>";
              }

              // Сообщения об ответах
              $missing_content = "Пожалуйста, заполните всю информацию.";
              $email_invalid = "Адрес электронной почты недействителен.";
              $message_unsent = "Сообщение не отправлено. Попробуйте еще раз.";
              $message_sent = "Спасибо! Ваше сообщение отправлено.";

              // Определите используемые поля, заголовок => имя поля
              // Это может быть использовано для добавления полей в автоматическую проверку ниже.
              $userVariables = [
                'Имя' => 'first_name',
                'Фамилия' => 'last_name',
                'Телефон' => 'phone',
                'Электронная почта' => 'email',
                'Комментарий' => 'comment'
              ];

              // Инициализация переменных для неудачных и успешных проверенных полей
              $failedFields = [];
              $validFields = [];
              $failedKeys = [];

              // Перебор каждой переменной, определенной выше, и проверка её допустимости как ненулевой строки.
              // Если успешно, добавьте это в массив сообщения и удалите все теги для безопасности, и обрежьте пробелы
              if(!empty($_POST))
              {
                foreach($userVariables as $title => $userField)
                {
                  // Если нашему полю не удалось пройти проверку, мы добавляем его в массив неудачных полей
                  if(!isset($_POST[$userField]) || !is_string($_POST[$userField]) || $_POST[$userField] == '')
                  {
                    $failedFields[] = $title;
                    $failedKeys[] = $userField;
                  }
                  // Если успешно, добавьте это в массив успешных полей и обрежьте/очистите содержимое
                  else
                  {
                    $validFields[$title] = trim(strip_tags(($_POST[$userField])));
                  }
                } 
              }

              // Если у нас больше 0 неудачных полей, мы отправим ответ об ошибке на форму
              if(!empty($failedFields))
              {
                // Соедините сообщение с неудачными полями в сообщении
                $failureMessage = "Следующие поля обязательны: " . implode(', ', $failedFields);
                my_contact_form_generate_response("error", $failureMessage);
              }

              // Создание HTML сообщения
              $message="<html><head>";
              // определение используемого шрифта Google в сообщении
              $message .='<style>@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600");</style>';
              $message .='</head>';
              $message .='<body style="font-family:Open Sans, sans-serif; font-weight:400;">';
              $message .= "<h3>Сообщение из формы обратной связи на сайте" .get_bloginfo('name') ."</h3>";
              $message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';

              // Если у нас есть проверенные поля, перечисленные выше, мы соединим сообщение для тела электронной почты, затем закроем теги таблицы, тела и html
              if(!empty($validFields))
              {
                foreach($validFields as $title => $value)
                {
                  $message .= "<tr style="background: #eee;"><td style="width:200px; font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 600;">" . $title . ":</td><td style="font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 400;">" . $value . "</td></tr>";
                }
              }

              $message .= '</table></body></html>';
              // конец сообщения

              /**
              *
              * Обработка вложения файла
              *
              */
              if ( ! function_exists( 'wp_handle_upload' ) ) 
              {
                  require_once( ABSPATH . 'wp-admin/includes/file.php' );
              }

              $uploadedFile = false;
              $movefile = false;

              if(isset($_FILES['attachmentFile']))
              {
                $uploadedFile = $_FILES['attachmentFile'];

                // Получение информации о загруженном файле
                $name_of_uploaded_file = basename($uploadedFile['name']);

                // получение расширения загруженного файла
                $type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);

                $size_of_uploaded_file = $uploadedFile["size"] / 1024; // размер в КБ

                // Настройки
                $max_allowed_file_size = 2000; // размер в КБ
                $allowed_extensions = array("jpg", "jpeg", "png", "pdf");
                $upload_overrides = array( 'test_form' => false );

                // Проверки
                if($size_of_uploaded_file > $max_allowed_file_size )
                {
                  $failedKeys[] = 'attachmentFile';
                  my_contact_form_generate_response("error", "Размер файла должен быть менее $max_allowed_file_size");
                }

                //------ Проверка расширения файла 
                $allowed_ext = false;

                for($i = 0; $i <sizeof($allowed_extensions); $i++)
                {
                  if(strcasecmp($allowed_extensions[$i], $type_of_uploaded_file) == 0)
                  {
                    $allowed_ext = true;
                  }
                }

                if(!$allowed_ext)
                {
                  $failedKeys[] = 'attachmentFile';
                  my_contact_form_generate_response("error", "Загруженный файл не поддерживается. Поддерживаются только следующие типы файлов: ".implode(', ',$allowed_extensions));
                }

                $movefile = wp_handle_upload($uploadedfile, $upload_overrides);

                var_dump($movefile); die();

                if($movefile && ! isset( $movefile['error'] ) ) {

                    $movefile['url'];
                }
              }

              // Переменные почтовой рассылки
              $to = get_option('admin_email');
              $subject = "Сообщение из формы обратной связи на ".get_bloginfo('name');
              $headers="From: ". $email . "\r\n" . 'Reply-To: ' . $email . "\r\n";
              $attachments = $movefile && isset($movefile['file']) ? array($movefile['file']) : false;

              if(empty($failedFields) && isset($_POST['gotcha']) && $_POST['gotcha'] == '')
              {
                // Добавление поддержки HTML-типа ответа к электронной почте
                add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));

                // Создание сообщения и отправка, возвращение переменной успеха
                $sent = wp_mail($to, $subject, $message, $headers, isset($attachments) && is_array($attachments) && !empty($attachments) ? $attachments : []);

                // Если успешно, вернуть успех на форму
                if($sent) 
                {
                  my_contact_form_generate_response("success", $message_sent); 
                }
                // В случае неудачи, вернуть ответ об ошибке на форму
                else 
                {
                  my_contact_form_generate_response("error", $message_unsent); 
                  unlink( $movefile['file'] );
                }
              }
              else if($_POST['submitted'] || !empty($failedFields)) 
              {
                my_contact_form_generate_response("error", $failureMessage);
              }
            }
            ?>
            <!-- Конец логики формы -->

            <?php get_header(); ?>
            <div id="main" class="clearfix wow fadeIn" role="main">
              <div id="content">
                <div class="container">
                  <div class="row">
                    <div class="col-sm-12">
                      <h1 class="page-title">Свяжитесь с нами</h1>
                        <div id="respond">

                        <?php echo $response; ?>
                          <form class="form-horizontal well" action="<?php the_permalink(); ?>" method="post" id="contact_form" enctype="multipart/form-data">
                            <fieldset>
                              <legend>У вас есть вопросы, вы заинтересованы в продукте или хотите узнать о вариантах доставки?</legend>
                              <p>Пожалуйста, заполните контактную форму, и мы свяжемся с вами как можно скорее!</p>
                                <div class="col-sm-6">
                                  <!-- Текстовый ввод -->
                                  <div class="form-group <?php echo getErrorClass($failedKeys, 'first_name'); ?>">
                                    <label class="control-label">Имя</label>
                                      <div class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                        <input name="first_name" placeholder="Имя" class="form-control" type="text" value="<?php echo esc_attr($_POST['first_name']); ?>" required>
                                      </div>
                                    </div>
                                    <!-- Текстовый ввод -->
                                    <div class="form-group <?php echo getErrorClass($failedKeys, 'last_name'); ?>">
                                      <label class="control-label">Фамилия</label>
                                      <div class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                        <input name="last_name" placeholder="Фамилия" class="form-control" type="text" value="<?php echo esc_attr($_POST['last_name']); ?>" required>
                                      </div>
                                    </div>
                                  </div><!--/.col-->
                                  <div class="col-sm-6">
                                    <!-- Текстовый ввод -->
                                    <div class="form-group <?php echo getErrorClass($failedKeys, 'email'); ?>">
                                      <label class="control-label">Электронная почта</label>
                                      <div class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
                                        <input name="email" placeholder="Адрес электронной почты" class="form-control" type="email" value="<?php echo esc_attr($_POST['email']); ?>" required>
                                      </div>
                                    </div>
                                    <!-- Текстовый ввод -->
                                    <div class="form-group <?php echo getErrorClass($failedKeys, 'phone'); ?>">
                                      <label class="control-label">Телефон</label>
                                      <div class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-earphone"></i></span>
                                        <input name="phone" placeholder="(855)555-1212" class="form-control" type="text" value="<?php echo esc_attr($_POST['phone']); ?>" required>
                                      </div>
                                    </div>
                                  </div><!--/.col-->
                                  <div class="col-sm-12">
                                    <!-- Текстовая область -->
                                    <div class="form-group <?php echo getErrorClass($failedKeys, 'comment'); ?>">
                                      <label class="control-label">Ваше сообщение</label>
                                      <div class="input-group">
                                        <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
                                        <textarea class="form-control" name="comment" required><?php echo esc_textarea($_POST['comment']); ?></textarea>
                                      </div>
                                    </div>
                                    <div class="form-group <?php echo getErrorClass($failedKeys, 'file'); ?>">
                                       <label class="control-label">Прикрепить файл</label>
                                              <input type="file" name="attachmentFile">
                                    </div><!-- /.form-group -->
                                    <!-- Поле Anti-Spam -->
                                    <div class="form-group hidden" id="gotcha">
                                      <label class="control-label">Оставьте это поле пустым</label>
                                      <div class="input-group">
                                        <input name="gotcha" class="form-control" type="text">
                                      </div>
                                    </div>
                                    <div class="form-group hidden">
                                      <input type="hidden" name="submitted" value="1">
                                    </div>
                                    <!-- Кнопка -->
                                    <div class="form-group">
                                      <button type="submit" class="btn btn-info">Отправить
                                        <span class="glyphicon glyphicon-send"></span>
                                      </button>
                                    </div>
                                  </div><!--/.col-md-8-->
                                </fieldset>
                              </form>                   
                              <script>
                                // Добавление/удаление класса ошибки Bootstrap для недействительных полей при вводе и утрате фокуса
                                jQuery('#contact_form :input').keyup(function ()
                                {
                                  var formElement = jQuery(this);
                                      formGroup = formElement.closest('.form-group');

                                  if(formGroup.hasClass('has-error') && jQuery.trim(formElement.val()).length)
                                  {
                                    formGroup.removeClass('has-error');
                                  }
                                });

                                jQuery('#contact_form :input').blur(function ()
                                {
                                  var formElement = jQuery(this);
                                      formGroup = formElement.closest('.form-group');

                                  if(jQuery.trim(formElement.val()).length==0)
                                  {
                                    formGroup.addClass('has-error');
                                  }
                                });
                              </script>

                          </div><!--/.respond-->
                      </div><!--/.col-->
                  </div><!-- /.row-->
                </div><!--/.container-->
                <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                <article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix'); ?> role="article">
                    <section class="post_content">
                        <?php the_content(); ?>
                    </section><!-- end article header -->
                </article><!-- end article -->

                <?php endwhile; ?>
                <?php else : ?>
                <article id="post-not-found">
                  <div class="container">
                    <div class="row">
                      <div class="col-sm-12">
                        <header>
                          <h1><?php _e("Not Found", "JD_BOOTSTRAP"); ?></h1>
                        </header>
                        <section class="post_content">
                          <p><?php _e("Извините, но запрашиваемый ресурс не найден на этом сайте.", "JD_BOOTSTRAP"); ?></p>
                        </section>
                      </div><!-- /.col-sm-12 -->
                    </div><!-- /.row -->
                  </div><!-- /.container -->          
                </article>

            <?php endif; ?>

              </div><!-- /content -->
            </div><!-- /main -->
                <?php get_footer(); ?>

    <?php
      /* Template Name: Contact-Page-with-upload
      *
      * Кастомная страница обратной связи на PHP. Добавьте или измените поля формы на строке 28 и в самой форме.
      * jQuery используется для добавления/удаления класса ошибки Bootstrap для недействительных полей.
      */

      /**
       * Получение класса ошибки
       *
       * @return string;
       */

      $response="";

      function getErrorClass($failedKeys, $key)
      { 
        if(isset($failedKeys) && is_array($failedKeys) && in_array($key, $failedKeys))
        {
          return 'has-error';
        }

        return '';
      }

      if(isset($_POST) && !empty($_POST))
      {
        // Новая строка
        $nL = "<br />";

        // Функция генерации ответа

        // Функция для генерации ответа
        function my_contact_form_generate_response($type, $message)
        {
          global $response;

          if($type == "success") 
          {
            $response = "<div class="success alert alert-success" role="alert" id='success-message'> <i class="glyphicon glyphicon-thumbs-up"></i> &nbsp; {$message}</div>";
          }
          else 
          {
            $response = "<div class="error alert alert-danger" role="alert" id='error-message'><i class="glyphicon glyphicon-warning-sign"></i> &nbsp; {$message} </div>";
          }
        }

        // Сообщения об ответах
        $missing_content = "Пожалуйста, заполните всю информацию.";
        $email_invalid = "Адрес электронной почты недействителен.";
        $message_unsent = "Сообщение не отправлено. Попробуйте еще раз.";
        $message_sent = "Спасибо! Ваше сообщение отправлено.";

        // Определите используемые поля, заголовок => имя поля
        // Это может быть использовано для добавления полей в автоматическую проверку ниже.
        $userVariables = [
          'Имя' => 'first_name',
          'Фамилия' => 'last_name',
          'Телефон' => 'phone',
          'Электронная почта' => 'email',
          'Комментарий' => 'comment'
        ];

        // Инициализация переменных для неудачных и успешных проверенных полей
        $failedFields = [];
        $validFields = [];
        $failedKeys = [];

        // Перебор каждой переменной, определенной выше, и проверка её допустимости как ненулевой строки.
        // Если успешно, добавьте это в массив сообщения и удалите все теги для безопасности, и обрежьте пробелы
        if(!empty($_POST))
        {
          foreach($userVariables as $title => $userField)
          {
            // Если нашему полю не удалось пройти проверку, мы добавляем его в массив неудачных полей
            if(!isset($_POST[$userField]) || !is_string($_POST[$userField]) || $_POST[$userField] == '')
            {
              $failedFields[] = $title;
              $failedKeys[] = $userField;
            }
            // Если успешно, добавьте это в массив успешных полей и обрежьте/очистите содержимое
            else
            {
              $validFields[$title] = trim(strip_tags(($_POST[$userField])));
            }
          } 
        }

        // Если у нас больше 0 неудачных полей, мы отправим ответ об ошибке на форму
        if(!empty($failedFields))
        {
          // Соедините сообщение с неудачными полями в сообщении
          $failureMessage = "Следующие поля обязательны: " . implode(', ', $failedFields);
          my_contact_form_generate_response("error", $failureMessage);
        }
        // Создание HTML сообщения
        $message="<html><head>";
        // определение используемого шрифта Google в сообщении
        $message .='<style>@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,600");</style>';
        $message .='</head>';
        $message .='<body style="font-family:Open Sans, sans-serif; font-weight:400;">';
        $message .= "<h3>Сообщение из формы обратной связи на сайте" .get_bloginfo('name') ."</h3>";
        $message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';

        // Если у нас есть проверенные поля, перечисленные выше, мы соединим сообщение для тела электронной почты, затем закроем теги таблицы, тела и html
        if(!empty($validFields))
        {
          foreach($validFields as $title => $value)
          {
            $message .= "<tr style="background: #eee;"><td style="width:200px; font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 600;">" . $title . ":</td><td style="font-family: Open Sans, sans-serif; margin: 0px; padding:8px; font-weight: 400;">" . $value . "</td></tr>";
          }
        }

        $message .= '</table></body></html>';
        // конец сообщения

        /**
        *
        * Обработка вложения файла
        *
        */
        if ( ! function_exists( 'wp_handle_upload' ) ) 
        {
            require_once( ABSPATH . 'wp-admin/includes/file.php' );
        }

        $uploadedFile = false;
        $movefile = false;
        $failedAttachment = false;

        if(isset($_FILES['attachmentFile']) && file_exists($_FILES['attachmentFile']['tmp_name']))
        {
          $uploadedFile = $_FILES['attachmentFile'];

          // Получение информации о загруженном файле
          $name_of_uploaded_file = basename($uploadedFile['name']);

          // получение расширения загруженного файла
          $type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);

          $size_of_uploaded_file = $uploadedFile["size"] / 1024; // размер в КБ

          // Настройки
          $max_allowed_file_size = 2000; // размер в КБ
          $allowed_extensions = array("jpg", "jpeg", "png", "pdf");
          $upload_overrides = array( 'test_form' => false );

          // Проверки
          if($size_of_uploaded_file > $max_allowed_file_size)
          {
            $failedKeys[] = 'attachmentFile';
            $failedFields[] = 'Загруженный файл';
            $failedAttachment = true;
            my_contact_form_generate_response("error", "Размер загруженного файла должен быть менее ". round($max_allowed_file_size / 1024). "mb ");
          }

          //------ Проверка расширения файла 
          $allowed_ext = false;

          for($i = 0; $i <sizeof($allowed_extensions); $i++)
          {
            if(strcasecmp($allowed_extensions[$i], $type_of_uploaded_file) == 0)
            {
              $allowed_ext = true;
            }
          }

          if(!$allowed_ext)
          {
            $failedKeys[] = 'attachmentFile';
            $failedFields[] = 'Загруженный файл';
            $failedAttachment = true;
            my_contact_form_generate_response("error", "Загруженный файл не поддерживается. Поддерживаются только следующие типы файлов: ".implode(', ',$allowed_extensions));
          }

          $movefile = wp_handle_upload($uploadedFile, $upload_overrides);

          if($movefile && ! isset( $movefile['error'] ) ) {

              $movefile['url'];
          }
        }

        if(empty($failedFields) && !$failedAttachment && isset($_POST['gotcha']) && $_POST['gotcha'] == '')
        {
          // Переменные почтовой рассылки
          $to = get_option('admin_email');
          $subject = "Сообщение из формы обратной связи на ".get_bloginfo('name');
          $headers="From: ". $email . "\r\n" . 'Reply-To: ' . $email . "\r\n";
          $attachment = $movefile && isset($movefile['file']) ? $movefile['file'] : false;

          // Добавление поддержки HTML-типа ответа к электронной почте
          add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));

          // Создание сообщения и отправка, возвращение переменной успеха
          $sent = wp_mail($to, $subject, $message, $headers, $attachment);

          // Если успешно, вернуть успех на форму
          if($sent) 
          {
            my_contact_form_generate_response("success", $message_sent); 
          }
          // В случае неудачи, вернуть ответ об ошибке на форму
          else 
          {
            my_contact_form_generate_response("error", $message_unsent); 
            unlink( $movefile['file'] );
          }
        }
        else if(($_POST['submitted'] || !empty($failedFields)) && !$failedAttachment) 
        {
          my_contact_form_generate_response("error", $failureMessage);
        }
      }
      ?>
      <!-- Конец логики формы -->

      <?php get_header(); ?>
      <div id="main" class="clearfix wow fadeIn" role="main">
        <div id="content">
          <div class="container">
            <div class="row">
              <div class="col-sm-12">
                <h1 class="page-title">Свяжитесь с нами</h1>
                  <div id="respond">

                  <?php echo $response; ?>
                    <form class="form-horizontal well" action="<?php the_permalink(); ?>" method="post" id="contact_form" enctype="multipart/form-data">
                      <fieldset>
                        <legend>У вас есть вопросы, вы заинтересованы в продукте или хотите узнать о вариантах доставки?</legend>
                        <p>Пожалуйста, заполните контактную форму, и мы свяжемся с вами как можно скорее!</p>
                          <div class="col-sm-6">
                            <!-- Текстовый ввод -->
                            <div class="form-group <?php echo getErrorClass($failedKeys, 'first_name'); ?>">
                              <label class="control-label">Имя</label>
                                <div class="input-group">
                                  <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                  <input name="first_name" placeholder="Имя" class="form-control" type="text" value="<?php echo esc_attr($_POST['first_name']); ?>" required>
                                </div>
                              </div>
                              <!-- Текстовый ввод -->
                              <div class="form-group <?php echo getErrorClass($failedKeys, 'last_name'); ?>">
                                <label class="control-label">Фамилия</label>
                                <div class="input-group">
                                  <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                                  <input name="last_name" placeholder="Фамилия" class="form-control" type="text" value="<?php echo esc_attr($_POST['last_name']); ?>" required>
                                </div>
                              </div>
                            </div><!--/.col-->
                            <div class="col-sm-6">
                              <!-- Текстовый ввод -->
                              <div class="form-group <?php echo getErrorClass($failedKeys, 'email'); ?>">
                                <label class="control-label">Электронная почта</label>
                                <div class="input-group">
                                  <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
                                  <input name="email" placeholder="Адрес электронной почты" class="form-control" type="email" value="<?php echo esc_attr($_POST['email']); ?>" required>
                                </div>
                              </div>
                              <!-- Текстовый ввод -->
                              <div class="form-group <?php echo getErrorClass($failedKeys, 'phone'); ?>">
                                <label class="control-label">Телефон</label>
                                <div class="input-group">
                                  <span class="input-group-addon"><i class="glyphicon glyphicon-earphone"></i></span>
                                  <input name="phone" placeholder="(855)555-1212" class="form-control" type="text" value="<?php echo esc_attr($_POST['phone']); ?>" required>
                                </div>
                              </div>
                            </div><!--/.col-->
                            <div class="col-sm-12">
                              <!-- Текстовая область -->
                              <div class="form-group <?php echo getErrorClass($failedKeys, 'comment'); ?>">
                                <label class="control-label">Ваше сообщение</label>
                                <div class="input-group">
                                  <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i></span>
                                  <textarea class="form-control" name="comment" required><?php echo esc_textarea($_POST['comment']); ?></textarea>
                                </div>
                              </div>
                              <div class="form-group <?php echo getErrorClass($failedKeys, 'attachmentFile'); ?>">
                                 <label class="control-label">Прикрепить файл</label>
                                        <input type="file" name="attachmentFile">
                              </div><!-- /.form-group -->
                              <!-- Поле Anti-Spam -->
                              <div class="form-group hidden" id="gotcha">
                                <label class="control-label">Оставьте это поле пустым</label>
                                <div class="input-group">
                                  <input name="gotcha" class="form-control" type="text">
                                </div>
                              </div>
                              <div class="form-group hidden">
                                <input type="hidden" name="submitted" value="1">
                              </div>
                              <!-- Кнопка -->
                              <div class="form-group">
                                <button type="submit" class="btn btn-info">Отправить
                                  <span class="glyphicon glyphicon-send"></span>
                                </button>
                              </div>
                            </div><!--/.col-md-8-->
                          </fieldset>
                        </form>                   
                        <script>
                          // Добавление/удаление класса ошибки Bootstrap для недействительных полей при вводе и утрате фокуса
                          jQuery('#contact_form :input').keyup(function ()
                          {
                            var formElement = jQuery(this);
                                formGroup = formElement.closest('.form-group');

                            if(formGroup.hasClass('has-error') && jQuery.trim(formElement.val()).length)
                            {
                              formGroup.removeClass('has-error');
                            }
                          });

                          jQuery('#contact_form :input').blur(function ()
                          {
                            var formElement = jQuery(this);
                                formGroup = formElement.closest('.form-group');

                            if(jQuery.trim(formElement.val()).length==0)
                            {
                              formGroup.addClass('has-error');
                            }
                          });
                        </script>

                    </div><!--/.respond-->
                </div><!--/.col-->
            </div><!-- /.row-->
          </div><!--/.container-->
          <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
          <article id="post-<?php the_ID(); ?>" <?php post_class( 'clearfix'); ?> role="article">
              <section class="post_content">
                  <?php the_content(); ?>
              </section><!-- end article header -->
          </article><!-- end article -->

          <?php endwhile; ?>
          <?php else : ?>
          <article id="post-not-found">
            <div class="container">
              <div class="row">
                <div class="col-sm-12">
                  <header>
                    <h1><?php _e("Not Found", "JD_BOOTSTRAP"); ?></h1>
                  </header>
                  <section class="post_content">
                    <p><?php _e("Извините, но запрашиваемый ресурс не найден на этом сайте.", "JD_BOOTSTRAP"); ?></p>
                  </section>
                </div><!-- /.col-sm-12 -->
              </div><!-- /.row -->
            </div><!-- /.container -->          
          </article>

      <?php endif; ?>

        </div><!-- /content -->
      </div><!-- /main -->
          <?php get_footer(); ?>

.

Ответ или решение

Добавление функции загрузки файлов с валидацией на пользовательскую форму – это распространенная задача в сфере веб-разработки, особенно в контексте создания контактных форм, где пользователи могут загружать файлы для передачи дополнительной информации. Рассмотрим детально, как решить эту задачу, используя предоставленный код, и обсудим возможные улучшения и нюансы.

Теория

В основе задачи лежит необходимость не только добавить поле для загрузки файлов в форму, но и обеспечить валидацию типа и размера загружаемого файла. Это важно для:

  1. Обеспечения безопасности: Для предотвращения загрузки вредоносных файлов необходимо проверять тип файла. Принимаются только определенные форматы файлов (например, JPG, PNG, PDF).

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

Основные части кода, которые необходимо учитывать при добавлении функциональности загрузки файлов с валидацией, включают:

  1. Создание HTML формы с полем для загрузки файлов.
  2. Серверная обработка загруженного файла, включая валидацию типа и размера.
  3. Использование подходящих инструментов и методов, таких как функция wp_handle_upload WordPress для управления загрузкой файлов.

Пример

На примере предоставленного кода мы видим хорошо структурированную форму, которая содержит различные текстовые поля, а также поле для загрузки файлов (<input type="file" name="attachmentFile">). Основной обработчик разметки PHP позаботился о:

  • Получении файла из суперглобальной переменной $_FILES.
  • Проверке существования файла.
  • Валидации размера файла относительно заранее заданного максимального размера.
  • Проверке типа файла на соответствие определенному списку разрешенных типов.

Процесс валидации ярко выделен несколькими ключевыми аспектами:

$max_allowed_file_size  = 2000; // размер в КБ
$allowed_extensions     = array("jpg", "jpeg", "png", "pdf");

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

Реализация

Теперь разберем, как на практике внедрить данную функциональность и улучшить ее там, где это возможно.

  1. Оптимизация кода: Вы можете улучшить читаемость кода, проведя рефакторинг. Например, функцию валидации типов файлов можно сделать более компактной за счет использования функции in_array.
if (!in_array(strtolower($type_of_uploaded_file), $allowed_extensions)) {
    $failedKeys[] = 'attachmentFile';
    $failedFields[] = 'Uploaded File';
    my_contact_form_generate_response("error", "Формат файла не поддерживается. Разрешенные форматы: ".implode(', ', $allowed_extensions));
}
  1. Обработка ошибок: Убедитесь, что обрабатываются все возможные ошибки, которые могут возникнуть во время загрузки файла, например, проблемы с доступностью директории или недостаточное пространство на диске.

  2. Использование библиотек: Рассмотрите возможность использования дополнительных библиотек для обработки изображений, если это необходимо, чтобы изменить формат или размеры изображения перед загрузкой.

  3. Интернационализация: Добавьте поддержку на нескольких языках для пользователей из разных регионов. Это можно сделать с помощью функций интернационализации WordPress.

  4. Безопасность: Убедитесь, что PHP настройки, такие как post_max_size и upload_max_filesize, соответствуют необходимым требованиям серверной нагрузки и безопасности.

Подводя итог, добавление поля для загрузки файлов и его валидация в контактную форму требует учета множества аспектов – от обработки файлов до обеспечения безопасности. Следите за новыми практиками и улучшайте код, чтобы обеспечить лучший пользовательский опыт.

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

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