Ocultar productos relacionados fuera de stock en WooCommerce

5 minutos de lectura

avatar de usuario
sarah molinero

En WooCommerce me gustaría ocultar Agotado productos de Productos relacionados en páginas de un solo producto. ¿Es posible?

Cualquier pista es apreciada.

Ninguna de las respuestas dadas aquí funcionó para mí (creo que el woocommerce_output_related_products_args el filtro mencionado no acepta meta_consultas), y quería una solución que no usara una consulta SQL, así que preparé la solución a continuación:

add_filter( 'woocommerce_related_products', 'mysite_filter_related_products', 10, 1 );
function mysite_filter_related_products( $related_product_ids ) {

    foreach( $related_product_ids as $key => $value ) {
        $relatedProduct = wc_get_product( $value );
        if( ! $relatedProduct->is_in_stock() ) {
            unset( $related_product_ids["$key"] );
        }
    }

    return $related_product_ids;
}

Espero que ayude a alguien que busca una solución similar.

  • +1, pero el uso de esta solución no reemplazará los productos relacionados eliminados con otros productos relacionados, por lo que terminará con menos de la cantidad de productos relacionados que deseaba. Por ejemplo, si desea que se muestren siempre 4, pero los productos relacionados de un producto en particular contienen 2 productos agotados, solo se mostrarán 2 productos relacionados.

    – Dan.

    18 de mayo de 2020 a las 8:19

  • Para arreglar eso, uno podría agregar más código, antes de la devolución, para verificar el conteo de $related_product_ids y consultar por más productos, si el conteo es menor que el número deseado.

    – Dan.

    18 de mayo de 2020 a las 8:21

  • Tampoco funciona para las últimas versiones de woocommerce. El filtro woocommerce_related_products no solo recibe el $related_products_idsargumento.

    – svelandiag

    9 de marzo de 2021 a las 16:38

  • Funciona, gracias dmoz y sarah miller.

    – Diseño web

    31 de enero a las 10:03

avatar de usuario
LoicTheAztec

ACTUALIZACIÓN 2021

Puedes usar lo siguiente:

add_filter( 'woocommerce_product_related_posts_query', 'alter_product_related_posts_query', 10, 3 );
function alter_product_related_posts_query( $query, $product_id, $args ){
    global $wpdb;

    $query['join']  .= " INNER JOIN {$wpdb->postmeta} as pm ON p.ID = pm.post_id ";
    $query['where'] .= " AND pm.meta_key = '_stock_status' AND meta_value="instock" ";
    
    return $query;
}

El código va en el archivo functions.php de su tema secundario activo (o tema activo).

Ahora necesitamos eliminar los datos almacenados en caché de “productos relacionados” eliminando los transitorios relacionados para vaciar este caché (gracias a @Cody Rees).

Hay 2 formas de hacerlo:

1). los más fácil camino:

Vaya a admin Woocommerce > Estado > Herramientas > Transitorios de WooCommerce y presione “Borrar transitorios”.

2). La otra forma de eliminar transitorios relacionados específicos:

Agrega el siguiente código y guarda:

add_action('init', 'delete_related_products_cached_data');
function delete_related_products_cached_data() {
    global $wpdb;

    $wpdb->query("DELETE FROM {$wpdb->prefix}options WHERE `option_name` LIKE '_transient_wc_related_%'");
}

El código va en el archivo functions.php de su tema secundario activo (o tema activo).

Ejecutarlo solo una vez al navegar por cualquier página de su sitio web y eliminarlo.

  • Realmente aprecio tu ayuda: Pero no funciona; He borrado el caché pero no veo ningún cambio.

    – sarah molinero

    2 de marzo de 2019 a las 9:38


  • Sé que tu código es correcto; ¡Pero no sé por qué no le pasa nada a mi sitio! ¡He cambiado tantas veces este código! ¡Pero no vi ningún cambio! ¿Qué ocurre?

    – sarah molinero

    5 de marzo de 2019 a las 18:34

  • @sarahmiller No tengo nada mejor, por ejemplo.

    – LoicTheAztec

    5 de marzo de 2019 a las 19:28


  • No funciona con productos de pedidos pendientes. Se muestran a pesar de _stock_status = instock

    – Pbinder

    23 de noviembre de 2020 a las 13:56

  • La respuesta ha sido actualizada gracias a @CodyRees

    – LoicTheAztec

    1 de marzo de 2021 a las 2:52

Sí, es posible ocultar productos agotados de productos relacionados.

Agregue lo siguiente a functions.php: esto ocultará los productos agotados de los productos relacionados.

add_filter( 'woocommerce_output_related_products_args', function( $args )
{
    $args = wp_parse_args( array(
        'posts_per_page' => 4,
        'meta_query' => array (
           'key' => '_stock_status',
           'value' => 'instock'
    )
    ), $args );
    return $args;
});

Las publicaciones por línea de página se pueden eliminar, pero es útil para visualizar rápidamente que esto ha funcionado en su bloque de productos relacionados.

  • No funciona, probado a fondo.

    – michelle

    15 de mayo a las 6:04

Para los que no encontraron solución: Probado en Woocommerce +6

add_filter( 'woocommerce_related_products', 'vahids_related_products', 10, 3 );
function vahids_related_products( $related_posts, $product_id, $args ){
    $in_stock_product_ids = (array) wc_get_products( array(
        'status'       => 'publish',
        'limit'        => -1,
        'stock_status' => 'instock',
        'return'       => 'ids',
     ));

    return $in_stock_product_ids;
}

avatar de usuario
Ned

Este es un código de trabajo desde aquí. Agregue este código a su functions.php y verá que nuestros productos de existencias no se verán en el bloque de productos relacionados. El código es de aquí: https://stackoverflow.com/a/60978253/15213069

    add_filter( 'woocommerce_related_products', 'mysite_filter_related_products', 10, 1 );
function mysite_filter_related_products( $related_product_ids ) {

    foreach( $related_product_ids as $key => $value ) {
        $relatedProduct = wc_get_product( $value );
        if( ! $relatedProduct->is_in_stock() ) {
            unset( $related_product_ids["$key"] );
        }
    }

    return $related_product_ids;
}

  • Como está escrito actualmente, su respuesta no está clara. Edite para agregar detalles adicionales que ayudarán a otros a comprender cómo esto aborda la pregunta formulada. Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

    – Comunidad
    Bot

    4 abr a las 22:57

avatar de usuario
sarah molinero

cree una función y engánchela al gancho de productos relacionados de woocommerce como:

function dont_show_outofstock( $is_visible, $id ) {
    $product = new wC_Product( $id );

    if ( ! $product->is_in_stock() && ! $product->backorders_allowed() ) {
    $is_visible = false;
    }

    return $is_visible;
}
add_filter( 'woocommerce_output_related_products_args', 'dont_show_outofstock', 10, 2 );

  • Como está escrito actualmente, su respuesta no está clara. Edite para agregar detalles adicionales que ayudarán a otros a comprender cómo esto aborda la pregunta formulada. Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

    – Comunidad
    Bot

    4 abr a las 22:57

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad