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:

add_action( 'woocommerce_product_options_general_product_data', array( $this, 'cuzd_general_fields' ) );
add_action( 'woocommerce_process_product_meta', array( $this, 'cuzd_general_fields_save') );

Jetzt muss ich jedoch prüfen, ob der Produkttyp einfach oder Variation ist. Folgendes habe ich versucht:

$product = new WC_Product( get_the_ID() );
        if( $product->is_type( 'simple' ) ) {
          //
}

Allerdings bekomme ich einen Fehler:

 Fatal error: Class 'WC_Product' not found in ....

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.

Benutzeravatar von helgatheviking
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.

add_action( 'woocommerce_admin_process_product_object', array( $this, 'cuzd_general_fields_save') );

und der Rückruf würde dann geändert zu:

/**
 * 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:

$product_type = get_the_terms( $product_id,'product_type')[0]->slug;

  • Upvoting für bessere Reichweite. Ich habe genau das gesucht.

    – bhanu

    24. Dezember 2020 um 17:16 Uhr

Eine einfache Möglichkeit besteht darin, einfach den Wert des Geposteten zu überprüfen select. Sie können dann:

$product_type = $_POST['product-type'];

if ( $product_type == 'simple' ) {
 // do what you want
}

1405390cookie-checkWoocommerce – So überprüfen Sie den Produkttyp im Plugin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy