Как я могу вставить запись в пользовательскую таблицу из моей пользовательской формы на моей пользовательской административной странице?

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

Я испытываю трудности с этой задачей, и все соответствующие ссылки на кодекс, статьи и сообщения на форумах (Stack или других), которые я нашёл, не помогли.

Я могу лучше всего описать свою проблему как попытку воспроизвести родную функциональность WordPress “Добавить нового пользователя”. То есть отобразить форму на странице администрирования, вставить новую запись из этой формы (эквивалент добавления нового пользователя) и обновить таблицу.

На данный момент у меня есть:

Форма добавления эпизодов

Код плагина на данный момент выглядит так:

<?php
    /*

    Plugin Name: Episodes

    Description: The episodes plugin

    Author: Nick Courage

    Version: 1.0

    */

    function activate_episodes(){

        global $wpdb;

        $table_name = $wpdb->prefix . 'episodes';

        if($wpdb->get_var('SHOW TABLES LIKE' . $table_name) != $table_name){

            $sql="CREATE TABLE " . $table_name . '(

                episode_id INT NOT NULL AUTO_INCREMENT,

                episode_title VARCHAR(45) NOT NULL,

                episode_desc VARCHAR(45) NOT NULL,

                air_date DATE NOT NULL,

                img_url VARCHAR(255) NOT NULL,

                PRIMARY KEY (episode_id)

                )';

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    dbDelta($sql);

    add_option('episode_database_version', '1.0');

    }
    }

    register_activation_hook(__FILE__,'activate_episodes');

    function episodes_add_page(){

        ?>
        <h1>Add Episodes</h1>
        <form method="$_POST" action="">
            <label for="episode_title">Episode Title:</label>
            <input type="text" name="episode_title" id="episode_title" />
            <label for="episode_desc">Episode Description:</label>
            <input type="text" name="episode_desc" id="episode_desc" />
            <label for="air_date">Air date:</label>
            <input type="text" name="air_date" id="air_date" />
            <input type="submit" value="Submit"/>
        </form>

        <?php

    }

    function episodes_plugin_menu(){

        add_menu_page('Episodes Page', 'Episodes', 'manage_options','episodes-plugin','episodes_add_page');

    }

    add_action('admin_menu','episodes_plugin_menu');

    function add_episode(){

        global $wpdb;

        $table_name = $wpdb->prefix . 'episodes';

        $wpdb->insert($table_name, array('episode_title'=>$_POST['episode_title'],

            'episode_desc'=>$POST['episode_desc'],

            'air_date'=>$_POST['air_date'],

            'img_url'=>$_POST['img_url']

            )

        );

    }

    ?>

Используйте хук действия admin-post, чтобы перехватывать POST-запросы и обрабатывать формы. Функция admin_url() может быть использована для вывода корректного URL, и используйте wp_redirect() для перенаправления обратно на вашу страницу плагина после обработки.

И сделайте себе и своим пользователям одолжение – не изобретайте велосипед и не добавляйте таблицы, когда можно использовать встроенные таблицы и API.

    <?php
    /*

    Plugin Name: Episodes

    Description: The episodes plugin

    Author: Nick Courage

    Version: 1.0

    */

function activate_episodes()
{

    global $wpdb;

    $table_name = $wpdb->prefix . 'episodes';

    if ($wpdb->get_var('SHOW TABLES LIKE' . $table_name) != $table_name) {

        $sql="CREATE TABLE " . $table_name . '(

                episode_id INT NOT NULL AUTO_INCREMENT,

                episode_title VARCHAR(45) NOT NULL,

                episode_desc VARCHAR(45) NOT NULL,

                air_date DATE NOT NULL,

                img_url VARCHAR(255) NOT NULL,

                PRIMARY KEY (episode_id)

                )';

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

        dbDelta($sql);

        add_option('episode_database_version', '1.0');
    }
}

register_activation_hook(__FILE__, 'activate_episodes');

function episodes_add_page()
{
    global $wpdb;
    if (
        !empty($_POST)
        && $_POST['episode_title'] != ''
        && $_POST['episode_desc'] != ''
        && $_POST['air_date'] != ''
    ) {

        $table_name = $wpdb->prefix . 'episodes';
        $episode_title = sanitize_text_field($_POST['episode_title']);
        $episode_desc = sanitize_text_field($_POST['episode_desc']);
        $air_date = sanitize_text_field($_POST['air_date']);

        $wpdb->insert(
            $table_name,
            array(
                'episode_title' => $episode_title,
                'episode_desc' => $episode_desc,
                'air_date' => $air_date
            )
        );
    }
    ?>

    <h1>Add Episodes</h1>
    <form method="post" action="?page=episodes-plugin">
        <label for="episode_title">Episode Title:</label>
        <input type="text" name="episode_title" id="episode_title" />
        <label for="episode_desc">Episode Description:</label>
        <input type="text" name="episode_desc" id="episode_desc" />
        <label for="air_date">Air date:</label>
        <input type="text" name="air_date" id="air_date" />
        <input type="submit" value="Submit" />
    </form>

<?php
}

