Используйте admin-post для отправки данных формы во внешнюю базу данных.

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

Я создаю пользовательскую форму в 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();
?>

Основные изменения и улучшения:

  1. Соединение с базой данных: Используем свойство $this->externalDB, чтобы сохранить подключение к базе данных, и открываем его в методе externalDB, который вызывается при загрузке плагина.

  2. Санитизация данных: Добавлена функция sanitize_text_field() для безопасной обработки данных, полученных из формы.

  3. Проверка отправки формы: Убедитесь, что проверяете, была ли форма действительно отправлена, прежде чем обрабатывать данные.

  4. Перенаправление после отправки: Используем wp_redirect() для перенаправления пользователя на главную страницу или другую страницу вашего сайта после успешной отправки формы.

  5. Обработка ошибок: Добавлено условие для обработки случаев, когда данные не были корректно переданы.

Теперь ваш код готов к использованию, и должно корректно работать для отправки данных вашей формы в внешнюю базу данных через admin-post. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!

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

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