Пользовательское поле заказа, добавленное при оформлении заказа, теряется после синхронизации WooCommerce с HPOS

На моем веб-сайте есть настраиваемое поле на странице /checkout в Woocommerce: Link (Facebook/Zalo/Telegram), но у меня возникает проблема при активном HPOS, при нажатии кнопки «Синхронизация» и активном режиме совместимости HPOS поле теряется: Link (Facebook/Zalo/Telegram), я не могу найти это снова ни в одном заказе. после нажатия кнопки «Синхронизировать заказ xxx».

Мой код:

add_action('woocommerce_after_checkout_billing_form', 'custom_checkout_field');
function custom_checkout_field($checkout)
{
    $key_field = 'fbhoaczalo';
echo '<div id = "custom_checkout_field">';
woocommerce_form_field('fbhoaczalo', array(
'type' => 'textarea',
'id' => 'fb_zalo',
'class' => array(
'my-field-class form-row-wide'
) ,
'label' => ('<strong style = "color: #ffdf30;font-size: 120%;">Your contact [ <code>Facebook</code>, <code>Zalo</code>, <code>Telegram</code> ] :</strong>') ,
'required'      => true,
'placeholder' => ('This field is require') ,
) ,
$checkout->get_value($key_field) ? $checkout->get_value($key_field) : WC()->session->get($key_field) );
echo '</div>';
}
add_action('woocommerce_checkout_process', 'customised_checkout_field_process');

// Save checkout custom field value in a WC_Session variable 
add_action( 'woocommerce_checkout_create_order', 'action_checkout_create_order', 10, 2 );
function action_checkout_create_order( $order, $data  ) {
    $key_field = 'fbhoaczalo';
    
    if ( isset($_POST[$key_field]) ) {
        WC()->session->set($key_field, sanitize_text_field($_POST[$key_field]));
    }
}

// Save checkout custom field value as user meta data
add_action( 'woocommerce_checkout_update_customer', 'action_checkout_update_customer', 10, 2 );
function action_checkout_update_customer( $customer, $data  ) {
    $key_field = $key_field;
    
    if ( isset($_POST['fbhoaczalo']) ) {
        $customer->add_meta_data($key_field, sanitize_text_field($_POST[$key_field])); 
    }
}

