简体   繁体   English

通过 WooCommerce 中的自定义库存数量减少来灰显“缺货”产品变化

[英]Greying out “out-of-stock” product variations with custom stock quantity reduction in WooCommerce

I've used the awesome snippet of https://jeroensormani.com/custom-stock-quantity-reduction/ to add an additional setting to variations that reduces the main inventory stock by the set amount in the variation.我使用了令人敬畏的https://jeroensormani.com/custom-stock-quantity-reduction/的片段来向变体添加额外的设置,该设置将主要库存库存减少变体中的设定数量。

The problem I'm facing now is that it doesn't check if those variations are out of stock (for example main inventory is 10, and the bundle setting is set to 12 bottles).我现在面临的问题是它不检查这些变体是否缺货(例如主要库存是 10,捆绑设置设置为 12 瓶)。

The code I've used to add the the multiplier for the total stock reduction is:我用来添加总库存减少乘数的代码是:

// For implementation instructions see: https://aceplugins.com/how-to-add-a-code-snippet/

/**
 * Simple product setting.
 */
function ace_add_stock_inventory_multiplier_setting() {

    ?><div class='options_group'><?php

        woocommerce_wp_text_input( array(
            'id'                => '_stock_multiplier',
            'label'             => __( 'Inventory reduction per quantity sold', 'woocommerce' ),
            'desc_tip'          => 'true',
            'description'       => __( 'Enter the quantity multiplier used for reducing stock levels when purchased.', 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                'min'   => '1',
                'step'  => '1',
            ),
        ) );

    ?></div><?php

}
add_action( 'woocommerce_product_options_inventory_product_data', 'ace_add_stock_inventory_multiplier_setting' );

/**
 * Add variable setting.
 *
 * @param $loop
 * @param $variation_data
 * @param $variation
 */
function ace_add_variation_stock_inventory_multiplier_setting( $loop, $variation_data, $variation ) {

    $variation = wc_get_product( $variation );
    woocommerce_wp_text_input( array(
        'id'                => "stock_multiplier{$loop}",
        'name'              => "stock_multiplier[{$loop}]",
        'value'             => $variation->get_meta( '_stock_multiplier' ),
        'label'             => __( 'Inventory reduction per quantity sold', 'woocommerce' ),
        'desc_tip'          => 'true',
        'description'       => __( 'Enter the quantity multiplier used for reducing stock levels when purchased.', 'woocommerce' ),
        'type'              => 'number',
        'custom_attributes' => array(
            'min'   => '1',
            'step'  => '1',
        ),
    ) );

}
add_action( 'woocommerce_variation_options_pricing', 'ace_add_variation_stock_inventory_multiplier_setting', 50, 3 );

/**
 * Save the custom fields.
 *
 * @param WC_Product $product
 */
function ace_save_custom_stock_reduction_setting( $product ) {

    if ( ! empty( $_POST['_stock_multiplier'] ) ) {
        $product->update_meta_data( '_stock_multiplier', absint( $_POST['_stock_multiplier'] ) );
    }
}
add_action( 'woocommerce_admin_process_product_object', 'ace_save_custom_stock_reduction_setting'  );

/**
 * Save custom variable fields.
 *
 * @param int $variation_id
 * @param $i
 */
function ace_save_variable_custom_stock_reduction_setting( $variation_id, $i ) {
    $variation = wc_get_product( $variation_id );
    if ( ! empty( $_POST['stock_multiplier'] ) && ! empty( $_POST['stock_multiplier'][ $i ] ) ) {
        $variation->update_meta_data( '_stock_multiplier', absint( $_POST['stock_multiplier'][ $i ] ) );
        $variation->save();
    }
}
add_action( 'woocommerce_save_product_variation', 'ace_save_variable_custom_stock_reduction_setting', 10, 2 );

The code that reduces the quantity then is the following:然后减少数量的代码如下:

// For implementation instructions see: https://aceplugins.com/how-to-add-a-code-snippet/

/**
 * Reduce with custom stock quantity based on the settings.
 *
 * @param $quantity
 * @param $order
 * @param $item
 * @return mixed
 */
function ace_custom_stock_reduction( $quantity, $order, $item ) {

    /** @var WC_Order_Item_Product $product */
    $multiplier = $item->get_product()->get_meta( '_stock_multiplier' );

    if ( empty( $multiplier ) && $item->get_product()->is_type( 'variation' ) ) {
        $product = wc_get_product( $item->get_product()->get_parent_id() );
        $multiplier = $product->get_meta( '_stock_multiplier' );
    }

    if ( ! empty( $multiplier ) ) {
        $quantity = $multiplier * $quantity;
    }

    return $quantity;
}
add_filter( 'woocommerce_order_item_quantity', 'ace_custom_stock_reduction', 10, 3 );