function episodes_plugin_menu()
{

    add_menu_page(
        "Paginas episodios",
        "Episodios",
        "manage_options",
        "episodes-plugin",
        "episodes_add_page",
        "dashicons-video-alt3",
        75
    );
}

add_action('admin_menu', 'episodes_plugin_menu');

.

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

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

Теория

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

  1. Создание таблицы в базе данных: В WordPress используется wpdb для операций с базой данных. Вы используете функцию dbDelta для создания таблицы при активации плагина.

  2. Создание страницы администрирования: Вы добавляете страницу с помощью функции add_menu_page, где будет располагаться ваша форма.

  3. Обработка формы: Необходимо безопасно обрабатывать данные из формы. Это включает проверку данных и защиту от XSS-инъекций с помощью функций санитизации данных.

  4. Вставка данных в базу данных: Используется метод $wpdb->insert для вставки данных формы в пользовательскую таблицу.

Пример

Давайте подробно разберем ваш код, разложив каждый компонент и добавив необходимые улучшения для работы.

Инициализация и создание таблицы

function activate_episodes() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'episodes';

    if($wpdb->get_var('SHOW TABLES LIKE \'' . $table_name . '\'') != $table_name) {
        $sql = "CREATE TABLE $table_name (
            episode_id INT NOT NULL AUTO_INCREMENT,
            episode_title VARCHAR(45) NOT NULL,
            episode_desc VARCHAR(255) NOT NULL,
            air_date DATE NOT NULL,
            img_url VARCHAR(255) NOT NULL,
            PRIMARY KEY (episode_id)
        );";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);

        add_option('episode_database_version', '1.0');
    }
}

register_activation_hook(__FILE__, 'activate_episodes');

Здесь вы создаете таблицу episodes с необходимыми полями. Обратите внимание на использование кавычек и синтаксиса SQL.

Добавление страницы администрирования и формы

function episodes_add_page() {
    echo '<h1>Добавить эпизоды</h1>';
    echo '<form method="post" action="' . esc_attr(admin_url('admin-post.php')) . '">';
    echo '<input type="hidden" name="action" value="add_episode">';
    echo '<label for="episode_title">Название эпизода:</label>';
    echo '<input type="text" name="episode_title" id="episode_title" required />';
    echo '<label for="episode_desc">Описание эпизода:</label>';
    echo '<input type="text" name="episode_desc" id="episode_desc" required />';
    echo '<label for="air_date">Дата выхода:</label>';
    echo '<input type="date" name="air_date" id="air_date" required />';
    echo '<label for="img_url">URL изображения:</label>';
    echo '<input type="url" name="img_url" id="img_url" />';
    echo '<input type="submit" value="Добавить эпизод" />';
    echo '</form>';
}

function episodes_plugin_menu() {
    add_menu_page(
        'Эпизоды',
        'Эпизоды',
        'manage_options',
        'episodes-plugin',
        'episodes_add_page',
        'dashicons-video-alt3'
    );
}

add_action('admin_menu', 'episodes_plugin_menu');

Здесь создается форма для добавления эпизодов, при этом указывается метод post и задается административная страница как обработчик.

Обработка и вставка данных

Для обработки данных используем admin-post hook:

add_action('admin_post_add_episode', 'process_add_episode_form');

function process_add_episode_form() {
    if (!isset($_POST['episode_title']) || !isset($_POST['episode_desc']) || !isset($_POST['air_date'])) {
        // Обработка ошибки
        wp_redirect(admin_url('admin.php?page=episodes-plugin&error=missing_data'));
        exit;
    }

    global $wpdb;
    $table_name = $wpdb->prefix . 'episodes';

    // Санитизация данных
    $episode_title = sanitize_text_field($_POST['episode_title']);
    $episode_desc = sanitize_textarea_field($_POST['episode_desc']);
    $air_date = sanitize_text_field($_POST['air_date']);
    $img_url = sanitize_url($_POST['img_url']);

    $wpdb->insert($table_name, array(
        'episode_title' => $episode_title,
        'episode_desc'  => $episode_desc,
        'air_date'      => $air_date,
        'img_url'       => $img_url
    ));

    wp_redirect(admin_url('admin.php?page=episodes-plugin&success=1'));
    exit;
}

Здесь происходит проверка и обработка данных формы после их отправки. Мы используем функции sanitize_text_field и другие для защиты от потенциальных угроз безопасности.

Применение

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

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

Советы по улучшению безопасности и производительности включают:

  1. Использование нонсов (nonce) для защиты форм.
  2. Валидация данных на стороне сервера для защиты от некорректных данных.
  3. Добавление сообщений об ошибках или успехе для удобства пользователя.

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

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

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