2014-11-23 38 views
6

Mam do czynienia z dużym problemem z odmianami produktów i ich atrybutami w woocommerce. Próbuję wyświetlić tabelę z każdym atrybutem dla każdej dostępnej wersji produktu. Ale Woocommerce zapisuje atrybuty w post meta complete małymi literami, zamienia ukośniki i niemieckie znaki specjalne, takie jak ü, ö, ä itd. Otrzymuję atrybuty z $ variation-> get_variation_attributes(). Przeszukałem bazę danych do zapisywania wartości można zobaczyć na przykład na liście rozwijanej w panelu admina, ale są one zapisywane w ten sposób bez linkiem do zmienności są one przypisane do:Wartości atrybutów dla różnych produktów

a:5:{s:10:"bestell-nr";a:6:{s:4:"name";s:11:"Bestell-Nr.";s:5:"value";s:9:"1 | 2 | and so on... 

jak mogę uzyskać atrybuty w ich właściwym formacie do wyświetlenia?

Dzięki za pomoc!

Odpowiedz

10

Faktycznie atrybuty produktu są w rzeczywistości terminami w niestandardowych systemach taksonomicznych, więc wystarczy zapoznać się z warunkami w tej konkretnej taksonomii. Wszystkie taksonomie atrybutów poprzedzone są przedrostkiem "pa_". Tak więc atrybut wielkości będzie taksonomią "pa_size". Identyfikator odmiany jest identyfikatorem postu dla odmiany.

ale w zależności od tego, jak chcesz je wyświetlić, woocommerce posiada wbudowaną funkcję do wyświetlania wszystkich atrybutów odmianą za:

Poniższa wyświetli listę definicji wszystkich odmianach a atrybuty.

echo wc_get_formatted_variation($product->get_variation_attributes()); 

A przechodząc drugi parametr true wyświetli płaską listę:

echo wc_get_formatted_variation($product->get_variation_attributes(), true); 
+0

Dziękuję za odpowiedź, próbowałem uzyskać atrybuty z warunkami, ale problemem, z którym się borykam, jest to, że są źle sformułowane. Jest on pisany małymi literami, a znaki specjalne są zastępowane. – user3357332

+0

Jeśli znasz identyfikator taksonomii, możesz w ten sposób również użyć funkcji '' get_the_terms() '] (http://codex.wordpress.org/Function_Reference/get_the_terms). Czy możesz edytować swoje pytanie, aby wyjaśnić, w jakim formacie potrzebujesz ich/dlaczego 'wc_get_formatted_variation()' nie będzie działać? – helgatheviking

+0

Dzięki za urywek @helgatheviking, nie wiedziałem o wc_get_formatted_variation() func ' – Dan

1

Sposób zrobić to za pomocą "get_post_meta":

echo get_post_meta($variation_id, 'attribute_name_field', true); 

ma nadzieję, że to pomoże komuś .

+0

Niestety to daje wersję pisaną małymi literami. – piersb

3

Chciałam tylko opublikować jeden z atrybutów wariacji, a nie wszystkie; wnoszenie tego kodu na wypadek, gdyby był pomocny dla kogokolwiek innego.

get_variation_attributes() pobiera wszystkie atrybuty

wc_get_formatted_variation() zwraca sformatowaną wersję tablicy to przekazał

$attributes = $productVariation->get_variation_attributes() ; 
if ($attributes [ 'attribute_pa_colour' ]) { 
    $colour = [ 'attribute_pa_colour' => $attributes [ 'attribute_pa_colour'] ]; 
    echo wc_get_formatted_variation ($colour); 
} 
0

użyłem wp_get_post_terms aby uzyskać poprawne atrybuty wariancji.

global $product; 
    $variations = $product->get_available_variations(); 
    $var = []; 
    foreach ($variations as $variation) { 
     $var[] = $variation['attributes']; 
    } 
    var_dump($var); 
    //xxx to get attribute values with correct lower-upper-mixed-case 
    foreach ($var as $key => $arr) { 
     foreach ($arr as $orig_code => $lowercase_value) { 
     $terms_arr = wp_get_post_terms($product->id, str_replace('attribute_','',$orig_code), array('fields' => 'names')); 
     foreach ($terms_arr as $term) { 
      if (strtolower($term) == $lowercase_value) { 
       $var[$key][$orig_code] = $term; 
       break; 
      } 
     } 
     } 
    } 
    var_dump($var); 

Wyniki:

Przed ciężko kod

array (size=1) 
    0 => 
    array (size=2) 
     'attribute_pa_width' => string 'none' (length=4) 
     'attribute_pa_code' => string 'valancese' (length=9) 

Po ciężkiej kodu:

array (size=1) 
    0 => 
    array (size=2) 
     'attribute_pa_width' => string 'None' (length=4) 
     'attribute_pa_code' => string 'ValanceSe' (length=9) 
3

To wydaje się działać dla mnie. Mam nadzieję że to pomoże.

$post = get_post(); 
$id = $post->ID; 
$product_variations = new WC_Product_Variable($id); 
$product_variations = $product_variations->get_available_variations(); 
print_r($product_variations); 

Można to znaleźć w klasie-wc-product-variable.php

Więc jeśli spojrzysz na tę stronę, znajdziesz kilka przydatnych funkcji.

Oto coś, co razem wziąłem.

$product_children = $product_variations->get_children(); 

$child_variations = array(); 

foreach ($product_children as $child){ 

$child_variations[] = $product_variations->get_available_variation($child); 

} 

print_r($child_variations);