1

WooCommerce 3.0 brach meine App und ich kann nicht herausfinden, wie es jetzt zu beheben.WooCommerce Subscriptions Hook: Get Bestell Artikel

Ich habe eine Aktion für, wenn ein Abonnement hinzugefügt wird/geändert läuft hier:

Innerhalb der Funktion war ich die Bestelldaten erhalten und die Position für ein Variable Abonnement zu finden, zu meiner benutzerdefinierte DB mit der Option zu aktualisieren, sowie benutzerdefinierte Auftrag Meta, die ich über woocommerce_form_field hinzugefügt:

Dies funktioniert nicht mehr und alles scheint geschützt? Wie kann ich dies aktualisieren, um mit 3.0 zu arbeiten?

add_action('woocommerce_subscription_status_changed', 'update_subscription', 10, 3); 
function update_subscription($id, $old_status, $new_status) { 

    $sitelink_db   = new SSLA_DB_Sitelink(); 
    $order     = new WC_Order($id); 
    $items     = $order->get_items(); 
    $subscription_type = ''; 
    $user_id    = $order->get_user_id(); 
    $sitelink_domain  = get_post_meta($order->id, 'ssla_sitelink_url', true); 

    foreach ($items as $item) { 

     if("SiteLink Subscription" === $item['name']) { 
      $subscription_type = $item['brand']; 
     } 

    } 

    $customer_data = array(
     'user_id'    => $user_id, 
     'subscription_type'  => $subscription_type, 
     'domain_referrer'  => $sitelink_domain, 
     'active_subscription' => $new_status, 
     'date_modified'   => date('Y-m-d H:i:s'), 
     ); 

    $sitelink_db->add($customer_data); 

} 

Grundsätzlich muß ich, dass eine Variation Namen des Abonnements bekommen in meiner DB zu speichern, sowie, dass benutzerdefinierten Meta-Feld I gemacht. Was auch nicht mehr funktioniert

+0

Die Arrays sollen wieder kompatibel sein, aber Jetzt gibt 'get_items()' ein Array von 'WC_Order_Item'-Objekten zurück, daher müssen Sie die Getter-Methoden verwenden, um Informationen zu erhalten. Ich * denke * es erhält die Bestellartikel Produkte standardmäßig, so dass die Klasse wahrscheinlich 'WC_Order_Item_Product' ist, die' WC_Order_Item' erweitert. Werfen Sie einen Blick auf die Getter [hier] (https://github.com/woocommerce/woocommerce/blob/ master/includes/class-wc-order-item-product.php # L207) und [hier] (https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-order-item.php # L73) – helgatheviking

+0

Ich kann mich nicht daran erinnern, dass 'brand' jemals ein Bestellartikel-Array-Schlüssel ist, so dass dies ein Teil des Problems sein könnte. Sie sollten 'WP_DEBUG_LOG' aktivieren, damit Sie sehen können, was vor sich geht. – helgatheviking

+0

Die Marke ist eine benutzerdefinierte Variation, die ich in dem variablen Produkt – thatryan

Antwort

0

Hier ist meine beste Schätzung. Es ist unmöglich zu testen, da ich nicht das selbe Setup wie du habe.

Ein paar Hinweise:

  1. Das $subscription Objekt an den woocommerce_subscription_status_changed Haken übergeben wird, so ist es verwenden lassen.
  2. $order->id sollte ersetzt werden durch $order->get_id() in WC3.0, aber wir werden das Objekt $subscription verwenden (die Abonnementauftragsklasse erweitert die Auftragsklasse, so dass es ähnlich ist).
  3. Getter muss auf dem WC_Order_Item_Product Objekt verwendet werden, wenn Schleife durch get_items() zurückgegeben wird so $item['name'] wird $item->get_name()

Hier ist der vollständige Code-Block:

add_action('woocommerce_subscription_status_changed', 'update_subscription', 10, 4); 
function update_subscription($subscription_id, $old_status, $new_status, $subscription) { 

    $match_this_id = 99; // Change this to the product ID of your special subscription 

    $sitelink_db   = new SSLA_DB_Sitelink(); 

    $items     = $subscription->get_items(); 
    $subscription_type = ''; 
    $user_id    = $subscription->get_user_id(); 
    $sitelink_domain  = $subscription->get_meta('ssla_sitelink_url'); 

    foreach ($items as $item) { 

     if($match_this_id === $item->get_product_id()) { 
      $product = $item->get_product(); 
      if($product->is_type('variation')){ 
       $subscription_type = $product->get_attribute('brand'); 
      } 
     } 

    } 

    $customer_data = array(
     'user_id'    => $user_id, 
     'subscription_type'  => $subscription_type, 
     'domain_referrer'  => $sitelink_domain, 
     'active_subscription' => $new_status, 
     'date_modified'   => date('Y-m-d H:i:s'), 
     ); 

    $sitelink_db->add($customer_data); 

} 
+0

Danke, das ist wirklich hilfreich, um den unterschiedlichen Ansatz zu verstehen. Woher weißt du, welche Methoden verfügbar sind, wo du zB get_name() benutzt hast, gibt es vielleicht ein "get_title()"? Sieht so aus, als ob Variantenauswahl nun Teil des "Namens" ist, also nicht zuverlässig. – thatryan

+1

In diesem Fall würde ich vorschlagen, ['$ item-> get_product_id()'] (https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-order-item-product.php) # L226) und verwenden Sie die Produkt-ID als Bedingung. Sie wissen, welche Methoden verfügbar sind, indem Sie die Dokumentation und/oder den Code selbst lesen. Ich gebe zu, dass sie viel weniger transparent sind, als eine Variable "var_dump()" zu haben. – helgatheviking

+0

Danke, dass ich die Produkt-ID eingegeben habe! Ich habe es gefunden, aber ja, die Ärzte sind hart zu mir, hehe. – thatryan

Verwandte Themen