Добавьте пользовательское поле проверки в качестве заказа пользовательских метаданных в Woocommerce 3

до WooCommerce 3.0 вышел мой код работал как шарм, чтобы сохранить пользовательские значения из корзины в порядке на кассе. Но с тех пор я не могу создавать собственные мета для заказов.

Среда: WordPress 4.9.4 & WooCommerce 3.3.3

Крючки

  1. add_action('woocommerce_checkout_update_order_meta', 'custom_meta_to_order', 20, 1);
  2. 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 *-мета-записи будут созданы (потому что они не имеют условия).

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

Итак, мой вопрос: «Что я делаю не так?»

1

Решение

ОБНОВЛЕНО: В вашем коде есть некоторые ошибки …

  • Оба хука имеют только 1 аргумент (не 2, поэтому $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

2

Другие решения

Поскольку комментарии действительно трудно читать (из-за очень ограниченного форматирования), этот ответ является просто ответом на ответ от LoicTheAztec.

Я написал более длинный ответ, но он, кажется, пропал, поэтому я извиняюсь за гораздо более короткий ответ!

Сначала наше недоразумение

Вы поняли, что я хотел бы использовать пользовательские значения из продуктов, но в моем случае это было немного другое. Я написал внешнее приложение, которое включало wp-load.php и затем отправил данные обратно на страницу продукта в корзину.

Таким образом, проблема, обнаруженная здесь, была попыткой записать данные из корзины в заказ при оформлении заказа.

Рекомендовать способы сначала не сработали

Рекомендованные способы, которые вы предложили, не сработали. Я также так сильно их разобрал, что они должны работать и просто что-то записывать в мету. Я понятия не имею, какой плагин / тема-функция разыграли меня на этот раз здесь.

Но я смог решить проблему

И многое другое! Просто потому что я нашел блог-пост где я узнал в прошлом, как это сделать, и в дополнение к моей личной удаче автор уже написал изменения для WP3.0, связанные с этим процессом.

Все-таки твой пост мне помог

С тех пор ошибки, которые вы мне показывали, доставляли мне неприятности, и из-за того, что было трудно следить и проверять все с помощью Sublime и CodeIntel (и моего начала с самой Symfony), я решил купить PHPStorm, который показал и позволил мне исправить все мои устаревшие (устаревшие используя) функции, обновляя их должным образом.

(Наконец-то больше нет глобальных переменных: Yay.)

Я имею в виду, что показ параметров inline и deprecation-strokes уже проделал большую работу. Но безошибочный рабочий код intel / reference, который не умирает в больших проектах, просто потрясающий.

Вот почему я отметил ваш ответ как решение, спасибо. В противном случае я бы просто решил проблему (возможно, благодаря публикации в блоге авторов), но все равно сидел бы на бомбе замедленного действия.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector