在 Woocommerce 3 中获取产品属性

更新 WooCommerce 后属性不再显示.

Attributes no longer displayed after I have updated WooCommerce.

在模板 content-single-product.php 中,如果我使用 var_dump($attribute_names); 我会得到一个对象数组.

In the template content-single-product.php if I use var_dump($attribute_names); I get an array of objects.

foreach( $attribute_names as $attribute_name ) 中,数据的范围受到保护.

In foreach( $attribute_names as $attribute_name ) the scope of data is protected.

这是这个模板的代码:

$attributes = $product->get_attributes();

<?php if($attributes) {echo "<p class='product-desc-title'>Параметры</p>";}  ?>          
<?php foreach ( $attributes as $attribute ) : ?>          
<?php
    if ( $attribute['is_taxonomy'] ) {
          global $post;
          $attribute_names = $attribute;

          foreach ( $attribute_names as $attribute_name ) {
            $taxonomy = get_taxonomy( $attribute_name );

              if ( $taxonomy && ! is_wp_error( $taxonomy ) ) {
                  $terms = wp_get_post_terms( $post->ID, $attribute_name );

                  $terms_array = array();
                  $attrID = $attribute['name'];
                  $paPMat = 'pa_product-material';
                  $paPColor = 'pa_product-color';

                  // При добавлении новых атрибутов для товаров добавить новый массив с названием атрибута и слагом с приставкой "pa_"
                  $pAttributes_array = array(
                      array(
                          'label' => 'Материал фасадов',
                          'slug' => 'pa_product-material',
                      ),
                      array(
                          'label' => 'Цвет',
                          'slug' => 'pa_product-color',
                      ),
                      array(
                          'label' => 'Конфигурация',
                          'slug' => 'pa_konfiguraciya',
                      ),
                      array(
                          'label' => 'Материал корпуса',
                          'slug' => 'pa_material-kuxni',
                      ),
                      array(
                          'label' => 'Форма',
                          'slug' => 'pa_forma',
                      ),
                      array(
                          'label' => 'Тип дверей',
                          'slug' => 'pa_tip-dverej',
                      ),
                      array(
                          'label' => 'Створки',
                          'slug' => 'pa_stvorki',
                      ),
                array(
                          'label' => 'Размеры',
                          'slug' => 'pa_razmery',
                      ),

                  );

                  foreach ($pAttributes_array as $key => $value) {
                      if ( ! empty( $terms ) && $attrID ===  $value['slug'] ) {
                        foreach ( $terms as $term ) {
                             $archive_link = get_term_link( $term->slug, $attribute_name );
                             $full_line = '<a href="' . $archive_link . '">'. $term->name . '</a>';
                             array_push( $terms_array, $full_line );
                        }
                        echo '<p class="pa-string">'. $value['label'] .': '. implode( $terms_array, ',  ' ) . '</p>';
                      }
                  }
              }
          }                                                 
      } else {
          $values = array_map( 'trim', explode( '|', $attribute['value'] ) );
          echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );
      }
?>
<?php endforeach; ?>

推荐答案

更新: 压缩代码以进行测试:

Updated: Compacting your code for testing:

$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ):
    $attribute_names = $attribute;
    // testing output
    var_dump($attribute_name);
endforeach;

var_dump($attribute_name); 原始输出为您提供有关 WC_Product_Attribute 对象,这意味着您必须使用 这个类.

The var_dump($attribute_name); raw output gives you indications about the objects which are WC_Product_Attribute objects, meaning that you have to use the available methods for this class.

有两种方法:

1) 您可以使用 get_data() 方法如下:

1) You can access properties in an unprotected array using the get_data() method this way:

$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ):
    $attribute_data = $attribute->get_data();
    // testing pre-formatted output
    echo '<pre>'; print_r($attribute_data); echo '</pre>'; 
    // We stop the loop to get the first object only (for testing)
    break; 
endforeach;

这将为您提供如下原始输出:

That will gives you a raw output like:

Array (
    [id] => 1
    [name] => pa_color
    [options] => Array (
        [0] => 8
        [1] => 9
    )
    [position] => 0
    [visible] => 
    [variation] => 1
    [is_visible] => 0
    [is_variation] => 1
    [is_taxonomy] => 1
    [value] => 
)

然后你可以这样使用它:

And then you can use it this way:

$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ):
    $attribute_data = $attribute->get_data(); // Get the data in an array

    $attribute_name = $attribute_data['name']; // The taxonomy slug name
    $attribute_terms = $attribute_data['options']; // The terms Ids
endforeach;

2) 您可以使用 WC_Product_Attribute 方法如:

2) You can use the WC_Product_Attribute methods like:

$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ):
    $attribute_name = $attribute->get_taxonomy(); // The taxonomy slug name
    $attribute_terms = $attribute->get_terms(); // The terms
    $attribute_slugs = $vaattributeues->get_slugs(); // The term slugs
endforeach;

相关文章