Advertisement
Guest User

Untitled

a guest
Feb 11th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.55 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Plugin Name: Обратная связь
  4.  */
  5.  
  6. /**
  7.  * Шорткод для вывода формы обратной связи.
  8.  * @return string
  9.  */
  10. function insert_feedback_form(){
  11.     return getFeedbackForm();
  12. }
  13. add_shortcode('feedback', 'insert_feedback_form');
  14.  
  15. /**
  16.  * Подключение стилей
  17.  */
  18. add_action( 'wp_enqueue_scripts', 'add_feedback_styles' );
  19. function add_feedback_styles() {
  20.     wp_register_style( 'feedback.css', plugin_dir_url( __FILE__ ) . 'css/feedback.css' );
  21.     wp_enqueue_style( 'feedback.css');
  22. }
  23.  
  24. /**
  25.  * Инициализация типа документа
  26.  */
  27. add_action('init', 'create_feedback_post_type');
  28. function create_feedback_post_type() {
  29.     //создание типа сущности
  30.     register_post_type( 'feedback',
  31.         array(
  32.             'labels' => array(
  33.                 'name' => __('Feedback'),
  34.                 'singular_name' => __('Feedback')
  35.             ),
  36.             'public' => true,
  37.             'has_archive' => true,
  38.             'supports' => ['custom-fields']
  39.         )
  40.     );
  41.     $fields = array_keys(feedbackFormInputs());
  42.     $meta_args = array(
  43.         'type'         => 'string',
  44.         'description'  => 'A meta key associated with a string meta value.',
  45.         'single'       => true,
  46.         'show_in_rest' => true,
  47.     );
  48.     foreach ($fields as $field_name) {
  49.         register_post_meta('feedback', $field_name, $meta_args);
  50.     }
  51. }
  52.  
  53. function feedbackFormInputs() {
  54.     return [
  55.         'feedback_name' => 'Имя',
  56.         'feedback_mail' => 'Адрес электронной почты',
  57.         'feedback_phone' => 'Номер телефона',
  58.         'feedback_type' => 'Способ получения сообщений',
  59.         'feedback_message' => 'Сообщение'
  60.     ];
  61. }
  62.  
  63. /**
  64.  * Сохранение обратной связи
  65.  * @param $feedback_data
  66.  * @return array
  67.  */
  68. function saveFeedback($feedback_data) {
  69.     $response = [
  70.         'message' => '',
  71.         'status' => 'success'
  72.     ];
  73.     $fields = feedbackFormInputs();
  74.     foreach ($fields as $field_code => $field_name) {
  75.         if (empty($feedback_data[$field_code])) {
  76.             $response['message'] = 'Поле "' . $field_name . '" обязательно для заполнения.';
  77.             $response['status'] = 'error';
  78.         }
  79.     }
  80.     if ($response['status'] == 'error') {
  81.         return $response;
  82.     }
  83.  
  84.     //сохранение сущности
  85.     $meta_input = [];
  86.     foreach (array_keys($fields) as $field_name) {
  87.         if ($field_name == 'feedback_phone') {
  88.             $feedback_data[$field_name] = preg_replace('/([^0-9])+/', '', $feedback_data[$field_name]);
  89.         }
  90.         elseif ($field_name == 'feedback_phone') {
  91.             $feedback_data[$field_name] = preg_replace('/([^0-9])+/', '', $feedback_data[$field_name]);
  92.         }
  93.         $meta_input[$field_name] = $feedback_data[$field_name];
  94.     }
  95.     $post_data = [
  96.         'post_title' => 'Запись от ' . date('Y.m.d H:i:s'),
  97.         'post_type' => 'feedback',
  98.         'meta_input' => $meta_input
  99.     ];
  100.     try {
  101.         $post_id = wp_insert_post($post_data);
  102.         if ((int) $post_id > 0) {
  103.             $response['message'] = 'Ваше обращение успешно сохранено';
  104.             $response['status'] = 'success';
  105.         }
  106.     } catch (\Exception $e) {
  107.         $response['message'] = $e->getMessage();
  108.         $response['status'] = 'error';
  109.     }
  110.  
  111.     return $response;
  112. }
  113.  
  114. function getFeedbackFormData() {
  115.     return [
  116.         'feedback_name' => '',
  117.         'feedback_mail' => '',
  118.         'feedback_phone' => '',
  119.         'feedback_type' => [
  120.             'mail_type' => '',
  121.             'sms_type' => '',
  122.             'whatsapp_type' => ''
  123.         ],
  124.         'feedback_message' => ''
  125.     ];
  126. }
  127.  
  128. /**
  129.  * Форма обратной связи
  130.  * @return string
  131.  */
  132. function getFeedbackForm() {
  133.     $form = getFeedbackFormData();
  134.     $fields = feedbackFormInputs();
  135.     $notify = '';
  136.     if (!empty($_POST)) {
  137.         $form['feedback_name'] = sanitize_text_field($_POST['feedback_name']);
  138.         $form['feedback_mail'] = sanitize_text_field($_POST['feedback_mail']);
  139.         $form['feedback_phone'] = sanitize_text_field($_POST['feedback_phone']);
  140.         $form_type = $_POST['feedback_type'];
  141.         $feedback_types = [];
  142.         foreach (['mail_type', 'sms_type', 'whatsapp_type'] as $type) {
  143.             if (!empty($_POST['feedback_type'][$type])) {
  144.                 $feedback_types[] = substr($type, 0, -5);
  145.             }
  146.         }
  147.         $form['feedback_type'] = implode(', ', $feedback_types);
  148.  
  149.         if (in_array($form_type, ['mail_type', 'sms_type', 'whatsapp_type'])) {
  150.             $form['feedback_type'][$form_type] = ' selected="selected"';
  151.         }
  152.         $form['feedback_message'] = sanitize_textarea_field($_POST['feedback_message']);
  153.         $saved = saveFeedback($form);
  154.         $notify = '<div class="notify-feedback ' . $saved['status'] . '">' . $saved['message'] . '</div>';
  155.         if ($saved['status'] == 'success') {
  156.             // обнуление полей в форме
  157.             $form = getFeedbackFormData();
  158.         }
  159.     }
  160.     $form_html = $notify . '<form method="post" action="">
  161.    <input type="text" name="feedback_name" placeholder="' . $fields['feedback_name'] . '" value="' . $form['feedback_name'] . '"/>
  162.    <input type="email" name="feedback_mail" placeholder="' . $fields['feedback_mail'] . '" value="' . $form['feedback_mail'] . '" />
  163.    <input type="tel" name="feedback_phone" placeholder="' . $fields['feedback_phone'] . '" value="' . $form['feedback_phone'] . '" />
  164.    <input type="checkbox" name="feedback_type[mail_type]"' . ((!empty($_POST['feedback_type']['mail_type'])) ? ' checked="checked" ' : '') . 'value="1" id="feedback_mail_type"><label for="feedback_mail_type">Почта</label>
  165.    <input type="checkbox" name="feedback_type[sms_type]"' . ((!empty($_POST['feedback_type']['sms_type'])) ? ' checked="checked" ' : '') . 'value="1" id="feedback_sms_type"><label for="feedback_sms_type">SMS</label>
  166.    <input type="checkbox" name="feedback_type[whatsapp_type]"' . ((!empty($_POST['feedback_type']['whatsapp_type'])) ? ' checked="checked" ' : '') . 'value="1" id="feedback_whatsapp_type"><label for="feedback_whatsapp_type">WhatsApp</label>
  167.    <textarea name="feedback_message" placeholder="' . $fields['feedback_message'] . '">' . $form['feedback_message'] . '</textarea>
  168.    <input type="submit" value="Отправить" />
  169. </form>';
  170.  
  171.     return $form_html;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement