在 Woocommerce 产品中为库存通知添加额外的 CSS class

Add an extra CSS class for stock notice in Woocommerce products

我需要一个额外的 class 用于 WooCommerce 产品页面上的库存通知。 目前,有两个不同的 classes in-stockout-of-stock。 但是 WooCommerce 中还有第三种选择。如果只有几件库存商品,class 也将是 in-stock。如果有 few-in-stock.

这样的东西就好了

我检查了生成输出的模板文件 stock.php。只有一行代码:

<p class="stock <?php echo esc_attr( $class ); ?>"><?php echo wp_kses_post( $availability ); ?></p>

$class只有上面的两个选项。有什么函数可以用来添加第三个 class?

目前我是这样统计产品库存的:

$stock_count = $product->get_stock_quantity();

然后像这样添加我的新 class:

<p class="stock <?php echo esc_attr( $class ); ?> <?php if ( $stock_count <= '2' ) : ?>few-in-stock<?php endif; ?>"><?php echo wp_kses_post( $availability ); ?></p>

但也许有更好的方法来做到这一点?!

这是 woocommerce_get_stock_html 过滤器挂钩中的函数,它允许您为低库存添加额外的库存通知(自定义 CSS):

add_filter( 'woocommerce_get_stock_html', 'filter_get_stock_html', 10, 2 );
function filter_get_stock_html( $html, $product ) {
    // Low stock quantity amount
    $low_stock_qty = 3;

    $availability = $product->get_availability();

    if ( ! empty( $availability['availability'] ) ) {
        $class = esc_attr( $availability['class'] );
        $avail_text = wp_kses_post( $availability['availability'] );
        $stock_qty = $product->get_stock_quantity();

        if( $stock_qty <= $low_stock_qty ){
            $class .= ' few-in-stock';
            $avail_text = __('Few in stock', 'woocommerce');
        }
        ob_start();

        // Make your changes below
        ?>
        <p class="stock <?php echo $class; ?>"><?php echo $avail_text; ?></p>
        <?php

        $html = ob_get_clean();
    }
    return $html;
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。

Get optionally the low stock amount from general product inventory settings

If you have set "low stock threshold" in Settings > Product > Inventory, you can get it and replace the manual inputed value, replacing the following line:

// Low stock quantity amount
 $low_stock_qty = 3;

By this:

// Low stock quantity amount
 $low_stock_qty = get_option('woocommerce_notify_low_stock_amount');

(Thanks to @Demian)

@LoicTheAztec 的回答是一个好的开始。但是,缺少的关键点是您想从后端反映 "Low stock threshold" 。

在他的回答中你必须手动填写低库存数量是多少if( $stock_qty <= 10 ){。但是,woocommerce 后端设置 > 产品 > 库存确实记录了数量。因此,您最好在这一行中填写:

if( $stock_qty <= get_option( 'woocommerce_notify_low_stock_amount' ) ){

这样,如果您想更改数量,就不必深入研究函数文件。

所以完整的代码是:

add_filter( 'woocommerce_get_stock_html', 'filter_get_stock_html', 10, 2 );
function filter_get_stock_html( $html, $product ) {
    $availability = $product->get_availability();

    if ( ! empty( $availability['availability'] ) ) {
        $class = esc_attr( $availability['class'] );
        $avail_text = wp_kses_post( $availability['availability'] );
        $stock_qty = $product->get_stock_quantity();

        if( $stock_qty <= get_option( 'woocommerce_notify_low_stock_amount' ) ){ // reflects backend for Low stock threshold
            $class .= ' low-in-stock';
            $avail_text = __('Low in stock', 'woocommerce');
        }
        ob_start();

        // HTML reflection:

        ?><p class="stock <?php echo $class; ?>"><?php echo $avail_text; ?></p><?php

        $html = ob_get_clean();
    }
    return $html;
}

Extra:如果你不希望上面的low-in-stockclass涉及到负库存数量(即-10),改变上面代码片段

的下一行
if( $stock_qty <= get_option( 'woocommerce_notify_low_stock_amount' ) ){

有了这个:

if( $stock_qty >= 0 && $stock_qty <= get_option( 'woocommerce_notify_low_stock_amount' ) ){

它将 low-in-stock class 设置在 0 和您在后端 woocommerce 设置中设置的数量之间。