Выделение серым цветом вариаций товаров, которых нет в наличии, с индивидуальным сокращением количества товаров в WooCommerce - PullRequest
4 голосов
/ 09 июля 2020

Я использовал замечательный фрагмент https://jeroensormani.com/custom-stock-quantity-reduction/, чтобы добавить дополнительную настройку к вариантам, которые уменьшают основной запас инвентаря на заданное количество в варианте.

Проблема I Сейчас я столкнулся с тем, что он не проверяет, нет ли этих вариантов в наличии (например, основной инвентарь - 10, а настройка набора установлена ​​на 12 бутылок).

Код, который я использовал для Добавьте множитель для общего сокращения запасов:

// 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 );

Код, уменьшающий количество, следующий:

// 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 );

Я пытался добавить фрагмент «Если» для проверки количества

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;
    }
}

Но это не работает, я думаю, что проверяется только количество вариантов (если вы установите

Как я могу сравнить общее количество запасов с недавно добавленными настройками $multiplier?

Любая помощь будет отличной.

Ответы [ 2 ]

5 голосов
/ 09 июля 2020
  • Сравните общее количество запасов с вновь добавленными настройками $multiplier
  • Комментарий с пояснением, добавленным к коду
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 );
1 голос
/ 09 июля 2020

Это не работает, потому что:

  • $item переменная не определена в вашем коде.
  • ваше настраиваемое поле определено в родительской переменной product.

Итак, вам нужно заменить:

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

следующим (получение данных из родительской переменной product) :

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

Итак, в вашем коде:

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;
}

Теперь он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...