What I've tried to do is add an "If" Snippet to check the quantity我试图做的是添加一个“如果”片段来检查数量

add_filter( ‘woocommerce_variation_is_active’, ‘my_jazzy_function’, 10, 2 );

function my_jazzy_function( $active, $variation ) {
    // Get Multiplier
    $multiplier = $item->get_product()->get_meta( '_stock_multiplier' );

    $var_stock_count = $variation->get_stock_quantity();

    // if there are 5 or less, disable the variant, could always just set to 0.
    if( $var_stock_count <= $multiplier ) {
        return false;
    }
    else {
        return true;
    }
}

But this doesn't work, I think it only checks the variations quantity (if you set the variation to its own quantity instead of global).但这不起作用,我认为它只检查变量数量(如果您将变量设置为自己的数量而不是全局)。

How can I compare the total stock count to the newly added setting $multiplier ?如何将总库存数与新添加的设置$multiplier进行比较?

Any help would be great.任何帮助都会很棒。

  • Compare the total stock quantity to the newly added setting $multiplier将总库存数量与新添加的设置$multiplier进行比较
  • Comment with explanation added to the code注释并在代码中添加解释
function filter_woocommerce_variation_is_active( $active, $variation ) {    
    // Get multiplier
    $multiplier = get_post_meta( $variation->get_variation_id(), '_stock_multiplier', true );   
    
    // NOT empty
    if ( ! empty( $multiplier ) ) {
        // Get stock quantity
        $var_stock_count = $variation->get_stock_quantity();
        
        // Stock quantity < multiplier
        if( $var_stock_count < $multiplier ) {
            $active = false;
        }
    }
    
    return $active;
}
add_filter( 'woocommerce_variation_is_active', 'filter_woocommerce_variation_is_active', 10, 2 );

It doesn't work because:它不起作用,因为:

  • $item variable is not defined in your code. $item变量未在您的代码中定义。
  • your custom field is defined in the parent variable product.您的自定义字段在父变量产品中定义。

So you need to replace:所以你需要更换:

$multiplier = $item->get_product()->get_meta( '_stock_multiplier' );

by the folling (getting the data from the parent variable product) :通过以下(从父变量产品中获取数据)

$multiplier = get_post_meta( $variation->get_parent_id(), '_stock_multiplier', true );

So in your code:所以在你的代码中:

add_filter( 'woocommerce_variation_is_active', 'my_jazzy_function', 10, 2 ); 
function my_jazzy_function( $active, $variation ) {    
    // Get multiplier
    if( $multiplier = get_post_meta( $variation->get_parent_id(), '_stock_multiplier', true ) {
        // Get stock quantity
        $var_stock_count = (int) $variation->get_stock_quantity();
    
        // if there are 5 or less, disable the variant, could always just set to 0
        return $var_stock_count <= $multiplier ? false : $active;
    }
    return  $active;
}

It should work now.它现在应该可以工作了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 根据库存数量和 SKU 灰显产品变化 - Greying out product variations based on stock quantity and SKU 向显示为色板的变体添加“缺货”类 - WooCommerce - Adding an “out-of-stock” class to variations shown as swatches - WooCommerce 显示用于 woocommerce 缺货产品变体的自定义 div 块 - Display a custom div block for woocommerce out of stock product variations 当 WooCommerce 档案中的产品缺货时删除自定义数量字段 - Remove custom quantity field when product out of stock on WooCommerce archives 如果产品缺货,则显示属性 - Show attribute if product is Out-Of-Stock Magento 无法获得有库存和无库存的产品 WC_Product_Query Woocommerce - Unable to get products that are both In-Stock and Out-of-Stock WC_Product_Query Woocommerce 在 Woocommerce 库存数量减少上查看定制产品元数据 - Check custom product meta on Woocommerce Stock Quantity Reduction WooCommerce 产品变化:自动启用管理库存和设置库存数量 - WooCommerce product variations: Auto enable Manage Stock and set stock quantity 如果所有变体都缺货,则从目录中隐藏 WooCommerce 可变产品 - Hide WooCommerce variable product from catalog if all variations are out of stock 防止调整行项目库存以减少 WooCommerce 中的自定义库存数量 - Prevent adjust line item stock for custom stock quantity reduction in WooCommerce
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM