Как вывести вариации в табличном виде?

Ссылка скопирована
1 ответ

Как переписать код, чтобы у товаров вариации после полного описания в табличном виде выводились. Сейчас получилось вывести ярлыки, но названия так и не выводятся

// Вариации таблицей 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' );

Дополнительно:

Открой для себя плагины - увидишь новые горизонты о которых ты даже не мечтал :)

  • Refguser, причём тут плагины?
    Готовых подобных решений нет или они работают не так как надо.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Мария Код Ответ

    Вариации 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);

    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;

    $taxonomy = str_replace('attribute_', '', $key); $term = get_term_by('slug', $value, $taxonomy); $label = $term ? $term->name : $value;

    Не забывайте экранировать вывод и не показывать вариации, которых нет в наличии, если это важно для покупателя. Таблицу лучше сделать адаптивной: на мобильном добавить горизонтальную прокрутку или карточный вид. Иначе при большом количестве атрибутов она вылезет за экран.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно