Terminy atrybutów produktu oddzielone przecinkami, jeśli dostępnych jest wiele wartości
W WooCommerce obecnie buduję funkcję, która będzie odzwierciedlać niektóre atrybuty produktu na stronie sklepu. Chciałbym je oddzielić przecinkami, jeśli dostępnych jest wiele wartości atrybutów, ale nie wiem jak.
Mój kod:
add_action('woocommerce_after_shop_loop_item_title', 'TitleVariations', 10);
function TitleVariations()
{
global $product; $colormonth = $product->get_attribute('color-month'); $finish = $product->get_attribute('finish'); $design = $product->get_attribute('design'); echo '<span class="variation-display">'; echo __($colormonth, 'woocommerce');
echo __($finish, 'woocommerce'); echo __($crossdesign, 'woocommerce');
echo '</span>';
}
Odpowiedzi
Metoda WC_Product get_attribute()
podaje ciąg wartości oddzielony przecinkami, gdy istnieje więcej niż jedna wartość… Należy również sprawdzić, czy każdy atrybut ma na liście jeden termin…
Aby uzyskać nazwę etykiety atrybutu produktu, możesz użyć wc_attribute_label()
funkcji atrybutu produktu.
1). Jeśli chcesz uzyskać każdy atrybut produktu z nazwą etykiety i wartościami terminów (każdy inny atrybut w jednym wierszu), zamiast tego użyjesz następującego.
Ten kod obsługuje również niestandardowe atrybuty produktu :
add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
global $product; // Here define your product attribute names (slugs) $attribute_names = array('color-month', 'finish', 'design');
$attributes = array(); // Initializing // Loop Through product attributes array foreach( $attribute_names as $attribute_name ) { if( taxonomy_exists( 'pa_' . $attribute_name ) ) {
$attribute = 'pa_' . $attribute_name; // Custom taxonomy
} else {
$attribute = $attribute_name; // Custom attribute (not a taxonomy)
}
$values_str = $product->get_attribute($attribute); if ( $values_str ) {
$attributes[] = '<strong>' . wc_attribute_label($attribute) . ':</strong> ' . $values_str; } } // Output product attribute label / values pairs (one by line) if( ! empty( $attributes ) ) {
echo '<span class="variation-display">' . implode( '<br>', $attributes ) . '</span>';
}
}
2). Ale jeśli chcesz uzyskać wszystkie terminy dotyczące atrybutów produktu jako ciąg znaków oddzielonych przecinkami, kod będzie podobny do wyświetlania określonych atrybutów produktu pod tytułem produktu na stronach archiwum Woocommerce .
Więc dla twojego kodu:
add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
global $product;
$color_month = $product->get_attribute('color-month');
$finish = $product->get_attribute('finish');
$design = $product->get_attribute('design');
$attributes = array(); // Initializing if ( $color_month ) {
$attributes[] = $color_month;
}
if ( $finish ) { $attributes[] = $finish; } if ( $design ) {
$attributes[] = $design;
}
// Output product attribute values
if( ! empty( $attributes ) ) { echo '<span class="variation-display">' . implode( ', ', $attributes ) . '</span>';
}
}
Kod trafia do pliku functions.php aktywnego motywu potomnego (lub aktywnego motywu). Powinno działać.
Zbierz swoje wartości do tablicy, a następnie implode
ta tablica:
$values = [ __($colormonth, 'woocommerce'),
__($finish, 'woocommerce'), __($crossdesign, 'woocommerce'),
];
// if some values returned by `__()` are empty strings,
// you can filter your array so as to remove them
$values = array_filter($values);
echo '<span class="variation-display">';
echo implode(', ', $values);
echo '</span>';