Простая форма с сохранением в базу данных

12 сент. 2013 г., 19:55:40
Просмотры: 27.8K
Голосов: 4

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

Мне нужна форма в WordPress, которая:

  1. Собирает имя, телефон, email, отправленные конечным пользователем
  2. Сохраняет в базу данных
  3. Перенаправляет пользователя на страницу подтверждения

Ничего сложного, и хотя было бы здорово видеть результаты в административной панели WordPress, это не обязательно, так как я могу просто использовать phpMyAdmin.

Подводя итог:

Мне нужна простая HTML/PHP форма, где я могу просто вставить HTML код формы на страницу через административную панель WordPress в режиме HTML/код для страниц. Когда пользователь отправляет форму, она сохраняет данные в базу данных WordPress и затем перенаправляет пользователя на страницу "спасибо".

5
Комментарии

Извините, я не совсем понимаю, что вам нужно. Можете уточнить детали?

s_ha_dum s_ha_dum
12 сент. 2013 г. 20:39:13

@s_ha_dum Я отредактировал свой пост, надеюсь, это немного прояснит ситуацию. Мне нужен просто обработчик форм, который сохраняет данные в базу WordPress. То есть: размещаю HTML-код на любой странице, пользователь отправляет данные, они сохраняются в базу WordPress в отдельную таблицу.

Damainman Damainman
12 сент. 2013 г. 21:03:53

Если рассматривать сохранение в таблицах WordPress, попробуйте этот туториал. Он интегрируется с плагином Contact Form 7

Sisir Sisir
12 сент. 2013 г. 21:15:20

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

Damainman Damainman
12 сент. 2013 г. 21:32:30

Здесь вы можете найти руководство по созданию простой формы подписки на рассылку. Думаю, это довольно просто, вы можете изучить $wpdb, чтобы адаптировать решение под свои нужды: http://www.kvcodes.com/2016/02/simple-subscribe-form-wordpress/

Kvvaradha Kvvaradha
7 февр. 2016 г. 08:22:39
Все ответы на вопрос 2
5

Насколько я понимаю, у вас уже есть таблица в базе данных.

Я не знаю, как вы её назвали, но лучшей практикой (для меня обязательной) является использование того же префикса таблицы, что и в WordPress, который задаётся в файле wp-config.php.

Вы также не указали структуру таблицы, но предположу, что она выглядит примерно так:

ID (integer,primary,autoincrement) | name (varchar) | phone (varchar) | email (varchar)

Вы можете добавить шорткод для вывода формы. В ваш functions.php добавьте:

add_action('init', function() {
  add_shortcode('userform', 'print_user_form');
});

function print_user_form() {
  echo '<form method="POST">';
  wp_nonce_field('user_info', 'user_info_nonce', true, true);
  ?>

  Все ваши поля формы (имя, email, телефон) должны быть здесь.

<?php
  submit_button('Отправить данные');
  echo '</form>';
}

Теперь просто создайте запись или страницу в админке WordPress и добавьте шорткод [userform]: форма волшебным образом появится на странице.

Как вы видите, я не добавил атрибут action к форме, таким образом данные формы отправляются на ту же страницу.

Теперь вам нужно сохранить данные. Добавьте действие на ранний хук, проверьте $_POST, убедитесь в правильности nonce и сохраните данные:

add_action('template_redirect', function() {
   if ( ( is_single() || is_page() ) &&
        isset($_POST[user_info_nonce]) &&
        wp_verify_nonce($_POST[user_info_nonce], 'user_info')
    ) {
      // Валидацию данных следует выполнить перед сохранением в БД.
      // Я не буду писать функцию валидации, это выходит за рамки данного ответа
      $pass_validation = validate_user_data($_POST);
      if ( $pass_validation ) {
        $data = array(
          'name' => $_POST['name'],
          'email' => $_POST['email'],
          'phone' => $_POST['phone'],
        );
        global $wpdb;
        // Если вы последовали моему совету и назвали таблицу с префиксом WordPress
        $table_name = $wpdb->prefix . 'my_custom_table';
        // Следующая строка вставит данные
        $wpdb->insert($table_name, $data, '%s'); 
        // Если вам нужно получить ID только что вставленной строки, используйте
        $rowid = $wpdb->insert_id;
        // После вставки данных следует перенаправить пользователя
        // Я рекомендую создать отдельную страницу с заголовком "Спасибо"
        // Если вы так сделаете:
        $redirect_page = get_page_by_title('Спасибо') ? : get_queried_object();
        // Предыдущая строка, если страница с заголовком 'Спасибо' не найдена, 
        // установит текущую страницу для перенаправления. Следующая строка получит URL страницы:
        $redirect_url = get_permalink( $redirect_page );
        // Теперь выполняем перенаправление
        wp_safe_redirect( $redirect_url );
        // И завершаем выполнение PHP
        exit();
      }
   }
});

Код достаточно грубый, но может служить отправной точкой. Встроенные комментарии помогут вам понять последовательность действий.

Обязательно ознакомьтесь с документацией:

12 сент. 2013 г. 21:20:41
Комментарии

Спасибо за очень подробный ответ. Это много информации для осмысления, я сообщу вам о своих результатах и ещё раз благодарю.

Damainman Damainman
12 сент. 2013 г. 21:33:15

Быстрые вопросы: 1. Если мне нужно больше одной формы, можно ли добавить имя к шорткоду, например [userform:FormA] или [userform:Contact], что добавит FormA к ID-классу HTML-поля формы, а также поместит FormA в скрытое поле формы? 2. Для второго блока кода — его тоже нужно поместить в файл functions.php? 3. Какая часть второго примера кода заставляет WordPress понимать, что эту функциональность нужно выполнять только для форм, созданных этим методом? Я не вижу проверки, что отправка формы произошла именно из формы, созданной через шорткод.

Damainman Damainman
12 сент. 2013 г. 22:32:36

(1) вам нужны атрибуты шорткода — с их помощью вы можете настраивать форму как угодно, см. документацию add_shortcode, ссылки на которую есть в ответе. (2) Да. Код, который начинается с add_filter или add_action, нужно либо поместить в плагин, либо в functions.php: это зависит от того, хотите ли вы потерять эту функциональность при смене темы. (3) для этого и существует wp_verify_nonce. Он проверяет переменную $_POST (созданную wp_nonce_field), которая содержит зашифрованное значение, созданное на основе строки — в данном случае 'user_info'. Опять же, см. ссылки на документацию в конце ответа. @Damainman

gmazzap gmazzap
12 сент. 2013 г. 23:17:33

Быстрый вопрос: у вас есть закрывающий тег php в начале и открывающий тег php ближе к концу функции шорткода. Можете объяснить, почему так сделано?

Damainman Damainman
13 сент. 2013 г. 00:23:36

@Damainman "Все поля формы (имя, email, телефон) должны быть здесь." — это предполагается как placeholder для html части формы, поэтому я закрываю теги php перед этим и открываю снова после, чтобы избежать множества некрасивых последовательностей echo. Просто пишите html там, как вы обычно это делаете.

gmazzap gmazzap
13 сент. 2013 г. 00:35:04
0

Важно учитывать, что NAME является зарезервированным словом в WordPress. Если вы используете поле с названием name, при отправке формы вы получите ошибку 404 (страница не найдена).

30 июл. 2014 г. 18:18:34