显示 WooCommerce 自定义产品属性和单个产品的所有条款
Display WooCommerce Custom Product Attributes and all terms on single products
我使用自定义功能在 WooCommerce 单品页面上创建了六个自定义属性。它们包括:图标、标签和术语。
基于 答案代码,我使用了以下函数 (带有自定义 HTML 标记,与中的标记不同WooCommerce 产品-attributes.php 模板):
add_action('woocommerce_single_product_summary', 'pa_custom_attributes', 25);
function pa_custom_attributes(){
global $product;
$attributes = $product->get_attributes();
if ( ! $attributes ) return;
$out = '<div class="custom-attributes">';
foreach ( $attributes as $attribute ) {
if ( $attribute->get_variation() ) continue;
if ( $attribute->is_taxonomy() ) {
$taxonomy = $attribute->get_name();
$taxo_obj = $attribute->get_taxonomy_object();
$name = $taxo_obj->attribute_name;
$label = $taxo_obj->attribute_label;
$label_name = wc_attribute_label( $taxonomy );
$out .= '<div class="' . esc_attr( $taxonomy ) . ' single-attribute">';
$out .= '<div><img class="attribute-image" src="'.get_stylesheet_directory_uri().'/woocommerce/attributes/'.$name.'.svg" alt="Attribute '.$label.'"/></div>';
$out .= '<div class="attribute-label '.$label.'">'.$label_name.'</div>';
$out .= '<div class="attribute-values">';
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
foreach ( $terms as $term_name )
$term_names['names'] = $term_name;
$out .= implode(', ', $term_names);
$out .= '</div></div>';
} else {
$value_string = implode( ', ', $attribute->get_options() );
$out .= '<div class="' . sanitize_title($taxonomy) . ' ' . sanitize_title( $value_string ) . '">';
$out .= '<div class="attribute-label">' . $taxonomy . ': </div> ';
$out .= '<div class="attribute-value">' . esc_html( $value_string ) . '</div></div>';
}
}
$out .= '</div>';
echo $out;
}
该函数工作正常,但有一个问题:如果特定属性的项不止一个(例如颜色:红色、蓝色、绿色),在屏幕上该函数仅打印最后一个值数组。
我阅读了文档并做了很多测试,并检查 CSS 上没有问题。我还在 Whosebug 和网上阅读了几乎所有关于该主题的问题的答案,但我找不到答案。
有谁能帮我看看哪里出错了?
问题出在您的代码中:
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
foreach ( $terms as $term_name )
$term_names['names'] = $term_name;
$out .= implode(', ', $term_names);
你可以替换为这个:
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
$term_names = []; // Initializing
// Loop through each terms
foreach ( $terms as $term_name ) {
$term_names[] = $term_name;
}
$out .= implode(', ', $term_names);
或者一行代码更好:
$out .= $product->get_attribute( $taxonomy );
我使用自定义功能在 WooCommerce 单品页面上创建了六个自定义属性。它们包括:图标、标签和术语。
基于
add_action('woocommerce_single_product_summary', 'pa_custom_attributes', 25);
function pa_custom_attributes(){
global $product;
$attributes = $product->get_attributes();
if ( ! $attributes ) return;
$out = '<div class="custom-attributes">';
foreach ( $attributes as $attribute ) {
if ( $attribute->get_variation() ) continue;
if ( $attribute->is_taxonomy() ) {
$taxonomy = $attribute->get_name();
$taxo_obj = $attribute->get_taxonomy_object();
$name = $taxo_obj->attribute_name;
$label = $taxo_obj->attribute_label;
$label_name = wc_attribute_label( $taxonomy );
$out .= '<div class="' . esc_attr( $taxonomy ) . ' single-attribute">';
$out .= '<div><img class="attribute-image" src="'.get_stylesheet_directory_uri().'/woocommerce/attributes/'.$name.'.svg" alt="Attribute '.$label.'"/></div>';
$out .= '<div class="attribute-label '.$label.'">'.$label_name.'</div>';
$out .= '<div class="attribute-values">';
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
foreach ( $terms as $term_name )
$term_names['names'] = $term_name;
$out .= implode(', ', $term_names);
$out .= '</div></div>';
} else {
$value_string = implode( ', ', $attribute->get_options() );
$out .= '<div class="' . sanitize_title($taxonomy) . ' ' . sanitize_title( $value_string ) . '">';
$out .= '<div class="attribute-label">' . $taxonomy . ': </div> ';
$out .= '<div class="attribute-value">' . esc_html( $value_string ) . '</div></div>';
}
}
$out .= '</div>';
echo $out;
}
该函数工作正常,但有一个问题:如果特定属性的项不止一个(例如颜色:红色、蓝色、绿色),在屏幕上该函数仅打印最后一个值数组。
我阅读了文档并做了很多测试,并检查 CSS 上没有问题。我还在 Whosebug 和网上阅读了几乎所有关于该主题的问题的答案,但我找不到答案。
有谁能帮我看看哪里出错了?
问题出在您的代码中:
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
foreach ( $terms as $term_name )
$term_names['names'] = $term_name;
$out .= implode(', ', $term_names);
你可以替换为这个:
$terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );
$term_names = []; // Initializing
// Loop through each terms
foreach ( $terms as $term_name ) {
$term_names[] = $term_name;
}
$out .= implode(', ', $term_names);
或者一行代码更好:
$out .= $product->get_attribute( $taxonomy );