Как вывести вариации в табличном виде?
Как переписать код, чтобы у товаров вариации после полного описания в табличном виде выводились. Сейчас получилось вывести ярлыки, но названия так и не выводятся
// Вариации таблицей function display_product_variations() { global $product; if ( $product->is_type( 'variable' ) ) { $variations = $product->get_available_variations(); if ( ! empty( $variations ) ) { $attributes = $product->get_variation_attributes(); $attribute_keys = array_keys( $attributes ); echo '<div class="woocommerce-tabs" style="width: var(--default-editor, var(--block-width)); margin: auto"><div class="panel" id="tab-variations"><table class="woocommerce-variations-table"><thead><tr>'; foreach ( $attribute_keys as $attribute_key ) { echo '<th>' . wc_attribute_label( $attribute_key ) . '</th>'; } echo '<th>Цена</th></tr></thead><tbody>'; foreach ( $variations as $variation ) { $variation_id = $variation['variation_id']; $variation_obj = new WC_Product_Variation( $variation_id ); echo '<tr>'; foreach ( $attribute_keys as $attribute_key ) { $attribute_value = $variation['attributes'][ 'attribute_' . sanitize_title( $attribute_key ) ]; echo '<td>' . $attribute_value . '</td>'; } echo '<td>' . $variation_obj->get_price_html() . '</td></tr>'; } echo '</tbody></table></div></div>'; } } } add_action( 'woocommerce_after_single_product_summary', 'display_product_variations' ); |
// Вариации таблицей function display_product_variations() { global $product; if ( $product->is_type( 'variable' ) ) { $variations = $product->get_available_variations(); if ( ! empty( $variations ) ) { $attributes = $product->get_variation_attributes(); $attribute_keys = array_keys( $attributes ); echo '<div class="woocommerce-tabs" style="width: var(--default-editor, var(--block-width)); margin: auto"><div class="panel" id="tab-variations"><table class="woocommerce-variations-table"><thead><tr>'; foreach ( $attribute_keys as $attribute_key ) { echo '<th>' . wc_attribute_label( $attribute_key ) . '</th>'; } echo '<th>Цена</th></tr></thead><tbody>'; foreach ( $variations as $variation ) { $variation_id = $variation['variation_id']; $variation_obj = new WC_Product_Variation( $variation_id ); echo '<tr>'; foreach ( $attribute_keys as $attribute_key ) { $attribute_value = $variation['attributes'][ 'attribute_' . sanitize_title( $attribute_key ) ]; echo '<td>' . $attribute_value . '</td>'; } echo '<td>' . $variation_obj->get_price_html() . '</td></tr>'; } echo '</tbody></table></div></div>'; } } } add_action( 'woocommerce_after_single_product_summary', 'display_product_variations' );
Дополнительно:
Открой для себя плагины - увидишь новые горизонты о которых ты даже не мечтал :)
Готовых подобных решений нет или они работают не так как надо.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Вариации WooCommerce в табличном виде нужно выводить не из сырых ярлыков, а из данных вариаций и атрибутов товара. У вариативного товара есть доступные вариации, у каждой вариации есть массив атрибутов, цена, наличие и ID. Названия атрибутов можно получить через
wc_attribute_label(), а значения — через slug термина или обычную строку.Пример базового вывода после описания товара:
add_action('woocommerce_after_single_product_summary', function () { global $product; if (!$product || !$product->is_type('variable')) { return; } $attributes = $product->get_variation_attributes(); $variations = $product->get_available_variations(); if (!$variations) { return; } echo '<table class="variations-table"><thead><tr>'; foreach (array_keys($attributes) as $attribute_name) { echo '<th>' . esc_html(wc_attribute_label($attribute_name)) . '</th>'; } echo '<th>Цена</th></tr></thead><tbody>'; foreach ($variations as $variation_data) { $variation = wc_get_product($variation_data['variation_id']); echo '<tr>'; foreach (array_keys($attributes) as $attribute_name) { $key = 'attribute_' . sanitize_title($attribute_name); $value = $variation_data['attributes'][$key] ?? ''; echo '<td>' . esc_html($value ?: '-') . '</td>'; } echo '<td>' . wp_kses_post($variation->get_price_html()) . '</td>'; echo '</tr>'; } echo '</tbody></table>'; }, 25);
Если значения атрибутов хранятся как термины, slug можно преобразовать в название через
get_term_by(). Также учитывайте вариации “любой размер/любой цвет”: там значение может быть пустым, и его надо показывать понятным текстом.Для глобальных атрибутов WooCommerce ключи обычно выглядят как
attribute_pa_color, а человекочитаемое название термина нужно получать отдельно:$taxonomy = str_replace('attribute_', '', $key); $term = get_term_by('slug', $value, $taxonomy); $label = $term ? $term->name : $value;
Не забывайте экранировать вывод и не показывать вариации, которых нет в наличии, если это важно для покупателя. Таблицу лучше сделать адаптивной: на мобильном добавить горизонтальную прокрутку или карточный вид. Иначе при большом количестве атрибутов она вылезет за экран.