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

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

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

Если возникли вопросы по настройке и доработке Wocommerce - обращайтесь.
Подробнее об услуге

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

Не нашли нужную информацию или хотите обсудить свой проект? Свяжитесь с нами удобным способом — в рабочее время отвечаем в течение 15 минут!

E-mail:

hello@ctr99.ru

Мессенджеры: