Woocommerce variatie meta data toevoegen aan order items

Pagina: 1
Acties:

Vraag


  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 20:58
Ik heb een woocommerce webshop gemaakt waarmee verschillende soorten ontbijten worden verkocht.
Alle ontbijten zijn opgevoerd als variabel product en bevatten variaties zodat de klant kan kiezen voor hoeveel personen het ontbijt bedoelt is. De keuze om dit op deze manier te doen heeft te maken met de meta data die voor iedere variatie verschillend is.

De indeling in woocommerce ziet er als volgt uit:
Ontbijt x (variabel product)
  • 1 persoon (variatie met meta data)
  • 2 personen
  • 3 personen
  • ...
Zodra een order wordt geplaatst dient de meta data van de desbetreffende variatie opgehaald te worden en toegevoegd te worden aan de order meta data van de desbetreffende order. Dit is noodzakelijk omdat de eigenaar van de webshop die gegevens wilt gebruiken in een orderpicking lijst. Daarnaast moet hij de mogelijkheid hebben om de meta data aan te passen indien dat nodig is. Stel dat iemand bv geen croissant lust, dan kan dit artikel uit de meta data worden verwijderd en kan een ander artikel worden toegevoegd. Vervolgens wordt de order meta data weer bijgewerkt.

Bij orders met meer dan 1 product wordt de meta data van het eerste product ook toegevoegd aan het tweede product. Ik kan helaas de fout niet direct vinden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function oc_line_item_metadata( $item_id, $item, $order_id ) {
       // Here you have the item, his id, and the order's id
       // You can get the order, for example
        $order = new WC_Order( $order_id );
        $items = $order->get_items();

        
        foreach ($items as $item) {

                $variation_id = $item['variation_id'];

                $product_variation = new WC_Product_Variation( $variation_id );

                $meta_data = $product_variation->get_meta_data();

                for ($i=0; $i < count($meta_data); $i++) {
                    $article = ($meta_data[$i]->get_data());

                    $article_id    = $article['id'];
                    $article_key   = $article['key'];
                    $article_value = $article['value'];

                    wc_add_order_item_meta( $item_id, $article_key, $article_value );
                    
                }
        }
          
    }

add_action( 'woocommerce_new_order_item', 'oc_line_item_metadata', 1, 3 );


De gebruikte hook staat in de lijst van deprecated action hooks), maar lijkt wel nog te werken.

In onderstaande screenshot zie je de meta data die in de backend zichtbaar is zodra producten zijn toegevoegd aan een order.

Afbeeldingslocatie: https://image.ibb.co/mtsnrb/order.png

Wanneer ik de functie die ik aanroep uitvoer vanuit een custom php pagina en de output van $article_key en $article_value print, zie ik dat de order items 1 voor 1 worden opgehaald zoals het hoort en dat de meta data gewoon overeenkomt met wat ik verwacht te zien. Om de één of andere reden lijkt of woocommerce hier niet goed mee om te gaan of doe ik iets verkeerd in mijn code.

Ik heb al gezocht op diverse fora. Waar men probeert om hetzelfde te bereiken, meta data toevoegen aan een order item, doet men dit op dezelfde manier met de volgende functie:

PHP:
1
wc_add_order_item_meta( $item_id, $article_key, $article_value );


Zou er iets mis gaan in mijn for loops?

[ Voor 1% gewijzigd door ddkiller0900 op 28-12-2017 21:38 . Reden: Screenshot op juiste plaats gezet ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 07-10 19:24
Volgens mij kan de buitenste for loop gewoon weg, want de action wordt voor ieder item aangeroepen.

Deze dus:

code:
1
2
foreach ($items as $item) {
}


en die twee regels erboven ook; die worden toch niet gebruikt.

Acties:
  • 0 Henk 'm!

  • ddkiller0900
  • Registratie: Juli 2001
  • Laatst online: 20:58
Die buitenste for loop gaat alle order items na. Een order item is een product(variatie) wat de klant heeft gekozen bv. Classic ontbijt - 7 personen en Standaard ontbijt - 11 personen. Aan de andere kant zou het verklaren waarom mijn meta data gemixt wordt als voor ieder item (dus ook die in de binnenste for loop) de action wordt uitgevoerd.

Vandaag kwam ik er via deze site achter dat ik de methods voor het opvragen van de order_id en variation_id verkeerd gebruik.

Hier onder de juiste code waarmee ik mijn probleem heb opgelost:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function oc_line_item_metadata( $item_id, $item, $order_id ) {
        $order = wc_get_order( $order_id );
        
        foreach ($order->get_items() as $item_id => $item_obj) {
            $variation_id = $item_obj->get_variation_id(); 

        }

        $product_variation = new WC_Product_Variation( $variation_id );

        $meta_data = $product_variation->get_meta_data();

        for ($i=0; $i < count($meta_data); $i++) {
            $article = ($meta_data[$i]->get_data());

            $article_id    = $article['id'];
            $article_key   = $article['key'];
            $article_value = $article['value'];

            wc_add_order_item_meta( $item_id, $article_key, $article_value );
            
        }
        
          
}

[ Voor 61% gewijzigd door ddkiller0900 op 29-12-2017 15:24 . Reden: Oplossing gevonden ]