sanitize_text_field( $_POST["table_{$table_num}_name"] ),
'rows' => []
];
// Получаем строки таблицы
if ( isset( $_POST["table_{$table_num}_rows"] ) && is_array( $_POST["table_{$table_num}_rows"] ) ) {
foreach ( $_POST["table_{$table_num}_rows"] as $row ) {
$table_data['rows'][] = [
'thickness' => floatval( $row['thickness'] ?? 0 ),
'width' => floatval( $row['width'] ?? 0 ),
'length' => floatval( $row['length'] ?? 0 ),
'k1' => floatval( $row['k1'] ?? 1 ),
'k2' => floatval( $row['k2'] ?? 1 ),
'k3' => floatval( $row['k3'] ?? 1 ),
'k4' => floatval( $row['k4'] ?? 1 ),
'k5' => floatval( $row['k5'] ?? 1 ),
'n' => floatval( $row['n'] ?? 0 ),
];
}
}
$tables[ $table_num ] = $table_data;
}
update_option( 'orgsteklo_price_tables', $tables );
update_option( 'orgsteklo_price_tables_count', $table_count );
// Редирект с сообщением об успехе
wp_redirect( add_query_arg( 'settings-updated', 'true', wp_get_referer() ) );
exit;
}
// Страница админки
function orgsteklo_price_calculator_page() {
// Получаем сохраненные данные
$base_price = get_option( 'orgsteklo_base_price_per_kg', 300 );
$tables = get_option( 'orgsteklo_price_tables', [] );
$table_count = get_option( 'orgsteklo_price_tables_count', 5 );
// Названия таблиц по умолчанию
$default_table_names = [
1 => 'Оргстекло прозрачное, бесцветное',
2 => 'Оргстекло прозрачное, цветное',
3 => 'Оргстекло глухое, сатинированное',
4 => 'Оргстекло флуоресцентное, день/ночь, зеркальное',
5 => 'Оргстекло с особыми свойствами',
];
// Генерируем названия для дополнительных таблиц
for ( $i = 6; $i <= $table_count; $i++ ) {
$default_table_names[$i] = "Таблица {$i}";
}
?>
Калькулятор цен на оргстекло
'-- Не выбрано --'
];
$default_names = [
1 => 'Оргстекло прозрачное, бесцветное',
2 => 'Оргстекло прозрачное, цветное',
3 => 'Оргстекло глухое, сатинированное',
4 => 'Оргстекло флуоресцентное, день/ночь, зеркальное',
5 => 'Оргстекло с особыми свойствами',
];
for ( $i = 1; $i <= $table_count; $i++ ) {
$name = $tables[ $i ]['name'] ?? ( $default_names[$i] ?? "Таблица {$i}" );
$options[ $i ] = "Таблица {$i}: {$name}";
}
echo '';
woocommerce_wp_select(
[
'id' => '_orgsteklo_price_table',
'label' => 'Таблица расчета цен',
'description' => 'Выберите таблицу для расчета цен на оргстекло. Данные берутся из "Калькулятор цен" в меню.',
'desc_tip' => true,
'options' => $options,
]
);
woocommerce_wp_textarea_input(
[
'id' => '_orgsteklo_important_text',
'label' => 'Текст "Важно"',
'description' => 'Информационный текст под калькулятором. Оставьте пустым для стандартного текста.',
'desc_tip' => true,
'placeholder' => 'Важно: оргстекло толщиной более 6 мм...',
]
);
echo '
';
}
// Сохранение поля
add_action( 'woocommerce_process_product_meta', 'orgsteklo_save_price_table_field' );
function orgsteklo_save_price_table_field( $post_id ) {
$table_number = isset( $_POST['_orgsteklo_price_table'] ) ? sanitize_text_field( $_POST['_orgsteklo_price_table'] ) : '';
update_post_meta( $post_id, '_orgsteklo_price_table', $table_number );
$important_text = isset( $_POST['_orgsteklo_important_text'] ) ? wp_kses_post( $_POST['_orgsteklo_important_text'] ) : '';
update_post_meta( $post_id, '_orgsteklo_important_text', $important_text );
// Автоматически создаем вариации из таблицы калькулятора
if ( ! empty( $table_number ) && function_exists( 'orgsteklo_create_variations_from_table' ) ) {
$result = orgsteklo_create_variations_from_table( $post_id );
// Выводим alert с результатом
add_action( 'admin_notices', function() use ( $result ) {
$class = $result['success'] ? 'notice-success' : 'notice-error';
$message = $result['message'];
echo "Вариации калькулятора: $message
";
// Дополнительно выводим JS alert для гарантии
echo "";
} );
}
}
// Отображение поля в вариациях (если нужно для вариативных товаров)
add_action( 'woocommerce_product_after_variable_attributes', 'orgsteklo_add_variation_price_table_field', 10, 3 );
function orgsteklo_add_variation_price_table_field( $loop, $variation_data, $variation ) {
// Получаем значение для родительского товара (вариации наследуют таблицу от родителя)
$parent_id = wp_get_post_parent_id( $variation->ID );
$parent_table = get_post_meta( $parent_id, '_orgsteklo_price_table', true );
if ( $parent_table ) {
echo '';
echo 'Таблица расчета цен: Таблица ' . esc_html( $parent_table ) . ' (наследуется от родительского товара)';
echo '
';
}
}