WooCommerce исключает определенные атрибуты продукта со страницы магазина

Я ломал голову над этим. В настоящее время для отображения всех пользовательских атрибутов товара на странице магазина (не путать со страницей товара) я использую:

function show_attr() {
   global $product;
   echo '<div class="attributes">';
   $product->list_attributes();
   echo'</div>'
}

Это прекрасно работает и отображает все атрибуты продукта, но я хочу включить только некоторые. Я также пытался следовать советам этого человека:

<?php foreach ( $attributes as $attribute ) :
    if ( empty( $attribute['is_visible'] ) || 'CSC Credit' == $attribute['name'] || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
        continue;
    } else {
        $has_row = true;
    }
?>

Так что к сожалению тоже не сработало. Мне удалось удалить нужный атрибут, но он удаляет его на КАЖДОЙ странице, и я хочу исключить его только со страницы магазина.

Я вижу, что переменная $attribute имеет это [is_visible] состояние. У кого-нибудь есть идеи, как я могу удалить это для определенных атрибутов на странице магазина? Я в полной растерянности. Спасибо за любую помощь.

2 ответа

Решение

Как уже упоминалось в моем комментарии, вы можете контролировать атрибуты любого продукта через woocommerce_get_product_attributes фильтр. $attributes проходящие через этот фильтр находятся в ассоциативном массиве массивов. с атрибутом "slug" в качестве ключа массива. В качестве примера var_dump() может выявить следующее $attributes,

array (size=1)
  'pa_color' => 
    array (size=6)
      'name' => string 'pa_color' (length=8)
      'value' => string '' (length=0)
      'position' => string '0' (length=1)
      'is_visible' => int 0
      'is_variation' => int 1
      'is_taxonomy' => int 1

Если атрибут является таксономией, слаг будет иметь префикс "pa_", который я всегда считал символом продукта. У атрибута, который не является таксономией, будет просто имя для слага, например: "размер".

Используя условные теги WooCommerce, вы можете настроить таргетинг атрибутов только на странице магазина.

Вот два примера фильтров, первый для исключения конкретного атрибута:

// Exclude a certain product attribute on the shop page
function so_39753734_remove_attributes( $attributes ) {

    if( is_shop() ){
        if( isset( $attributes['pa_color'] ) ){
            unset( $attributes['pa_color'] );
        }
    }

    return $attributes;
}
add_filter( 'woocommerce_product_get_attributes', 'so_39753734_remove_attributes' );

И последнее предназначено для создания настраиваемого списка атрибутов на основе атрибутов, которые вы хотите включить.

// Include only a certain product attribute on the shop page
function so_39753734_filter_attributes( $attributes ) {

    if( is_shop() ){
        $new_attributes = array();

        if( isset( $attributes['pa_color'] ) ){
            $new_attributes['pa_color'] = $attributes['pa_color'] ;
        }

        $attributes = $new_attributes;

    }

    return $attributes;
}
add_filter( 'woocommerce_product_get_attributes', 'so_39753734_filter_attributes' );

Обновлено 29 марта 2018 года woocommerce_product_get_attributes поскольку woocommerce_get_product_attributes устарела.

Попробуй это!

<?php
if (is_page('shop')) {
    foreach ( $attributes as $attribute ) :
        if ( empty( $attribute['is_visible'] ) || 'CSC Credit' == $attribute['name'] || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
            continue;
        } else {
            $has_row = true;
        }
    }
?>
Другие вопросы по тегам