WP_Query: Excluir productos ocultos de la lista de productos en WooCommerce

30 jun 2016, 20:38:08
Vistas: 19.7K
Votos: 7

Espero que esto no sea demasiado específico para WooCommerce.

Tengo un práctico shortcode que muestra una lista de todos mis productos con SKUs. Sin embargo, también incluye productos que he publicado pero que he configurado con visibilidad de catálogo como "oculto".

No puedo encontrar un argumento/parámetro para excluir productos ocultos (o solo incluir aquellos marcados como Catálogo/Búsqueda).

Sé que debe ser simple; simplemente no lo he encontrado. Gracias por cualquier ayuda.

Aquí está el código:

<?php
$params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc');
$wc_query = new WP_Query($params);
?>
<table class="product-list tablesorter"><thead><tr><th>SKU</th><th>Nombre del Producto</th></tr></thead><tbody>
     <?php if ($wc_query->have_posts()) : ?>
     <?php while ($wc_query->have_posts()) :
                $wc_query->the_post(); ?>
 <tr>
<td><?php global $product; echo $product->get_sku(); ?></td>
<td><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></td>
</tr>
     <?php endwhile; ?>
     <?php wp_reset_postdata(); ?>
     <?php else:  ?>
     <tr><td>
          <?php _e( 'No Products' ); ?>
    </td> </tr>
     <?php endif; ?>
</tbody>
</table>
1
Comentarios

Quisiera señalar que este código eventualmente fallará catastróficamente debido a que posts_per_page está configurado como -1. Pocos servidores podrían manejar este código cuando hay 1000 publicaciones, y mucho menos 20,000. Multiplica eso por la cantidad de visitantes que lleguen a tu sitio

Tom J Nowell Tom J Nowell
3 dic 2016 23:10:14
Todas las respuestas a la pregunta 2
0
24

A partir de Woocommerce 3, la visibilidad cambió a taxonomía en lugar de meta. Por lo tanto, necesitas cambiar el meta_query a tax_query. Para mostrar solo productos visibles,

'tax_query' => array(
    array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'exclude-from-catalog',
        'operator' => 'NOT IN',
    ),
),

y ejemplos para Productos Destacados

'tax_query' => array(
    array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'featured',
    ),
),

Términos posibles: 'exclude-from-search', 'exclude-from-catalog', 'featured', 'outofstock'.

6 abr 2017 08:50:01
2

Importante: Lo siguiente solo funciona para versiones de WooCommerce menores a 3.0. Para una respuesta más actualizada, por favor revisa la otra respuesta de kalle.

WooCommerce guarda estos datos como metadata por lo que necesitarás ejecutar una Meta Query contra el nombre _visibility. Algo como:

'meta_query' => array(
    array(
        'key'       => '_visibility',
        'value'     => 'hidden',
        'compare'   => '!=',
    )
)

Esto traerá todos los posts que no tengan el meta _visibility igual a hidden.

30 jun 2016 20:44:17
Comentarios

Perfecto. Eso es exactamente lo que necesitaba. Para cualquiera que busque esta respuesta, aquí está la consulta completa mencionada anteriormente.

<?php $params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc', 'meta_query' => array( array( 'key' => '_visibility', 'value' => 'hidden', 'compare' => '!=', ) )); $wc_query = new WP_Query($params); ?>

Peter Ingersoll Peter Ingersoll
30 jun 2016 21:39:04

@PeterIngersoll Por cierto, puedes marcar esta respuesta como aceptada para mostrar a los visitantes futuros qué solución te funcionó :) Hay una marca de verificación a la izquierda de la respuesta de Howdy. Lee más aquí: http://wordpress.stackexchange.com/help/someone-answers

Tim Malone Tim Malone
5 jul 2016 10:57:59