Вам необходимо сохранить эти данные сеанса как метаданные пользовательского порядка , чтобы иметь возможность использовать их впоследствии (замените my_key
в приведенном ниже коде на правильный ключ сеанса):
// Add custom order meta data with temporary data from WC_Session
add_action( 'woocommerce_checkout_create_order', 'add_session_data_as_custom_order_meta_data', 10, 2 );
function add_session_data_as_custom_order_meta_data( $order, $data ) {
if ( $session_data = WC()->session->get('my_key') ) {
$order->update_meta_data( '_session_data', $session_data );
}
}
Код добавляется в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.
Затем для доступа к данным вы будете использовать метод WC_Data
get_meta()
объекта WC_Order
:
$session_data = $order->get_meta('_session_data');
Или также использовать функцию get_post_meta()
из определенной ] Id заказа :
$session_data = get_post_meta( $order_id, '_session_data', true );
Josh Bloch разработан HashMap
; Doug Lea разработан ConcurrentHashMap
. Я надеюсь, что это не является клеветническим. На самом деле я думаю, что проблема состоит в том, который аннулирует, часто требуют обертывания так, чтобы реальный пустой указатель мог обозначать неинициализированный. Если клиентский код требует, аннулирует затем, он может заплатить, (по общему признанию маленькая) стоимость обертывания аннулирует себя.
ConcurrentHashMap ориентирован на многопотоковое исполнение. Я полагаю, что не разрешение пустых ключей и значений было частью проверки, что это ориентировано на многопотоковое исполнение.
Вы не можете синхронизироваться на пустом указателе.
Править: Это не точно почему в этом случае. Я первоначально думал, что было что-то, представляют себе продолжать блокировку вещей против параллельных обновлений или иначе использования Объектного монитора, чтобы обнаружить, если что-то было изменено, но после исследования исходного кода кажется, что я был неправ - они блокируют использование "сегмента" на основе битовой маски хеша.
В этом случае я подозреваю, что они сделали это для копирования Хеш-таблицы, и я подозреваю, что Хеш-таблица сделала это потому что в мире реляционной базы данных, пустом указателе! = пустой указатель, таким образом с помощью пустого указателя в качестве ключа не имеет никакого значения.
Я предполагаю, что следующий отрывок документации API дает хорошую подсказку: "Этот класс полностью совместим с Хеш-таблицей в программах, которые полагаются на его потокобезопасность, но не в его деталях синхронизации".
Они, вероятно, просто хотели сделать ConcurrentHashMap
полностью совместимый/взаимозаменяемый с Hashtable
. И как Hashtable
не позволяет пустые ключи и значения..