web-dev-qa-db-fra.com

Woocommerce en boucle personnalisée pour afficher tous les produits

Je travaille actuellement sur un site de commerce électronique et j'ai rencontré un problème. Mon client souhaite une page de boutique en ligne avec toutes les catégories de produits affichées, suivie de trois produits en promotion et d'un bouton "Tout afficher".

Ce bouton "Tout afficher" est censé afficher tous les produits contenus dans le magasin avec le tri et la pagination par défaut de woocommerce.

Tout d'abord, je ne sais pas si je le fais correctement. Ce que j’ai jusqu’à présent, c’est la page indiquant les catégories de produits. Lorsque je clique sur le bouton "Tout afficher" sur cette page, je recharge la page avec un argument GET et /?all=1.

<a class="product-category-view-all" href="?all=1"><?php _e('View all'); ?></a>

J'ai copié l'idée de ce post , et voici mon code:

<div id="content" class="hfeed">
<h1><?php _e('The E-boutique'); ?></h1>

<?php
if (isset($_GET['all']))
{
    $args = array(
        'post_type' => 'product',
        'orderby' => $orderby,
    );
    $wp_query = new WP_Query($args);
    ?>

    <?php do_action('woocommerce_before_shop_loop'); // woocommerce sorting ?>

    <div class="clear"></div>
    <ul class="products-list">
        <?php woocommerce_product_subcategories(); ?>

        <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?>

            <?php woocommerce_get_template_part('content', 'product'); ?>

            <?php
        endwhile; // end of the loop. 
        wp_reset_query(); 
        ?>
    </ul>
    <div class="clear"></div>

    <?php do_action('woocommerce_after_shop_loop'); // woocommerce pagination   ?>

    <?php
}
else
{
    // Code to display the product categories with thumbnails.
}
?>

Les produits sont bien affichés et la sélection pour le tri est visible. Lorsque je souhaite modifier le tri, la page est rechargée, mais l'ordre n'est pas modifié et la pagination est définie sur 3 produits par page, mais elle n'est pas respectée. (les boutons de paging ne sont pas affichés).

J'aimerais ajouter que c'est mon premier site web utilisant WordPress et WooCommerce.

2
HamzStramGram

Je n'ai pas entièrement résolu mon problème. Mon client a changé d'avis et ne voulait plus du tri.

Mais en ce qui concerne la pagination, j’ai réussi à la faire fonctionner en ajoutant un nouvel argument dans ma requête, voici le code qui a fonctionné pour moi:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'product',
        'paged' => $paged,
    );
    $wp_query = new WP_Query($args);

    if (isset($_GET['all']))
    {
        ?>

        <?php do_action('woocommerce_archive_description'); ?>

        <?php if (have_posts()) : ?>

            <?php
            // I don't want the sorting anymore
            //do_action('woocommerce_before_shop_loop');
            ?>

            <ul class = "products-list">
                <?php while (have_posts()) : the_post(); ?>

                    <?php woocommerce_get_template_part('content', 'product'); ?>

                <?php endwhile; // end of the loop.   ?>
            </ul>

            <?php
            /*  woocommerce pagination  */
            do_action('woocommerce_after_shop_loop');
            ?>

        <?php elseif (!woocommerce_product_subcategories(array('before' => woocommerce_product_loop_start(false), 'after' => woocommerce_product_loop_end(false)))) : ?>

            <?php woocommerce_get_template('loop/no-products-found.php'); ?>

        <?php endif; ?>
        <?php
    }
    else
    {
        // Code to display the product categories with thumbnails.
    }
?>

La variable $paged m'aide à obtenir la page actuelle passée dans l'URL via GET.

Encore une fois, je ne sais pas si c'est la meilleure façon de le faire. Mais cela a fait le travail pour moi.

J'espère que ça peut aider quelqu'un.

4
HamzStramGram

Dans votre tableau $ args, vous devriez pouvoir ajouter 'posts_per_page' => -1 pour afficher tous les produits. Le résultat ressemblerait à ceci:

$args = array(
    'post_type' => 'product',
    'paged' => $paged,
    'posts_per_page' => -1
);
1
Rynoceris