Как сохранить настройки пользовательской вкладки страницы товара в административной части базы данных?

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

введите описание изображения здесь

У меня есть следующий код :

                    <tr>
                        <th><?php _e('Пользовательское сообщение о запасах'); ?></th>
                             <td>
                                <input type="text" name="customstock-msg"  value=""/>
                             </td>
                    </tr>

                    <tr>
                        <th><?php _e('Время обработки заказа'); ?></th>
                             <td>

                               <input type="text" name="customstock-Processing-time">
                             </td>
                    </tr>

                    <tr>
                        <th><?php _e('Дата наличия'); ?></th>
                             <td>
                               <!-- <input type="date" name="customstock-date"  value=""/>-->
                               <input type="text" id="datepicker" name="customstock-instockdate">
                             </td>
                    </tr>

                    <tr>
                        <th><?php _e('Показать количество при наличии'); ?></th>
                             <td>
                               <!-- <input type="date" name="customstock-date"  value=""/>-->
                               <select name="customstock-quantity" id="showquantity">
                                    <option value="yes">Да</option>
                                    <option value="no"> Нет</option>
                               </select>
                             </td>
                    </tr>

                    <tr>
                        <th><?php _e('Показать на странице каталога'); ?></th>
                             <td>
                               <!-- <input type="date" name="customstock-date"  value=""/>-->
                               <select name="customstock-catlogpage" id="showcatlogpage">
                                    <option value="yes">Да</option>
                                    <option value="no"> Нет</option>
                               </select>
                             </td>
                    </tr>

                    ?>

                     <p>
                     <input type="submit" class="button-primary" name="customstock_submit_specific_product" value="<?php  _e('Сохранить изменения') ?>" />
                     </p>
                  </form>

  if(isset($_POST['customstock_submit_specific_product']))
 {
                    global $wpdb,$product;
                     $id = $product->id;

                    $custommsg = sanitize_text_field( $_POST['customstock-msg'] );
                    $customprocessingtime = sanitize_text_field( $_POST['customstock-Processing-time'] );
                    $customstockquantity = sanitize_text_field( $_POST['customstock-quantity'] );
                    $customstockcatlogpage = sanitize_text_field( $_POST['customstock-catlogpage'] );
                    $customstockinstockdate = sanitize_text_field( $_POST['customstock-instockdate'] );
                    $customstockinstockdate = date("Y-m-d", strtotime($customstockinstockdate) );

  $wpdb->insert('wp_woocommerce_specific_product_settings', array(
                                                                    'custom_msg' => $custommsg,
                                                                    'order_processing_time'  => $customprocessingtime,
                                                                    'exp_instock_date' => $customstockinstockdate, 
                                                                'show_stockstatus_quantity' => $customstockquantity,
                                                                    'showon_catlog' => $customstockcatlogpage,
                                                                    'specific_product_id' =>  $id
                                                                ));
  }

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

В зависимости от вашей ситуации я не рекомендую и не одобряю это делать, но ответ на ваш вопрос заключается в том, чтобы взглянуть на класс $wpdb и функцию dbDelta(). Это интерфейс, который WordPress предоставляет для добавления пользовательских таблиц.

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

Тем не менее, вот абстрактный класс, который я недавно использовал для этого для клиента, и он может быть полезен для вас. Я его не тестировал, это абстракция из гораздо более крупного класса, поэтому вам нужно будет перенастроить и протестировать его самостоятельно. Что касается его полезности, я не думаю, что вам нужна пользовательская таблица для этого случая использования.

<?php
/**
 * База данных
 *
 * Добавление пользовательских таблиц в базу данных WordPress
 */

if ( ! class_exists('DB_Table') ) :

class DB_Table 
{
    protected $table;

    /**
     * Создание таблицы базы данных
     *
     * Учитывая массив схемы, создайте пользовательскую таблицу в базе данных WP
     */
    public static function create() {
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

        global $wpdb, $charset_collate;

        $table="custom_table_name"; // Имя вашей пользовательской БД таблицы
        $schema = self::schema();

        // создайте таблицу базы данных
        $table_name = $wpdb->prefix . $table;
        $sql = "CREATE TABLE IF NOT EXISTS $table_name ( ";
        $sql .= $schema;
        $sql .= " ) $charset_collate;";

        // запустите процесс создания
        dbDelta( $sql );
    }

    /**
     * Схема: Уровень тарифов на термины 
     *
     * Определение схемы для пользовательской таблицы
     */
    public static function schema() {

        // Определите свою схему здесь для таблицы
        $schema = "id int(8) unsigned NOT NULL AUTO_INCREMENT,
        age int(3) NOT NULL DEFAULT '0',
        first_name text NOT NULL DEFAULT '',
        last_name text NOT NULL DEFAULT '',
        gender char(1) NOT NULL DEFAULT '',
        PRIMARY KEY (id)";

        return $schema;
    }
}

/**
 * Регистрация хуков
 */
register_activation_hook( __FILE__, array( 'DB_Table', 'create' ) );

endif;
?>

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

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

Шаг 1: Создание пользовательской таблицы

Для начала вам необходимо создать пользовательскую таблицу в базе данных. Это необходимо, чтобы хранить ваши пользовательские настройки отдельно от стандартных метаданных постов. Ваша таблица может выглядеть следующим образом:

function create_custom_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . "woocommerce_specific_product_settings"; // Замените это на ваше название таблицы
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        specific_product_id mediumint(9) NOT NULL,
        custom_msg text NOT NULL,
        order_processing_time text NOT NULL,
        exp_instock_date date NOT NULL,
        show_stockstatus_quantity varchar(3) NOT NULL,
        showon_catlog varchar(3) NOT NULL,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_custom_table');

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

Шаг 2: Обработка данных формы

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

if (isset($_POST['customstock_submit_specific_product'])) {
    global $wpdb;

    // Получаем ID продукта
    $id = sanitize_text_field($_POST['product_id']); // используйте правильный источник ID продукта

    // Данные формы
    $custommsg = sanitize_text_field($_POST['customstock-msg']);
    $customprocessingtime = sanitize_text_field($_POST['customstock-Processing-time']);
    $customstockquantity = sanitize_text_field($_POST['customstock-quantity']);
    $customstockcatlogpage = sanitize_text_field($_POST['customstock-catlogpage']);
    $customstockinstockdate = date("Y-m-d", strtotime(sanitize_text_field($_POST['customstock-instockdate'])));

    // Вставка данных в базу
    $wpdb->insert(
        'wp_woocommerce_specific_product_settings',
        [
            'specific_product_id' => $id,
            'custom_msg' => $custommsg,
            'order_processing_time' => $customprocessingtime,
            'exp_instock_date' => $customstockinstockdate,
            'show_stockstatus_quantity' => $customstockquantity,
            'showon_catlog' => $customstockcatlogpage,
        ]
    );
}

Шаг 3: Безопасность

Обязательно следите за безопасностью вашего кода:

  1. Санитизация данных: Используйте функцию sanitize_text_field() для всех входящих данных. Это защитит вашу систему от SQL-инъекций и других уязвимостей.

  2. Используйте подготовленные запросы: Если вы когда-либо будете использовать данные напрямую в SQL-запросах, используйте подготовленные выражения для повышения безопасности.

  3. Проверка прав: Проверьте права пользователя, чтобы убедиться, что только администраторы могут сохранять изменения. Используйте функции current_user_can().

Заключение

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

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

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