Mostrar agotado en el producto variable de WooCommerce cuando todas las variaciones están agotadas

3 minutos de lectura

avatar de usuario
brucey bandido

En WooCommerce estoy usando la función a continuación donde agrega un texto agotado en la miniatura del producto si el producto está agotado:

add_action( 'woocommerce_before_shop_loop_item_title', 'bbloomer_display_sold_out_loop_woocommerce' );
 
function bbloomer_display_sold_out_loop_woocommerce() {
    global $product;
    if ( ! $product->is_in_stock() ) {
        echo '<span class="soldout">Sold Out</span>';
    }
} 

Funciona para un producto simple, pero no para productos variables.

Para productos variables con variaciones, si configuro todas las variaciones en 0 cantidad de stock excepto 1 variación, noto que el mensaje de agotado todavía aparece en la miniatura. Técnicamente esto no es correcto ya que tenemos algunos en stock.

¿Alguien sabe cómo cambiar el código a continuación para manejar esto?

avatar de usuario
LoicTheAztec

Puede crear una función condicional personalizada para verificar si todas las variaciones de un producto variable están “agotadas” de la siguiente manera:

function is_variable_product_out_of_stock( $product ) {
    $children_count = 0; // initializing
    $variation_ids  = $product->get_visible_children();
        
    // Loop through children variations of the parent variable product
    foreach( $variation_ids as $variation_id ) {{
        $variation = wc_get_product($_variation_id); // Get the product variation Object
            
        if( ! $variation->is_in_stock() ) {
            $children_count++; // count out of stock children
        }
    }
    // Compare counts and return a boolean
    return count($variation_ids) == $children_count ? true : false;
}

Luego lo usará en su función enganchada revisada a continuación:

add_action( 'woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock' );
 
function display_products_loop_out_of_stock() {
    global $product;

    if ( ( ! $product->is_type('variable') && ! $product->is_in_stock()  ) 
    || ( $product->is_type('variable') && is_variable_product_out_of_stock( $product ) ) ) {
        echo '<span class="soldout">Sold Out</span>';
    }
} 

El código va en el archivo functions.php del tema secundario activo (o tema activo). Debería funcionar.

  • No puedo editar la publicación por alguna razón, pero hay dos errores fatales en el código: un doble “{{” que debería ser único y una variable “$_variation_id” que se usa en lugar de “$variation_id”

    – rathus

    30 de junio de 2021 a las 8:53

Hice una versión más ligera de la función de @LoicTheAztec que dejará de repetirse tan pronto como encuentre una variable que esté disponible:

function is_variable_product_out_of_stock($product) {
    $variation_ids = $product->get_visible_children();
    foreach($variation_ids as $variation_id) {
        $variation = wc_get_product($variation_id);
        if ($variation->is_in_stock())
            return false;
    }
    return true;
}

También sin error fatal porque cometió dos errores tipográficos críticos en su función.

Puedes hacer algo personalizado como lo hizo él:

add_action('woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock');
function display_products_loop_out_of_stock() {
    global $product;
    if ((!$product->is_type('variable') and !$product->is_in_stock()) or ($product->is_type('variable') and is_variable_product_out_of_stock($product)))
        echo '<span class="soldout">Sold Out</span>';
}

¿Ha sido útil esta solución?