function customised_checkout_field_process()
{
// Show an error message if the field is not set.
if (!$_POST['fbhoaczalo']) {
    wc_add_notice(__('This field is not blank. Please type your contact') , 'error'); 
}
}
add_action('woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta');
function custom_checkout_field_update_order_meta($order_id)
{
    if (!empty($_POST['fbhoaczalo'])) {
    update_post_meta($order_id, 'fbhoaczalo',sanitize_text_field($_POST['fbhoaczalo']));
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'codeastrology_save_new_checkout_field' );
function codeastrology_save_new_checkout_field( $order_id ) { 
    if ( $_POST['fbhoaczalo'] ) update_post_meta( $order_id, '_fbhoaczalo', esc_attr( $_POST['fbhoaczalo'] ) );
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'codeastrology_show_new_checkout_field_order', 10, 1 );
function codeastrology_show_new_checkout_field_order( $order ) {    
   $order_id = $order->get_id();
   if ( get_post_meta( $order_id, '_fbhoaczalo', true ) ) echo '<p><strong>Link Facebook/Zalo/Tele:</strong> ' . get_post_meta( $order_id, '_fbhoaczalo', true ) . '</p>';
}
add_action( 'woocommerce_email_after_order_table', 'codeastrology_show_new_checkout_field_emails', 20, 4 );
function codeastrology_show_new_checkout_field_emails( $order, $sent_to_admin, $plain_text, $email ) {
    if ( get_post_meta( $order->get_id(), '_fbhoaczalo', true ) ) echo '<p><strong>Link Facebook/Zalo/Tele:</strong> ' . get_post_meta( $order->get_id(), '_fbhoaczalo', true ) . '</p>';
}

На странице https://mysite/checkout/ это будет выглядеть так:

Когда пользователь заполняет это поле, в Администраторе заказов я вижу это поле и знаю контакт клиента, это выглядит так:

Все работает отлично, но проблема в том, что я включаю функцию: HPOS в WooCommerce. Отметьте галочкой: Enable compatibility mode (synchronizes orders to the posts table). и нажмите кнопку Sync 2.394 pending orders в There are 2394 orders pending sync. You can switch order data storage only when the posts and orders tables are in sync..

Когда я нажимаю на любой Заказ, поле Link Facebook/Zalo/Tele теряется. Я не могу найти это поле, поэтому не могу связаться со своим клиентом, если у него возникнут проблемы с заказом.

Есть ли у вас предложения сохранить это настраиваемое поле (Link Facebook/Zalo/Tele) после синхронизации отложенного ордера с HPOS?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Высокопроизводительное хранилище заказов (HPOS) требует использования исключительно методов WooCommerce CRUD, но больше не метафункций публикаций WordPress, поскольку WooCommerce использует собственные таблицы базы данных.

Кроме того, в вашем коде есть некоторые ошибки.

Попробуйте заменить свой код следующим:

// Add a custom checkout field
add_action('woocommerce_after_checkout_billing_form', 'custom_checkout_field');
function custom_checkout_field( $checkout ) {
    $key_field = 'fbhoaczalo';

    echo '<div id = "custom_checkout_field">';

    woocommerce_form_field($key_field, array(
        'type'          => 'textarea',
        'id'            => 'fb_zalo',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => '<strong style = "color: #ffdf30;font-size: 120%;">Your contact [ <code>Facebook</code>, <code>Zalo</code>, <code>Telegram</code> ] :</strong>',
        'required'      => true,
        'placeholder'   => __('This field is required'),
    ), $checkout->get_value($key_field) );

    echo '</div>';
}

// Custom checkout field validation
add_action('woocommerce_checkout_process', 'custom_checkout_field_validation');
function custom_checkout_field_validation(){
    $key_field = 'fbhoaczalo';
    
    if ( isset($_POST[$key_field]) && empty($_POST[$key_field])) {
        wc_add_notice(__('Please fill in your contact, as this is a required field') , 'error'); 
    }
}

// Save custom checkout field value as order metadata
add_action( 'woocommerce_checkout_create_order', 'save_custom_checkout_field_as_order_meta', 10, 2 );
function save_custom_checkout_field_as_order_meta( $order, $data  ) {
    $key_field = 'fbhoaczalo';

    if ( isset($_POST[$key_field]) && !empty($_POST[$key_field]) ) {
        $order->update_meta_data('_'.$key_field, sanitize_textarea_field($_POST[$key_field])); 
    }
}

// Save custom checkout field value as user metadata
add_action( 'woocommerce_checkout_update_customer', 'save_custom_checkout_field_as_user_meta', 10, 2 );
function save_custom_checkout_field_as_user_meta( $customer, $data  ) {
    $key_field = 'fbhoaczalo';

    if ( isset($_POST['fbhoaczalo']) ) {
        $customer->update_meta_data($key_field, sanitize_textarea_field($_POST[$key_field])); 
    }
}

// Display the custom field value to admin order and email notifications
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_order_custom_field_value', 10, 1 );
add_action( 'woocommerce_email_after_order_table', 'display_order_custom_field_value', 20, 1 );
function display_order_custom_field_value( $order ) {   
    if ( $fbhoaczalo = $order->get_meta('_fbhoaczalo') ) {
        printf('<p><strong>%s:</strong> %s</p>', __('Link Facebook/Zalo/Tele'), $fbhoaczalo);
    }
}

Теперь он будет работать с HPOS, не требуя дополнительной синхронизации.

Вам также следует вернуть исчезнувшее значение настраиваемого поля.

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

Переменная Woocommerce Цена указана в заголовке, но сохраняется от цены до тех пор, пока не будет выбрана переменная цена
Добавление дополнительных затрат к фиксированной ставке woocommerce в зависимости от зоны доставки
Отключить доступ к странице «Платежи администратора WooCommerce» для определенных пользователей
Можно ли изменить заголовок «Описание продукта» WooCommerce на собственный текст?
Скрыть кнопку «Отменить подписку WooCommerce» на панели пользователя
Миграция WooCommerce | Переменная Продукт не импортируется
Пользовательский метод доставки с дополнительной проблемой выбора поля в блоке WooCommerce Checkout
Автоматическое завершение обработки заказов WooCommerce с бронированиями, дата начала которых уже прошла
Отображение определенного атрибута продукта с помощью короткого кода в продукте WooCommerce
Непоследовательное поведение CSS для пользовательской подсказки JavaScript