Woocommerce – So überprüfen Sie den Produkttyp im Plugin
Lesezeit: 3 Minuten
Ich bin ziemlich neu in WordPress/Woocommerce und habe gerade angefangen, mit der Erstellung eines benutzerdefinierten Plugins zu spielen.
Bisher habe ich meine benutzerdefinierten Woocommerce-Einstellungen über die API hinzugefügt.
Ich bin auf ein Problem gestoßen, bei dem ich ein benutzerdefiniertes Feld für ein einzelnes Produkt auf der Registerkarte „Produktdaten“ hinzufügen möchte.
Ich habe es geschafft, es mit dem folgenden Code anzuzeigen:
Ich habe ein gutes Gefühl, dass ich versuche, die Product-Klasse zu initiieren, bevor sie aufgerufen wurde. Ich habe höchstwahrscheinlich das gesamte Format des Klassen-Plugins falsch. Jegliches Lesematerial mit guter Anleitung / Best Practice wäre willkommen.
Andernfalls, wenn das obige eine einfache Lösung ist, lassen Sie es mich bitte wissen.
Helgathewikinger
Das früheste, was Sie erwarten könnten, auf Woo-Klassen zuzugreifen, wäre das woocommerce_loaded Haken, der jetzt in die gefeuert wird plugins_loaded Haken. Wenn Sie auf der sparen woocommerce_process_product_meta Hook, dann würde jeder Callback dort alle Klassen richtig geladen haben. Wenn Sie außerhalb dieses Rückrufs testen (und überhaupt nicht an einen Hook gebunden sind …), ist es möglich, dass die Klassen nicht alle richtig geladen werden.
Außerdem, wenn Sie versuchen anzurufen get_the_ID() Vor dem WP_Post Objekt eingerichtet wurde, erhalten Sie keinen korrekten Wert.
Ein vollständiger cuzd_general_fields_save Routine sähe so aus:
/**
* Save meta box data.
*
* @param int $post_id WP post id.
*/
public function cuzd_general_fields_save( $post_id ) {
$_product = wc_get_product( $post_id );
if( $_product->is_type( 'simple' ) ) {
// do stuff for simple products
} else {
// do stuff for everything else
}
$_product->save();
}
Ein Update für Woo 3.0 wäre zum Einsatz woocommerce_admin_process_product_object Sie müssen das Produktobjekt also nicht mehr instanziieren oder ausführen save() da Woo das im Kern handhaben wird.
/**
* Save meta box data.
*
* @param obj $_product WC_Product.
*/
public function cuzd_general_fields_save( $_product ) {
if( $_product->is_type( 'simple' ) ) {
// do stuff for simple products
} else {
// do stuff for everything else
}
}
Für mich ist zumindest der Produkttyp Variation “variabel”, nicht “Variation”. Es hat sich möglicherweise seit der ursprünglichen Antwort geändert, aber ich denke, dies ist für zukünftige Referenzzwecke erwähnenswert.
– Tuure
17. Mai 2017 um 16:13 Uhr
@Tuure Variable und Variation existieren beide. Der Produkttyp „Variable“ bedeutet, dass es sich um das übergeordnete Produkt handelt, das mehrere „Variations“-Produktkinder enthält. Die Variationen werden nicht als separate Produkte in der Produktliste angezeigt, sondern sind eigentlich eigene Produktbeiträge.
– Berend
20. Mai 2017 um 7:17 Uhr
Danke für die Klarstellung!
– Tuure
22. Mai 2017 um 10:57 Uhr
Aber wenn die Klasse nicht gefunden wird, warum liegt das Problem beim Argument? Sind Sie sicher, dass dies die richtige Antwort ist?
– svelandiag
1. Mai 2020 um 21:55 Uhr
Ich liebe SO, 5 Jahre alt Frage & Antwort hat mir geholfen, Prost
– Abdel Rehman
4. Mai 2020 um 20:15 Uhr
Hier ist eine Möglichkeit, den Produkttyp zu überprüfen, ohne eine Instanz des Produkts zu erstellen: