【问题标题】:Get custom product attributes in Woocommerce在 Woocommerce 中获取自定义产品属性
【发布时间】:2012-11-02 17:11:51
【问题描述】:

在 Woocommerce 中,我试图获取产品自定义属性值,但我失败得很惨,我什么也得不到。

所以我尝试了:

global $woocommerce, $post, $product;
$res = get_post_meta($product->id);
print_r(unserialize($res['_product_attributes'][0]));

我得到了这些原始数据:

[pa_koostis] => Array
        (
            [name] => pa_koostis
            [value] => 
            [position] => 0
            [is_visible] => 1
            [is_variation] => 0
            [is_taxonomy] => 1
        )

我知道有一个值,因为它显示在属性部分,但我只是找不到用我的自定义代码显示它的方法。

【问题讨论】:

  • 为这个问题提供的解决方案是针对 2.1 的,您应该更新此代码以在 woocommerce 3.0 中工作,否则将生成大量日志以供弃用

标签: php wordpress woocommerce product custom-taxonomy


【解决方案1】:

您可以使用以下代码获取属性的单个值:

$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);

【讨论】:

  • 一次获取所有属性的任何想法?
  • @ravisoni get_post_meta( $prodict->id , '_product_attributes' );
【解决方案2】:

已编辑woocommerce_get_product_terms 已弃用自 Woocommerce 版本 3 起

按照@datafeedr 写的in his answer

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );

甚至更紧凑:

global $product;
$koostis = $product->get_attribute( 'pa_koostis' );

原答案:

$result = array_shift(woocommerce_get_product_terms($product->id, 'pa_koostis', 'names'));

【讨论】:

    【解决方案3】:

    “有什么办法一次性获取所有属性吗?”问题只是调用只有产品 ID 的函数:

    $array=get_post_meta($product->id);
    

    键是可选的,见http://codex.wordpress.org/Function_Reference/get_post_meta

    【讨论】:

      【解决方案4】:

      woocommerce_get_product_terms() 现在 (2014) 已弃用。

      请改用wc_get_product_terms()

      例子:

      global $product;
      $koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
      

      【讨论】:

      • 这是正确的。我相信 2.1 版中的所有内容都已被软弃用。
      • 我明白了 --> 注意:只有变量应该通过引用传递。 Woocommerce 版本 3.2.6。代码 ---> $date = array_shift( wc_get_product_terms( $product->get_id(), 'pa_date', array( 'fields' => 'names' ) ) );有什么问题?我解决不了。我得到 gettype($date) 的“空”
      【解决方案5】:

      2014 年 9 月:

      $product->get_attribute( 'your_attr' );
      

      如果页面上没有$product,则需要定义它。

      【讨论】:

        【解决方案6】:

        试试这个来获取属性名数组 => 属性值:

        global $product;
        
        $formatted_attributes = array();
        
        $attributes = $product->get_attributes();
        
        foreach($attributes as $attr=>$attr_deets){
        
            $attribute_label = wc_attribute_label($attr);
        
            if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) {
        
                $attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ];
        
                if ( $attribute['is_taxonomy'] ) {
        
                    $formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) );
        
                } else {
        
                    $formatted_attributes[$attribute_label] = $attribute['value'];
                }
        
            }
        }
        
        //print_r($formatted_attributes);
        
        return $formatted_attributes;
        

        这有点低效,但可以解决问题。

        【讨论】:

          【解决方案7】:

          2018 年更新。您可以使用:

          global $product;
          echo wc_display_product_attributes( $product );
          

          要自定义输出,请将plugins/woocommerce/templates/single-product/product-attributes.php 复制到themes/theme-child/woocommerce/single-product/product-attributes.php 并对其进行修改。

          【讨论】:

            【解决方案8】:

            使用以下代码获取所有属性的详细信息

                global $wpdb;
            
                $attribute_taxonomies = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_name != '' ORDER BY attribute_name ASC;" );
                set_transient( 'wc_attribute_taxonomies', $attribute_taxonomies );
            
                $attribute_taxonomies = array_filter( $attribute_taxonomies  ) ;
            
                prin_r($attribute_taxonomies);
            

            【讨论】:

              【解决方案9】:

              虽然@airdrumz 解决方案有效,但直接访问 ID 会导致很多错误,这不利于未来的兼容性。

              但它引导我检查对象并创建这种 OOP 方法:

              function myplug_get_prod_attrs() {
                  // Enqueue scripts happens very early, global $product has not been created yet, neither has the post/loop
                  global $product;
                  $wc_attr_objs = $product->get_attributes();
                  $prod_attrs = [];
                  foreach ($wc_attr_objs as $wc_attr => $wc_term_objs) {
                      $prod_attrs[$wc_attr] = [];
                      $wc_terms = $wc_term_objs->get_terms();
                      foreach ($wc_terms as $wc_term) {
                          array_push($prod_attrs[$wc_attr], $wc_term->slug);
                      }
                  }
                  return $prod_attrs;
              }
              

              奖励,如果您在创建全局 $product 项目之前提前执行上述操作(例如,在排队脚本期间),您可以自己制作:

                  $product = wc_get_product(get_queried_object_id());
              

              【讨论】:

                猜你喜欢
                • 2016-11-24
                • 1970-01-01
                • 2021-01-31
                • 2016-12-20
                • 1970-01-01
                • 2018-09-08
                • 1970-01-01
                • 1970-01-01
                • 2019-04-30
                相关资源
                最近更新 更多