Вопрос или проблема
У меня есть следующий код :
<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: Безопасность
Обязательно следите за безопасностью вашего кода:
-
Санитизация данных: Используйте функцию
sanitize_text_field()
для всех входящих данных. Это защитит вашу систему от SQL-инъекций и других уязвимостей. -
Используйте подготовленные запросы: Если вы когда-либо будете использовать данные напрямую в SQL-запросах, используйте подготовленные выражения для повышения безопасности.
-
Проверка прав: Проверьте права пользователя, чтобы убедиться, что только администраторы могут сохранять изменения. Используйте функции
current_user_can()
.
Заключение
Сохранение пользовательских настроек в базе данных WordPress через пользовательскую таблицу — это гибкий метод, который может улучшить производительность и упростить управление настройками. Следуя вышеизложенным шагам, вы сможете реализовать эту функциональность в своей теме или плагине WordPress. Не забывайте выполнять регулярные бэкапы вашей базы данных и следить за производительностью вашего сайта.