web-dev-qa-db-fra.com

WP_Query: exclure les produits cachés de la liste de produits WooCommerce

J'espère que cela n'est pas trop spécifique à WooCommerce.

J'ai un shortcode astucieux qui affiche une liste de tous mes produits avec des SKU. Cependant, il inclut également les produits que j'ai publiés mais que la visibilité du catalogue a définis sur "masqué".

Je ne trouve pas d'argument/paramètre permettant d'exclure les produits cachés (ou d'inclure uniquement ceux marqués comme Catalogue/Recherche).

Je sais que ça doit être simple. Je ne l'ai tout simplement pas trouvé. Merci pour toute aide.

Voici le code:

<?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>Product Name</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>
4
Peter Ingersoll

Important: Ce qui suit ne fonctionne que pour les versions de WooCommerce inférieures à 3.0. Pour une réponse plus à jour, veuillez consulter l'autre réponse de kalle .

WooCommerce enregistre ces données sous la forme metadata. Vous devrez donc exécuter une méta-requête avec le nom _visibility. Quelque chose comme:

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

Tous les messages que do not auront ainsi méta _visibility égal à hidden.

3
Howdy_McGee

A partir de Woocommerce 3. La visibilité est est modifiée en taxonomie au lieu de méta . Vous devez donc changer la meta_query en tax_query. Pour afficher uniquement les produits visibles,

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

et exemples de produits en vedette

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

Termes possibles: 'exclure de la recherche', 'exclure du catalogue', 'présenté', 'hors stock'.

14
kalle