Crear nuevas etiquetas de Stock en Inventario de Woocommerce

Dentro de cada producto, en el apartado Inventario, tenemos tres estados: Hay existencias, Sin stock y Se puede reservar.

Con estas pastillas de código podemos crear nuevos estados, pero son casos diferentes, por lo que tendrás que evaluar cuál te encaja más para tu propósito.

  1. Crear nuevos estados del stock.
  2. Añadir a un estado existente, nuevas etiquetas.

Caso 1. Crear nuevos estados para el stock

<?php
// Añadir nuevas opciones de stock
function filter_woocommerce_product_stock_status_options( $status ) {
    // Add new statuses
    $status['descatalogado'] = __( 'Descatalogado', 'woocommerce' );
    $status['proximamente'] = __( 'Próximamente', 'woocommerce' );

    return $status;
}
add_filter( 'woocommerce_product_stock_status_options', 'filter_woocommerce_product_stock_status_options', 10, 1 );

// Texto de disponibilidad
function filter_woocommerce_get_availability_text( $availability, $product ) {
    // Get stock status
    switch( $product->get_stock_status() ) {
        case 'descatalogado':
            $availability = __( 'Descatalogado', 'woocommerce' );
        break;
        case 'proximamente':
            $availability = __( 'Próximamente', 'woocommerce' );
        break;
    }

    return $availability; 
}
add_filter( 'woocommerce_get_availability_text', 'filter_woocommerce_get_availability_text', 10, 2 );

// Para las clases CSS
function filtrar_woocommerce_estados_inventario( $class, $product ) {
    // Get stock status
    switch( $product->get_stock_status() ) {
        case 'descatalogado':
            $class = 'invdescatalogado';
        break;
        case 'proximamente':
            $class = 'invproximamente';
        break;
    }

    return $class;
}
add_filter( 'woocommerce_get_availability_class', 'filtrar_woocommerce_estados_inventario', 10, 2 );

Caso 2. Añadir a un estado existente, nuevas etiquetas

En este ejemplo se crean 2 nuevas opciones de stock para Out of stock (Sin stock):

  • Out of stock (Descatalogado)
  • Out of stock (Unidades en camino), también se puede renombrar a En fabricación
<?php
// Añadimos tres valores, el primero vacio para se tenga que seleccionar y los estados que penderán de Sin stock
function action_woocommerce_product_options_stock_status() {
    // Custom stock status
    $options = array(
        'empty'     => __( 'N/A', 'woocommerce' ),
        'descatalogado' => __( 'Descatalogado', 'woocommerce' ),
        'udencamino'  => __( 'Unidades en camino', 'woocommerce' ),
    );

    woocommerce_wp_select(
        array(
            'id'            => '_custom_stock_status',
            'wrapper_class' => 'stock_status_field hide_if_variable hide_if_external hide_if_grouped',
            'label'         => __( 'Custom stock status', 'woocommerce' ),
            'options'       => $options,
            'desc_tip'      => true,
            'description'   => __( 'Sin stock tiene dos estados Decatalogado y Unidades en camino', 'woocommerce' ),
        )
    );
}
add_action( 'woocommerce_product_options_stock_status', 'action_woocommerce_product_options_stock_status', 10 );

// Grabamos el custom fiel que hemos creado y se mostrará debajo de Estado del inventario
function action_woocommerce_admin_process_product_object( $product ) {
    // Isset
    if ( isset( $_POST['_custom_stock_status'] ) ) {        
        // Update
        $product->update_meta_data( '_custom_stock_status', sanitize_text_field( $_POST['_custom_stock_status'] ) );
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 );

// Añadimos los textos de las subestados creados para Sin stock o Out of stock
function filter_woocommerce_get_availability_text( $availability, $product ) {
    // Solo para el estado 'outofstock'
    if ( $product->get_stock_status() == 'outofstock' ) {
        // Creamos custom stock status para mostrar y poder elegri las dos opciones
        $custom_stock_status = $product->get_meta( '_custom_stock_status' );

        // Selector de opciones
        if ( $custom_stock_status == 'descatalogado' ) {
            $availability = __( 'Sin stock (Descatalogado)', 'woocommerce' );
        } elseif ( $custom_stock_status == 'udencamino' ) {
            $availability = __( 'Sin stock (Unidades en camino)', 'woocommerce' );
        }
    }

    return $availability; 
}
add_filter( 'woocommerce_get_availability_text', 'filter_woocommerce_get_availability_text', 10, 2 );