web-dev-qa-db-fra.com

Filtrer les résultats avec des valeurs de champ personnalisées et une liste déroulante

Je dois filtrer les publications par une valeur de champ personnalisée.

Mon exemple spécifique:

  • Naviguer vers les produits> catégorie 1> sous-catégorie A.
  • TOUS les éléments de la "sous-catégorie A" (type d'article personnalisé) sont affichés par défaut par date.
  • Chaque élément de la sous-catégorie A a un champ personnalisé "taille". L'utilisateur peut sélectionner la taille avec un menu déroulant et les publications sont filtrées pour afficher uniquement les éléments avec "champ personnalisé: taille" = "taille sélectionnée". Le filtre est également maintenu en pagination, car les produits se trouvent sur plusieurs pages.

J'ai vérifié beaucoup de réponses, mais aucun cas n'a été aussi simple. Je pensais le faire en utilisant une recherche personnalisée ou un plugin, mais je ne sais vraiment pas par où commencer. Merci de votre aide.

EDIT: les valeurs de champ personnalisées sont fixes et ne sont pas renseignées automatiquement. Le select peut être construit en HTML simple sans requêtes supplémentaires.

3
Andycap

Edité selon les premiers commentaires et le code Pastebin:

<?php /* You can also leave 'action' blank: action="" */ ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<select name="my_size" id="size" class="postform" onchange="submit();">
        <option selected="selected">Choose a size</option>
        <option value="10">10</option>
        <option value="20">20</option>
</select>
</form>
<?php /* Reset filter */ ?>
<p><a href="<?php the_permalink(); ?>">Clear filter</a></p>

<?php
if( !isset($_POST['my_size']) || '' == $_POST['my_size']) {

    // unfiltered product list here

}
else {

    // Get dropdown value
    // Don't forget to sanitize this!
    $size = $_POST['my_size'];

    // Create new query
    $query = new WP_Query( array(
        'post_type'=> 'product', // your CPT
        'post_status' => 'publish',
        'meta_key' => 'size',
        'meta_value' => $size, // Dropdown value
    ) );

    // Loop
    if($query->have_posts()):
        while( $query->have_posts() ): $query->the_post();
            // Product content
        endwhile;
    endif;

    // reset query to default
    wp_reset_postdata();

}

Voir Codex pour Référence WP_Query .

4
Max Yudin