Перейти к основному содержанию
Санкт-Петербург

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

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

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

Руслан Шкарбан
wordpress

Немного введем в курс дела: 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);
        
[commercial_block id="77" title="Создаем и поддерживаем сайты на WooCommerce" text="Если возникли вопросы по настройке и доработке Wocommerce - обращайтесь."]