Немного введем в курс дела: WooCommerce — это плагин WordPress для создания интернет-магазинов с открытым исходным кодом. Сегодня, согласно статистике, более 4,5млн интернет магазинов работают на данном плагине.
Возвращаясь к проблеме, она возникает из-за некорректной проверки данных. Текущая проверка не определяет наличие ключа в массиве $_POST, а оценивает значение на «истинность». Если ключ отсутствует или значение — пустая строка, то условие проверки отрабатывает как false и в поле остается старое значение.
Решением в данном случае является использование isset() — языковая конструкция (language construct) в PHP, которая проверяет существование переменной или ключа массива и отсутствие значения null.
Вот этот кусок кода:
$fee = $_POST['_subscription_fee'] ?? '';
if ($fee !== '') {
update_post_meta($post_id, '_subscription_fee', sanitize_text_field($fee));
} else {
delete_post_meta($post_id, '_subscription_fee');
}
Оборачиваем в дополнительную проверку на то, что этот ключ вообще есть в $_POST:
if (isset($_POST['_subscription_fee'])) { // добавили isset
$fee = sanitize_text_field($_POST['_subscription_fee']);
if ($fee !== '') {
update_post_meta($post_id, '_subscription_fee', $fee);
} else {
delete_post_meta($post_id, '_subscription_fee');
}
}
Полный код будет выглядеть так:
// 1. Добавляем поле в админке
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input(array(
'id' => '_subscription_fee',
'label' => 'Абонентская плата (₽/мес)',
'placeholder' => 'Оставьте пустым, если не требуется',
));
});
// 2. Сохраняем значение
add_action('woocommerce_process_product_meta', function($post_id) {
// Проверяем существование поля в запросе
if (isset($_POST['_subscription_fee'])) {
$fee = sanitize_text_field($_POST['_subscription_fee']);
if ($fee !== '') {
update_post_meta($post_id, '_subscription_fee', $fee);
} else {
delete_post_meta($post_id, '_subscription_fee');
}
}
});
// 3. Выводим на странице товара
add_filter('woocommerce_get_price_html', function($price, $product) {
$fee = get_post_meta($product->get_id(), '_subscription_fee', true);
if ($fee) {
$price .= '<br><small>Абон. плата: ₽' . $fee . '/мес</small>';
}
return $price;
}, 10, 2);