Как сохранить при оформлении заказа WooCommerce пользовательское состояние поля флажка?

У меня проблема с функцией update_post_meta. У меня есть отправленное пользователем значение, которое я передаю через $_POST, а затем сохраняю в публикацию мета.

Все работает нормально, но когда значение равно «0», метаданные сообщения не обновляются.

Это мой код:

// Add custom checkout field: woocommerce_review_order_before_submit
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field_ritiro_sede' );
function my_custom_checkout_field_ritiro_sede() {
    echo '<div class = "cw_custom_class"><h3>'.__('Ritiro presso sede CER S.r.l. &nbsp').'</h3>';
    echo '<div id = "my_custom_checkout_field">';
    woocommerce_form_field( 'ritiro_sede', array(
        'type'      => 'checkbox',
        'class'     => array('input-checkbox'),
        'label'     => __('SI'),
    ),  WC()->checkout->get_value( 'ritiro_sede' ) );
    echo '</div>';
}

// Save the custom checkout field in the order meta, when checkbox has been checked
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta_ritiro_sede', 10, 1 );
function custom_checkout_field_update_order_meta_ritiro_sede( $order_id ) {

    if ( ! empty( $_POST['ritiro_sede'] ) )
        update_post_meta( $order_id, 'ritiro_sede', $_POST['ritiro_sede'] );
    if ( isset( $_POST['ritiro_sede'] ) )
        update_post_meta( $order_id, 'ritiro_sede', $_POST['0'] );
    
}

Кто-нибудь знает, что может быть не так?

Некоторые заметки о вашем коде. Отсутствует закрывающий div. Так что замените echo '</div>'; на echo '</div></div>';

7uc1f3r 29.12.2020 09:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
953
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Начиная с WooCommerce 3, ниже приведен лучший способ сохранить значение пользовательского поля флажка оформления заказа в качестве метаданных заказа (включая случаи, когда флажок не установлен):

// Save the custom checkout checkbox field as the order meta
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_order_meta', 10, 2 );
function custom_checkout_field_update_order_meta( $order, $data ) {
    $value = isset($_POST['ritiro_sede']) ? '1' : '0'; // Set the correct values
    
    $order->update_meta_data( 'ritiro_sede', $value );
}

Теперь, когда пользовательские метаданные используются методом WC_Checkoutget_value() в вашей первой функции:

WC()->checkout->get_value( 'ritiro_sede' )

Поэтому, если вы хотите, чтобы отправленное значение отображалось на странице оформления заказа для следующей покупки, вам нужно будет сохранить это настраиваемое поле оформления заказа также как метаданные пользователя, используя вместо этого следующее:

// Save the custom checkout checkbox field as the order meta and user meta
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_order_meta', 10, 2 );
function custom_checkout_field_update_order_meta( $order, $data ) {
    $value = isset($_POST['ritiro_sede']) ? '1' : '0'; // Set the correct values
    
    // Save as custom order meta data
    $order->update_meta_data( 'ritiro_sede', $value );

    // Save as custom user meta data
    if ( get_current_user_id() > 0 ) {
        update_user_meta( get_current_user_id(), 'ritiro_sede', $value );
    }
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Проверено и работает.

Другие вопросы по теме

Похожие вопросы

Запись текста на изображение с помощью GD не работает
Могу ли я получить SQL-инъекцию, проверив количество строк в моей базе данных?
Можно ли показать кнопку, когда пользователь вошел в систему на PHP?
Как передать значение данных контроллера в пользовательскую функцию вложенного набора в блейд-файле Laravel
Php проверяет, прошло ли 24 часа в определенном часовом поясе
Как обновить общее количество с помощью ajax Laravel 8
Более простой способ создать пользовательскую директиву Laravel Blade, когда строка объединяется с переменными
Mysql, получить данные между двумя датами, если нет данных на начальную дату, мне нужно получить данные с последней введенной даты?
Фатальная ошибка: Исчерпан разрешенный объем памяти 536870912 байт (попытался выделить 262144 байта)
Как вывести переменную из локальной области и иметь возможность использовать эту переменную в другом представлении или других функциях в Swift, Xcode?