Woocommerce 可变产品库存状态问题

问题描述 投票:0回答:1

我正在尝试修复以下 WooCommerce 代码片段,该代码片段应正确显示简单产品和可变产品的库存状态。

它适用于简单产品和可变产品,除了以下情况:所有变体都缺货,并且显示在库存中。

add_shortcode( 'stock_status', 'display_product_stock_status' );
function display_product_stock_status( $atts) {

    $atts = shortcode_atts(
        array('id'  => get_the_ID() ),
        $atts, 'stock_status'
    );

    $product = wc_get_product( $atts['id'] );

    if ( $product->is_type( 'variable' ) ) {
        $children = $product->get_children();

        $in_stock = false;
        $out_of_stock = false;
        $on_backorder = false;
        $all_variations_on_backorder = true;

        foreach ( $children as $child_id ) {
            $child = wc_get_product( $child_id );
            if ( $child->is_in_stock() ) {
                $in_stock = true;
                $all_variations_on_backorder = false;
            } elseif ( !$child->is_in_stock() && $child->backorders_allowed() ) {
                $on_backorder = true;
            } else {
                $out_of_stock = true;
                $all_variations_on_backorder = false;
            }
        }

        if ( $all_variations_on_backorder ) {
            return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
        } elseif ( $in_stock && !$out_of_stock && !$on_backorder ) {
            return '<p class="stock in-stock">In stoc</p>';
        } elseif ( !$in_stock && $out_of_stock && !$on_backorder ) {
            return '<p class="stock out-of-stock">Stoc epuizat</p>';
        } elseif ( $in_stock && $out_of_stock && !$on_backorder ) {
            return '<p class="stock in-stock">In stoc (unele variante)</p>';
        } elseif ( $in_stock && !$out_of_stock && $on_backorder ) {
            return '<p class="stock in-stock">In stoc, Disponibil cu precomanda (unele variante)</p>';
        } elseif ( !$in_stock && $out_of_stock && $on_backorder ) {
            return '<p class="stock on-backorder">Disponibil cu precomanda (unele variante), Stoc epuizat (unele variante)</p>';
        } elseif ( $in_stock && $out_of_stock && $on_backorder ) {
            return '<p class="stock in-stock">In stoc (unele variante), Disponibil cu precomanda (unele variante)</p>';
        }
    } else {
        $stock_status = $product->get_stock_status();

        if ( 'instock' == $stock_status) {
            return '<p class="stock in-stock">In stoc</p>';
        }
        if ( 'out-of-stock' == $stock_status ){
            return '<p class="stock out-of-stock">Stoc epuizat</p>';
        }
        if ( 'onbackorder' == $stock_status ){
            return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
        }
    }
}

有什么想法吗?

谢谢,

尝试使用 $in_stock = true 进行初始化;没用。

woocommerce hook-woocommerce
1个回答
0
投票

您遇到的问题似乎源于代码片段如何处理所有缺货的变体。您检查 all_variations_on_backorder 的逻辑可能未正确设置。以下是可以优化的内容的详细说明:

问题: 该代码段适用于简单产品和可变产品,但在所有变体都处于缺货状态的情况下,它无法正确显示该条件。

解决方案: 您需要确保正确检查 all_variations_on_backorder,并且条件应正确区分库存、缺货和缺货状态。

优化代码: 尝试对逻辑进行以下调整:

add_shortcode( 'stock_status', 'display_product_stock_status' );

函数display_product_stock_status($atts) {

$atts = shortcode_atts(
    array('id'  => get_the_ID() ),
    $atts, 'stock_status'
);

$product = wc_get_product( $atts['id'] );

if ( $product->is_type( 'variable' ) ) {
    $children = $product->get_children();

    $in_stock = false;
    $out_of_stock = true;
    $on_backorder = false;
    $all_variations_on_backorder = true;

    foreach ( $children as $child_id ) {
        $child = wc_get_product( $child_id );

        if ( $child->is_in_stock() ) {
            $in_stock = true;
            $all_variations_on_backorder = false;
            $out_of_stock = false;
        } elseif ( !$child->is_in_stock() && $child->backorders_allowed() ) {
            $on_backorder = true;
        } else {
            $out_of_stock = true;
            $all_variations_on_backorder = false;
        }
    }

    // Check if all variations are on backorder
    if ( $all_variations_on_backorder ) {
        return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
    }

    // Display appropriate stock status
    if ( $in_stock && !$out_of_stock && !$on_backorder ) {
        return '<p class="stock in-stock">In stoc</p>';
    } elseif ( !$in_stock && $out_of_stock && !$on_backorder ) {
        return '<p class="stock out-of-stock">Stoc epuizat</p>';
    } elseif ( $in_stock && $out_of_stock && !$on_backorder ) {
        return '<p class="stock in-stock">In stoc (unele variante)</p>';
    } elseif ( $in_stock && !$out_of_stock && $on_backorder ) {
        return '<p class="stock in-stock">In stoc, Disponibil cu precomanda (unele variante)</p>';
    } elseif ( !$in_stock && !$out_of_stock && $on_backorder ) {
        return '<p class="stock on-backorder">Disponibil cu precomanda (toate variantele)</p>';
    } elseif ( $in_stock && $out_of_stock && $on_backorder ) {
        return '<p class="stock in-stock">In stoc (unele variante), Disponibil cu precomanda (unele variante)</p>';
    }
} else {
    $stock_status = $product->get_stock_status();

    if ( 'instock' == $stock_status) {
        return '<p class="stock in-stock">In stoc</p>';
    }
    if ( 'out-of-stock' == $stock_status ){
        return '<p class="stock out-of-stock">Stoc epuizat</p>';
    }
    if ( 'onbackorder' == $stock_status ){
        return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
    }
}

}

主要变化: $out_of_stock 现在被初始化为 true,这确保我们开始假设所有变体都缺货,除非另有证明。 对延期交货的所有变化的检查进行了调整,以更清楚地区分这种情况并返回正确的库存消息。 在一些不必要的情况下删除了多余的 all_variations_on_backorder 设置。 现在应该可以正确显示可变产品的库存状态,特别是在所有变体都处于缺货状态的情况下。如果有效请告诉我!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.