【问题标题】:Change the display of woocommerce stock values更改 woocommerce 股票值的显示
【发布时间】:2021-11-21 18:59:44
【问题描述】:

我想限制在我的产品页面上显示库存(仅在前端),以限制过高的库存。

我的问题和这篇文章类似:Set a max displayed available stock quantity on Woocommerce archives for variable products

其中,下面的代码显示了类似的内容,但有几个缺点:

  • 它在产品目录页面上显示新库存,而不是直接替换产品页面上的库存
  • 它仅适用于可变产品,不适用于简单产品
add_action( 'woocommerce_after_shop_loop_item', 'wc_loop_get_product_stock_availability_text', 10 );
function wc_loop_get_product_stock_availability_text() {
    global $wpdb, $product;

    $max_stock_qty = 50; // Maximum Number of Available Stock qty

    // For variable products
    if( $product->is_type('variable') ) {

        // Get the stock quantity sum of all product variations (children)
        $stock_quantity = $wpdb->get_var("
            SELECT SUM(pm.meta_value) FROM {$wpdb->prefix}posts as p
            JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product_variation'
            AND p.post_status = 'publish' AND p.post_parent = '".get_the_id()."'
            AND pm.meta_key = '_stock' AND pm.meta_value IS NOT NULL
        ");

        if ( $stock_quantity > 0 ) {
            // Here we limit the sock quantity display to 50 when it's up to 50
            $stock_quantity = $stock_quantity >= $max_stock_qty ? $max_stock_qty : $stock_quantity;
            
            echo '<p class="stock in-stock">'. sprintf( __("%s in stock", "woocommerce"), $stock_quantity ).'</p>';
        } else {
            if ( is_numeric($stock_quantity) )
                echo '<p class="stock out-of-stock">' . __("Out of stock", "woocommerce") . '</p>';
            else
                return;
        }
    }
    // Other products types
    else {
        echo wc_get_stock_html( $product );
    }
}

考虑到这些条件,返回值应替换产品页面上显示的库存:

  • 当股票大于 50 时,显示 50 到 100 之间的随机数。
  • 如果股票少于 50,则显示股票的实际价值。

我被困住了,我不知道我是否朝着正确的方向前进, 提前非常感谢!

【问题讨论】:

    标签: php wordpress woocommerce stock


    【解决方案1】:

    您可以过滤woocommerce_get_availability_text并查看库存数量。

    add_filter( 'woocommerce_get_availability_text', 'custom_availability_text', 10, 2 );
    function custom_availability_text( $availability, $product ) {
        if ( ! $product->is_in_stock() ) {
            $availability = __( 'Out of stock', 'woocommerce' );
        } elseif ( $product->managing_stock() && $product->is_on_backorder( 1 ) ) {
            $availability = $product->backorders_require_notification() ? __( 'Available on backorder', 'woocommerce' ) : '';
        } elseif ( ! $product->managing_stock() && $product->is_on_backorder( 1 ) ) {
            $availability = __( 'Available on backorder', 'woocommerce' );
        } elseif ( $product->managing_stock() ) {
            $stock_amount = $product->get_stock_quantity();
            // Check if Stock is less than 50.
            if ( 50 > $stock_amount ) {
                $availability = wc_format_stock_for_display( $product );
            } else {
                if ( false === ( $custom_availability = get_transient( 'custom_availability_text_' . $product->get_id() ) ) ) {
                    $random       = wp_rand( 50, 100 );
                    $availability = sprintf( __( '%s in stock', 'woocommerce' ), wc_format_stock_quantity_for_display( $random, $product ) );
                    // Store for 6 hours. YMMV.
                    set_transient( 'custom_availability_text_' . $product->get_id(), $availability, 6 * HOUR_IN_SECONDS );
                } else {
                    return $custom_availability;
                }
            }
        } else {
            $availability = '';
        }
        return $availability;
    }
    

    我已更新答案以包含 6 小时缓存。

    【讨论】:

    • 非常感谢!您知道是否有一种简单的方法可以在每次页面加载时不刷新数字?
    • 设置瞬态
    • 好的,谢谢您的回答。您有可以添加到上述代码中的示例吗?
    • @LorisGFT 现在对你有用吗?如果是,请接受答案,以便它可以帮助其他人。
    • 现在检查。我颠倒了临时名称的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多