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.


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'));

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 .


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);

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' ) ) );

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.


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.



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());

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.