Не могу получить пользовательский атрибут в продукте WooCommerce - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь сохранить пользовательские метаданные после создания заказа в WooCommerce. Я пытаюсь это с крючком woocommerce_new_order_item и в целом это работает. Но мне нужно сохранить пользовательский атрибут из заказанного продукта ... но я не могу его получить.

Что я пробовал:

add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
    $angebotstext = get_post_meta($item_id, 'angebotstext', false);
    wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}

или

add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
    global $product;
    $angebotstext = $product->get_attribute( 'pa_angebotstext' );
    wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}

Атрибут сохраняется здесь:

enter image description here

... и результат для meta_value всегда пуст, равен NULL или a:0:{}

У вас есть идеи?

----- РЕДАКТИРОВАТЬ ----

Сработало так:

    add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas

function add_basic_meta_for_new_quote($item_id, $item, $order_id )
{

    if ($order_id) {
        $order = wc_get_order( $order_id );
  }

    # Iterating through each order items (WC_Order_Item_Product objects in WC 3+)
    if ($order) {
        foreach ( $order->get_items() as $item_id => $item_values ) {

            // Product_id
            $product_id = $item_values->get_product_id();

            $product = wc_get_product($product_id);
            $angebotstext = $product->get_attribute('Angebotstext');
            if ( !empty($angebotstext) && $angebotstext != NULL ) {
                wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
      }
        }
  }
}

НО: этот код добавляет мой пользовательский атрибут два раза как мета .... почему это? ?

1 Ответ

1 голос
/ 15 февраля 2020

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

Чтобы избежать этого или выбрать правильное решение Кстати, вот несколько идей:

Чтобы это работало для нескольких продуктов:
Изменили эту часть:

wc_add_order_item_meta($item_id, 'Angebotstext _'.$product_id , $angebotstext);

Это добавит новый пользовательский мета для каждого продукта путем добавления идентификатора продукта в конце каждого meta_key, и значение meta_value будет уникальным значением продукта для этого атрибута. поэтому вы найдете эти настраиваемые поля на странице заказа:

  • Angebotstext_123 = атрибут продукта.
  • Angebotstext_485 = product
  • атрибут. Angebotstext_951 = атрибут продукта.

    «123», «485» - это идентификатор продукта, а мета-значение для этого meta_key будет атрибутом этого продукта.

Для предотвращения обновляется несколько раз:

if ($order) {
     $angebotstext ='';
        foreach ( $order->get_items() as $item_id => $item_values ) {

            // Product_id
            $product_id = $item_values->get_product_id();

            $product = wc_get_product($product_id);
            $angebotstext = $product->get_attribute('Angebotstext');
            $prev_angebotstext = $angebotstext;
            if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext ) {
                wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
      }
        }
  }

"$ prev_angebotstext" - это атрибут предыдущего элемента.

if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext )

Это условие проверяет, равен ли текущий атрибут продукта предыдущий атрибут продукта, если да, он не будет обновлять заказ снова.

Спасибо!

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