Erhalten Sie benutzerdefinierte Produktattribute in Woocommerce

73

In Woocommerce versuche ich, benutzerdefinierte Produktattributwerte abzurufen, aber ich versage kläglich und erhalte nichts.

Also habe ich versucht:

global $woocommerce, $post, $product;
$res = get_post_meta($product->id);
print_r(unserialize($res['_product_attributes'][0]));

Und ich bekomme diese Rohdaten:

[pa_koostis] => Array
        (
            [name] => pa_koostis
            [value] => 
            [position] => 0
            [is_visible] => 1
            [is_variation] => 0
            [is_taxonomy] => 1
        )

Ich weiß, dass es einen Wert gibt, weil er im Attributabschnitt angezeigt wird, aber ich kann einfach keine Möglichkeit finden, ihn mit meinem benutzerdefinierten Code anzuzeigen.

Nick
quelle
Die Lösung für diese Frage ist für 2.1. Sie sollten diesen Code für die Arbeit in Woocommerce 3.0 aktualisieren. Andernfalls wird ein riesiges Protokoll für die
Ablehnung

Antworten:

112

Bearbeitet : Das woocommerce_get_product_termsist seit Woocommerce Version 3 veraltet

Gehen Sie wie folgt vor, wie @datafeedr in seiner Antwort schrieb :

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );

oder noch kompakter:

global $product;
$koostis = $product->get_attribute( 'pa_koostis' );

Ursprüngliche Antwort:

$result = array_shift(woocommerce_get_product_terms($product->id, 'pa_koostis', 'names'));
Nick
quelle
21

Update für 2018. Sie können verwenden:

global $product;
echo wc_display_product_attributes( $product );

Kopieren Sie plugins/woocommerce/templates/single-product/product-attributes.phpdiese themes/theme-child/woocommerce/single-product/product-attributes.phpund ändern Sie sie, um die Ausgabe anzupassen .

david_nash
quelle
2
Du bist ein Lebensretter!
Coder828
17

Sie können den Einzelwert für das Attribut mit dem folgenden Code erhalten:

$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);
Terryrysang
quelle
1
Irgendeine Idee, alle Attribute auf einmal zu bekommen?
Ravisoni
3
@ravisoniget_post_meta( $prodict->id , '_product_attributes' );
EHerman
17

woocommerce_get_product_terms() ist jetzt veraltet.

Verwenden Sie wc_get_product_terms()stattdessen.

Beispiel:

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
datafeedr
quelle
5
Das ist richtig. Ich glaube, in Version 2.1 war alles veraltet.
Helgatheviking
1
Ich bekomme -> Hinweis: Nur Variablen sollten als Referenz übergeben werden. Woocommerce Version 3.2.6. Code ---> $ date = array_shift (wc_get_product_terms ($ product-> get_id (), 'pa_date', array ('fields' => 'names')); Was kann falsch sein? Ich kann es nicht lösen. Ich bekomme 'Null' von gettype ($ date)
Kristis
17

Am häufigsten aktualisiert:

$product->get_attribute( 'your_attr' );

Sie müssen definieren, $productob es nicht auf der Seite ist.

Artipixel
quelle
13

Versuchen Sie dies, um ein Array mit Attributnamen => Attributwerten zu erhalten:

global $product;

$formatted_attributes = array();

$attributes = $product->get_attributes();

foreach($attributes as $attr=>$attr_deets){

    $attribute_label = wc_attribute_label($attr);

    if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) {

        $attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ];

        if ( $attribute['is_taxonomy'] ) {

            $formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) );

        } else {

            $formatted_attributes[$attribute_label] = $attribute['value'];
        }

    }
}

//print_r($formatted_attributes);

return $formatted_attributes;

Es ist wenig ineffizient, macht aber den Trick.

Airdrumz
quelle
2

Obwohl @airdrumz-Lösungen funktionieren, werden Sie viele Fehler erhalten, wenn Sie direkt auf die ID zugreifen. Dies ist nicht gut für die zukünftige Kompatibilität.

Aber es hat mich dazu gebracht, das Objekt zu untersuchen und diesen OOP-Ansatz zu erstellen:

function myplug_get_prod_attrs() {
    // Enqueue scripts happens very early, global $product has not been created yet, neither has the post/loop
    global $product;
    $wc_attr_objs = $product->get_attributes();
    $prod_attrs = [];
    foreach ($wc_attr_objs as $wc_attr => $wc_term_objs) {
        $prod_attrs[$wc_attr] = [];
        $wc_terms = $wc_term_objs->get_terms();
        foreach ($wc_terms as $wc_term) {
            array_push($prod_attrs[$wc_attr], $wc_term->slug);
        }
    }
    return $prod_attrs;
}

Bonus, wenn Sie die oben genannten Schritte frühzeitig ausführen, bevor das globale $ -Produktelement erstellt wird (z. B. während Enqueue-Skripten), können Sie es selbst erstellen mit:

    $product = wc_get_product(get_queried_object_id());
run_the_race
quelle
1

Verwenden Sie den folgenden Code, um alle Attribute mit Details zu erhalten

    global $wpdb;

    $attribute_taxonomies = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_name != '' ORDER BY attribute_name ASC;" );
    set_transient( 'wc_attribute_taxonomies', $attribute_taxonomies );

    $attribute_taxonomies = array_filter( $attribute_taxonomies  ) ;

    prin_r($attribute_taxonomies);
Nishad Up
quelle