Получить данные о продукте на крючке woocommerce_checkout_create_order_line_item - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь создать пользовательские метаданные в таблице wp_woocommerce_order_itemmeta. Но для создания данных, которые я хочу сохранить в качестве метаданных, мне нужно знать product_id элемента заказа, который создается на хуке Woocommerce woocommerce_checkout_create_order_line_item.

Мне удалось создать мета-запись со значением из переменной сеанса, но мой код завершается ошибкой, когда я пытаюсь получить product_id элемента заказа. Я был бы очень признателен за решение этой проблемы.

Таким образом, следующий код работает путем создания записи в таблице wp_woocommerce_order_itemmeta с мета-ключом "_raw_location_id"

add_action('woocommerce_checkout_create_order_line_item', 'raw_order_item_meta', 20, 2);
function raw_order_item_meta( $order ) {
    $order->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
}

Итак, я «усовершенствовал» код для создания еще одной записи, но со значением meta_key $ product_id. При добавлении кода, который я считал необходимым, оформление заказа не завершается, поэтому я никогда не попадаю на страницу благодарности. Страница оформления заказа отображается повторно без изменений в базе данных. Я провел тщательное тестирование, добавив по одной строке кода за раз. У меня есть номер строки кода ниже для удобства.

Я обнаружил, что добавление строки "3" вызывает ошибку. Поэтому я не смог проверить, работают ли строки 4 и 5 или нет, и я взял код из другого поста, поэтому я даже не могу сказать, что понимаю синтаксис строки 5, я просто надеюсь, что он работает так, как было объявлено. Я думаю, что мое первое препятствие - линия 3. Почему это не работает? Я просто хочу знать, что product_id относится к обрабатываемой позиции заказа.

  1. add_action ('woocommerce_checkout_create_order_line_item', 'raw_order_item_meta', 20, 2);
  2. функция raw_order_item_meta ($ order) {

  3. $ items = $ order-> get_items ();

  4. foreach ($ items как $ item_id => $ item) {
  5. $ product_id = $ item-> get_variation_id ()? $ item-> get_variation_id (): $ item-> get_product_id ();

  6. $ order-> update_meta_data ('_raw_location_id', $ _SESSION ['location_id']);

  7. $ order-> update_meta_data ('_raw_wc_product', $ product_id);

  8. }

  9. }

1 Ответ

1 голос
/ 07 июня 2019

Вы используете woocommerce_checkout_create_order_line_item неправильно, так как аргументы хука неверны в вашем коде. Правильный код:

add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
    $item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
}

Итак, как вы можете видеть, вам не нужно перебирать элементы заказа (поскольку $item s текущий элемент заказа) , и ваш второй код будет:

add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
    $product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();

    $item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
    $item->update_meta_data( '_raw_product_id', $product_id );
}

или то же самое по-другому:

add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
    $product = $item->get_product(); // The WC_Product instance Object

    $item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
    $item->update_meta_data( '_raw_product_id', $product->get_id() ); // Set the product ID 
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы). Это должно работать.

Похожие:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...