Кастомное поле WooCommerce не дает ввести пустое значение или ноль

После добавления кастомного поля для абонентской платы в WooCommerce невозможно очистить поле или установить ноль. При обновлении товара в админке всегда сохраняется предыдущее значение. Как решить проблему? Код прикрепил.

   
// 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) {
    $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'); 
    }
});

// 3. Выводим на странице товара
add_filter('woocommerce_get_price_html', function($price, $product) {
    $fee = get_post_meta($product->get_id(), '_subscription_fee', true);
    
    if ($fee) {
        $price .= '
Абон. плата: ₽' . $fee . '/мес'; } return $price; }, 10, 2);
Автор вопроса пожелал остаться инкогнито 04.04.25
Отвечает:
Руслан Шкарбан — автор статьи Руслан Шкарбан

Немного введем в курс дела: 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);
        
Создаем и поддерживаем сайты на WooCommerce

Создаем и поддерживаем сайты на WooCommerce

Если возникли вопросы по настройке и доработке Wocommerce - обращайтесь.
Подробнее об услуге
Есть вопрос из области дизайна, маркетинга или разработки? Отправьте его на почту и мы развернуто ответим на него на нашем сайте!

Остались вопросы? Готовы на них ответить!

Если у вас есть вопрос по маркетингу, разработке или дизайну, отправьте его через форму — мы подробно ответим на нашем сайте!

Нажимая на кнопку «Оставить вопрос», вы подтверждаете свое согласие на обработку пользовательских данных