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
)
属性セクションに値が表示されるため、値があることはわかっていますが、カスタムコードで値を表示する方法が見つかりません。
編集済み:
woocommerce_get_product_terms
は非推奨ですWoocommerceバージョン3以降
@ datafeedr written 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'));
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
にコピーして変更します。
woocommerce_get_product_terms()
は廃止されました。
代わりにwc_get_product_terms()
を使用してください。
例:
global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
以下のコードで属性の単一の値を取得できます。
$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);
最新の更新:
$product->get_attribute( 'your_attr' );
ページにない場合は、$product
を定義する必要があります。
これを試して、属性名の配列=>属性値を取得してください:
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;
それはほとんど非効率的ですが、トリックを行います。
「すべての属性を一度に取得するアイデアはありますか?」に対する答え問題は、製品IDのみで関数を呼び出すことです。
$array=get_post_meta($product->id);
キーはオプションです。 http://codex.wordpress.org/Function_Reference/get_post_meta を参照してください
「$ formatted_attributes」で属性を配列として取得します
$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] = wc_get_product_terms( $product->id, $attribute['name']);
} else {
$formatted_attributes[$attribute_label] = $attribute['value'];
}
}
}
print_r($formatted_attributes);
以下のコードを使用して、すべての属性と詳細を取得します
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);