до WooCommerce 3.0 вышел мой код работал как шарм, чтобы сохранить пользовательские значения из корзины в порядке на кассе. Но с тех пор я не могу создавать собственные мета для заказов.
Среда: WordPress 4.9.4 & WooCommerce 3.3.3
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
add_action('woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1);
Крюк № 1 — это тот, который я пробовал больше всего, 2-й был просто экспериментом с некоторым буквальным изменения, упомянутые в этой теме.
Следующий код функции связан с крючком номер 1:
if (!function_exists('custom_meta_to_order')) {
function custom_meta_to_order($order_id, $values) {
$order = wc_get_order( $order_id );
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($values['myValue'])) {
$myValue = $values['myValue'];
if (!empty($myValue)) $order->update_meta_data('_myKey', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
$order->save();
}
}
Я проверил также в таблице MySQL table wp_woocommerce_order_itemmeta
если хотя бы два _TESTKEY *-мета-записи будут созданы (потому что они не имеют условия).
ОБНОВЛЕНО: В вашем коде есть некоторые ошибки …
$values
не существует)$_POST['myValue']
вместо.$order_id
за woocommerce_checkout_update_order_meta
$order
за woocommerce_checkout_create_order
Ниже я заменил $_POST['myValue']
от $_POST['billing_country']
так как вы не дадите код для этого пользовательского поля проверки …
Итак, вот оба пути:
1) Лучший способ для меня, как объяснили Вот:
if ( ! function_exists('custom_meta_to_order') ) {
add_action( 'woocommerce_checkout_create_order', 'custom_meta_to_order', 20, 1 );
function custom_meta_to_order( $order ) {
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($_POST['billing_country'])) {
$myValue = $_POST['billing_country'];
if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
}
}
Код помещается в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.
2) Другой способ:
if ( ! function_exists('custom_meta_to_order') ) {
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
function custom_meta_to_order( $order_id ) {
// get an instance of the WC_Order object
$order = wc_get_order( $order_id );
$order->update_meta_data('_TESTKEYstart', 'Hello');
if (isset($_POST['billing_country'])) {
$myValue = $_POST['billing_country'];
if (!empty($myValue)) $order->update_meta_data('_my_key', $myValue);
}
$order->update_meta_data('_TESTKEYend', 'Bye');
// Save the order data and meta data
$order->save();
}
}
Код помещается в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.
Доказательство:
А также (в базе данных wp_postmeta
таблица для этого идентификатора заказа):
Протестировано в WooCommerce версии 3.3+
Вы можете использовать старый способ тоже (который работает):
if ( ! function_exists('custom_meta_to_order') ) {
add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
function custom_meta_to_order( $order_id ) {
update_post_meta( $order_id, '_TESTKEYstart', 'Hello' );
if ( isset( $_POST['billing_country'] ) ) {
$myValue = $_POST['billing_country'];
if (!empty($myValue))
update_post_meta( $order_id, '_my_key', $myValue);
}
update_post_meta( $order_id, '_TESTKEYend', 'Bye');
}
}
Код помещается в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.
Связанные с: Добавить дополнительные мета для заказов в Woocommerce
Поскольку комментарии действительно трудно читать (из-за очень ограниченного форматирования), этот ответ является просто ответом на ответ от LoicTheAztec.
Я написал более длинный ответ, но он, кажется, пропал, поэтому я извиняюсь за гораздо более короткий ответ!
Сначала наше недоразумение
Вы поняли, что я хотел бы использовать пользовательские значения из продуктов, но в моем случае это было немного другое. Я написал внешнее приложение, которое включало wp-load.php
и затем отправил данные обратно на страницу продукта в корзину.
Таким образом, проблема, обнаруженная здесь, была попыткой записать данные из корзины в заказ при оформлении заказа.
Рекомендовать способы сначала не сработали
Рекомендованные способы, которые вы предложили, не сработали. Я также так сильно их разобрал, что они должны работать и просто что-то записывать в мету. Я понятия не имею, какой плагин / тема-функция разыграли меня на этот раз здесь.
Но я смог решить проблему
И многое другое! Просто потому что я нашел блог-пост где я узнал в прошлом, как это сделать, и в дополнение к моей личной удаче автор уже написал изменения для WP3.0, связанные с этим процессом.
Все-таки твой пост мне помог
С тех пор ошибки, которые вы мне показывали, доставляли мне неприятности, и из-за того, что было трудно следить и проверять все с помощью Sublime и CodeIntel (и моего начала с самой Symfony), я решил купить PHPStorm, который показал и позволил мне исправить все мои устаревшие (устаревшие используя) функции, обновляя их должным образом.
(Наконец-то больше нет глобальных переменных: Yay.)
Я имею в виду, что показ параметров inline и deprecation-strokes уже проделал большую работу. Но безошибочный рабочий код intel / reference, который не умирает в больших проектах, просто потрясающий.
Вот почему я отметил ваш ответ как решение, спасибо. В противном случае я бы просто решил проблему (возможно, благодаря публикации в блоге авторов), но все равно сидел бы на бомбе замедленного действия.