Как вывести атрибуты товаров woocommerce?

У меня есть список атрибутов, мне их требуется вывести определенным образом. Сейчас я делаю это так:

<ul>
                <li><span class="katalog-beer-params-title">производитель:</span>
                    <?php $subheadingvalues = get_the_terms( $product->id, 'pa_proizvoditel'); 
                    foreach ( $subheadingvalues as $subheadingvalue ) { 
                    echo $subheadingvalue->name; } ?>
                </li>
                <li><span class="katalog-beer-params-title">алкоголь:</span>
                    <?php $subheadingvalues = get_the_terms( $product->id, 'pa_alkogol'); 
                    foreach ( $subheadingvalues as $subheadingvalue ) { 
                    echo $subheadingvalue->name; } ?>
                </li>
</ul>


Всё вроде бы неплохо, однако, товары, у которых какие-то атрибуты не заданы, выдают ошибку:
Warning: Invalid argument supplied for foreach()
, к тому же, я жестко привязываю slug атрибутов в карточку товара, а хотело бы чтобы они сами выводились списком, в соответствии с теми атрибутами, которые заданы у товара.
  • Вопрос задан
  • 9659 просмотров
Решения вопроса 1
Palych_tw
@Palych_tw
Типа веб-разработчик
Что бы не получать таких ошибок, нужно делать проверку, а не пуста ли переменная $subheadingvalues. Но это так. А вообще в самом плагине все до вас написано. Атрибуты выводятся в товаре в табе "доп информация", посмотрим код этой табы. plugins/woocommerce/templates/single-product/tabs/additional-information.php
Код там такой <?php $product->list_attributes(); ?> используется метот list_attributes(); Можно на этом остановиться и в своем шаблоне написать
global $product;
$product->list_attributes();

Но получим готовую разметку в виде таблицы. Посмотрим, что делает функция list_attributes();
public function list_attributes() {
		wc_get_template( 'single-product/product-attributes.php', array(
			'product'    => $this
		) );
	}

Идем в папку за нужным файлом plugins/woocommerce/templates/single-product/product-attributes.php
Помимо прочего в нем видим
$attributes = $product->get_attributes();
.........
<?php foreach ( $attributes as $attribute ) :
		if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
			continue;
		} else {
			$has_row = true;
		}
		?>
		<tr class="<?php if ( ( $alt = $alt * -1 ) == 1 ) echo 'alt'; ?>">
			<th><?php echo wc_attribute_label( $attribute['name'] ); ?></th>
			<td><?php
				if ( $attribute['is_taxonomy'] ) {

					$values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );

				} else {

					// Convert pipes to commas and display values
					$values = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) );
					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );

				}
			?></td>
		</tr>
	<?php endforeach; ?>

Адаптируйте под свои нужды. Я думаю, должно работать)

P.S. Не забываем поглядывать в документацию. Вот полный список того, что можно сделать с $product https://docs.woocommerce.com/wc-apidocs/class-WC_P...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
TornMen
@TornMen
Здравствуйте, как можно вывести текст для определенного товара по атрибуту.? допустим если за товаром закреплен определенный атрибут текст выводится, если нет то и текста нет. ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы