我的可变产品有很多变体,其中只有少数商品实际上有库存,而大多数其他变体“可缺货”
我希望能够在每个产品页面的简短产品描述中仅显示有库存商品的快速列表,这样客户就不必逐一尝试所有变体才能最终找出哪些商品有现货。
我搜索了可以执行此操作的插件或代码,但没有找到任何内容。
我找到的最接近的代码是:
add_action( 'woocommerce_after_shop_loop_item', 'bb_echo_stock_variations_loop' );
function bb_echo_stock_variations_loop(){
global $product;
if ( $product->get_type() == 'variable' ) {
foreach ( $product->get_available_variations() as $key ) {
$attr_string = array();
foreach ( $key['attributes'] as $attr_name => $attr_value ) {
$attr_string[] = $attr_value;
}
if ( $key['max_qty'] > 0 ) {
echo '<br/>' . implode( ', ', $attr_string ) . ': ' . $key['max_qty'] . ' in stock';
} else {
echo '<br/>' . implode(', ', $attr_string ) . ': out of stock';
}
}
}
}
但它在商店页面上显示“有库存”可用变体,我希望它显示在单个产品简短描述上。
如何在单品简短描述中显示“有库存”可用变体?
要在产品单页的简短描述中显示库存变体列表,请使用以下命令:
add_filter( 'woocommerce_short_description', 'display_in_stock_variations_to_short_description' );
function display_in_stock_variations_to_short_description( $excerpt ){
global $product;
if ( ! is_product() || empty($product) || ! is_a( $product, 'WC_Product' ) )
return $excerpt;
if( $product->is_type('variable') ) {
// Loop through visible children
foreach( $product->get_children() as $variation_id ) {
$variation = wc_get_product( $variation_id );
// Hide out of stock variations if 'Hide out of stock items from the catalog' is checked.
if ( ! $variation || ! $variation->exists() || ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && ! $variation->is_in_stock() ) ) {
continue;
}
// Filter 'woocommerce_hide_invisible_variations' to optionally hide invisible variations (disabled variations and variations with empty price).
if ( apply_filters( 'woocommerce_hide_invisible_variations', true, $product->get_id(), $variation ) && ! $variation->variation_is_visible() ) {
continue;
}
$max_qty = 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : $variation->get_stock_quantity();
$term_names = []; // Initializing
// Loop through variation attributes for current varation
foreach ( $variation->get_variation_attributes() as $attribute => $term_slug ) {
// Set the term name in an array
$term_names[] = ucfirst( str_replace( ['-', '_'],[' ', ' '], $term_slug ) );
}
if ( $max_qty > 0 ) {
$excerpt .= sprintf( '<br/>%s: %s %s',
implode(', ', $term_names),
$max_qty,
__('in stock', 'woocommerce')
);
}
}
}
return $excerpt;
}
// Avoid additional content from product short description to be displayed in variation description
add_filter( 'woocommerce_available_variation', 'filter_wc_available_variation_desscription', 10, 3);
function filter_wc_available_variation_desscription( $data, $product, $variation ) {
$max_qty = 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : $variation->get_stock_quantity();
if( $max_qty > 0 )
$data['variation_description'] = get_post_meta( $variation->get_id(), '_variation_description', true );
return $data;
}
代码位于活动子主题(或活动主题)的functions.php 文件中。已测试并有效。
add_filter( 'woocommerce_short_description', 'display_in_stock_variations_to_short_description' );
function display_in_stock_variations_to_short_description( $excerpt ) {
global $product;
if ( ! is_product() || empty( $product ) || ! is_a( $product, 'WC_Product' ) )
return $excerpt;
if( $product->is_type('variable') ) {
$term_quantities = []; // Създаваме масив, в който ще съхраняваме вариациите и техните налични бройки
// Loop през видимите вариации
foreach( $product->get_children() as $variation_id ) {
$variation = wc_get_product( $variation_id );
// Скриваме неналичните вариации, ако 'Hide out of stock items from the catalog' е отметнато.
if ( ! $variation || ! $variation->exists() || ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && ! $variation->is_in_stock() ) ) {
continue;
}
// Филтрираме 'woocommerce_hide_invisible_variations', за да скрием по желание невидимите вариации (изключени вариации и вариации с празна цена).
if ( apply_filters( 'woocommerce_hide_invisible_variations', true, $product->get_id(), $variation ) && ! $variation->variation_is_visible() ) {
continue;
}
$max_qty = 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : $variation->get_stock_quantity();
$term_names = []; // Инициализираме
// Loop през атрибутите на вариацията за текущата вариация
foreach ( $variation->get_variation_attributes() as $attribute => $term_slug ) {
// Задаваме името на термина в масив
$term_names[] = ucfirst( str_replace( ['-', '_'],['/', '/'], $term_slug ) );
}
// Добавяме към масива със съхранени вариации и техните бройки
foreach ($term_names as $term_name) {
if (!isset($term_quantities[$term_name])) {
$term_quantities[$term_name] = $max_qty;
} else {
$term_quantities[$term_name] += $max_qty;
}
}
}
// Създаваме текста със списъка на наличните вариации и техните бройки
$available_variations_text = 'Наличност: ';
$variations_list = [];
foreach ($term_quantities as $term_name => $quantity) {
$variations_list[] = "$term_name-$quantity бр";
}
$available_variations_text .= implode(', ', $variations_list);
// Добавяме създадения текст в началото на краткото описание
$excerpt = $available_variations_text . '<br>' . $excerpt;
return $excerpt;
}
return $excerpt;
}