Вопрос или проблема
Я создаю пользовательскую форму в WordPress для хранения и отправки данных во внешнюю базу данных. В процессе тестирования мне удалось создать форму, которая отправляла данные формы во внешнюю базу данных, заставив форму ссылаться на саму себя при нажатии кнопки отправки.
Теперь я хотел бы использовать функциональность admin-post WordPress вместо того, чтобы форма ссылалась на саму себя. Я правильно настроил хук действия, так как вижу переменные $_POST, отображающиеся после отправки формы с использованием:
<form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post" id="test" >
Мой вопрос: может ли внешняя база данных использоваться с admin-post? На данный момент, когда я ссылаюсь на глобальную переменную для подключения к внешней базе данных, возникает ошибка PHP, сообщающая, что insert ссылается на значение NULL. Ниже приведен соответствующий код, касающийся проблемы…
<?php
class x94 {
public function __construct(){
add_action( 'admin_post_submitForm9', array( $this, 'formHandling' ), 11, 1 );
add_action( 'wp_head', array( $this, 'externalDB' ), 10, 1 );
}
//Подключение к внешней базе данных
function externalDB(){
global $externalDB;
$externalDB = new wpdb(DB_USER2, DB_PASSWORD2, DB_NAME3, DB_HOST2);
}
//создание формы
function userForm() {
//Глобальные переменные
global $externalDB;
//print_r($externalDB);
//начинаем буферизацию вывода
ob_start();
?>
<form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post" id="test" >
<input type="hidden" name="action" id="userForm_action" value="submitForm9" />
<input type="text" name="visitor_name" id="visitor_name" />
<input type="text" name="visitor_age" id="visitor_age" />
<input type="text" name="visitor_gender" id="visitor_gender" />
<input type="submit" name="submit_form" value="submit" />
</form>
<?php
$html = ob_get_clean();
if ( isset( $_POST["submit_form"] ) && $_POST["visitor_name"] != "" ) {
//Переменные $_POST
$name = strip_tags($_POST["visitor_name"], "");
$age = $_POST['visitor_age'];
$gender = $_POST['visitor_gender'];
}
//если форма отправлена, но имя пустое
if ( isset( $_POST["submit_form"] ) && $_POST["visitor_name"] == "" )
$html .= "<p>Вы должны заполнить обязательные поля.</p>";
//выводим все
return $html;
}
function formHandling(){
global $externalDB;
print_r($externalDB); //данные не отображаются, глобальная переменная не распознана
print_r($_POST); //данные отображаются
if (1 == 1){
$externalDB->insert(
'basic_user_info',
array(
'name' => $name,
'age' => $age,
'gender'=> $gender,
),
//форматы полей
array('%s',
'%s',
'%s',
)
);
//$html = "<p>Ваше имя <strong>$name</strong> было успешно записано. Спасибо!!</p>";
die();
}
}
}//конец класса
//шорткоды
add_shortcode('basic-info', array( 'x94', 'userForm' ) );
new x94();
?>
Я отвечаю на этот вопрос, чтобы помочь будущим разработчикам WordPress в их стремлении к знаниям. Ответ: ДА, вы можете подключиться к внешней базе данных, используя действие admin_post. Ниже приведен исправленный исходный код…
<?php
class x94 {
private $externalDB01;
public function __construct(){
add_action( 'admin_post_submitForm9', array( $this, 'formHandling' ), 11, 1 );
add_action( 'plugins_loaded', array( $this, 'externalDB' ), 10, 1 );
}
//Подключение к внешней базе данных
function externalDB(){
$this->externalDB01 = new wpdb(DB_USER2, DB_PASSWORD2, DB_NAME3, DB_HOST2);
}
//создание формы
function userForm() {
ob_start();
?>
<form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post" id="test" >
<input type="hidden" name="action" id="userForm_action" value="submitForm9" />
<input type="text" name="visitor_name" id="visitor_name" />
<input type="text" name="visitor_age" id="visitor_age" />
<input type="text" name="visitor_gender" id="visitor_gender" />
<input type="submit" name="submit_form" value="submit" />
</form>
<?php
$html = ob_get_clean();
return $html;
}
function formHandling(){
if ( isset( $_POST) ) {
//очистка данных из массива admin-post
$name = sanitize_text_field( $_POST['visitor_name'] );
$age = sanitize_text_field( $_POST['visitor_age'] );
$gender = sanitize_text_field( $_POST['visitor_gender'] );
//отправка данных во внешнюю базу данных
$externalDB->insert(
'basic_user_info',
array(
'name' => $name,
'age' => $age,
'gender'=> $gender,
),
//форматы полей
array('%s',
'%s',
'%s',
)
);
}
else {
wp_die();
}
}
}//конец класса
//шорткоды
add_shortcode('basic-info', array( 'x94', 'userForm' ) );
new x94();
?>
Ответ или решение
Конечно! Вот полное решение проблемы использования функции admin-post
для отправки данных формы в внешнюю базу данных в WordPress. Мы внесем необходимые исправления в ваш код, чтобы правильно установить соединение с внешней базой данных и обработать данные, полученные из формы.
Для начала
Убедитесь, что вы определили константы базы данных (DB_USER2
, DB_PASSWORD2
, DB_NAME3
, DB_HOST2
) в вашем файле конфигурации или в вашем плагине.
Предложенный код
<?php
class x94 {
private $externalDB;
public function __construct(){
add_action('admin_post_submitForm9', array($this, 'formHandling'), 11, 1);
add_action('plugins_loaded', array($this, 'externalDB'), 10, 1);
}
// Подключение к внешней базе данных
function externalDB() {
global $externalDB;
$this->externalDB = new wpdb(DB_USER2, DB_PASSWORD2, DB_NAME3, DB_HOST2);
}
// Создание формы
function userForm() {
ob_start();
?>
<form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post" id="test">
<input type="hidden" name="action" id="userForm_action" value="submitForm9" />
<input type="text" name="visitor_name" id="visitor_name" required />
<input type="text" name="visitor_age" id="visitor_age" required />
<input type="text" name="visitor_gender" id="visitor_gender" required />
<input type="submit" name="submit_form" value="submit" />
</form>
<?php
return ob_get_clean();
}
function formHandling() {
// Используйте свойство класса для доступа к внешней базе данных
global $externalDB;
if (isset($_POST['submit_form'])) {
// Санитизация данных
$name = sanitize_text_field($_POST['visitor_name']);
$age = sanitize_text_field($_POST['visitor_age']);
$gender = sanitize_text_field($_POST['visitor_gender']);
// Запись данных во внешнюю базу данных
$this->externalDB->insert(
'basic_user_info',
array(
'name' => $name,
'age' => $age,
'gender' => $gender,
),
array('%s', '%s', '%s')
);
// Можно добавить сообщение об успешной отправке
wp_redirect(home_url()); // перенаправление после отправки
exit;
} else {
wp_die('Данные не были переданы корректно.');
}
}
}
// Регистрация шорткода
add_shortcode('basic-info', array('x94', 'userForm'));
new x94();
?>
Основные изменения и улучшения:
-
Соединение с базой данных: Используем свойство
$this->externalDB
, чтобы сохранить подключение к базе данных, и открываем его в методеexternalDB
, который вызывается при загрузке плагина. -
Санитизация данных: Добавлена функция
sanitize_text_field()
для безопасной обработки данных, полученных из формы. -
Проверка отправки формы: Убедитесь, что проверяете, была ли форма действительно отправлена, прежде чем обрабатывать данные.
-
Перенаправление после отправки: Используем
wp_redirect()
для перенаправления пользователя на главную страницу или другую страницу вашего сайта после успешной отправки формы. -
Обработка ошибок: Добавлено условие для обработки случаев, когда данные не были корректно переданы.
Теперь ваш код готов к использованию, и должно корректно работать для отправки данных вашей формы в внешнюю базу данных через admin-post
. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!