web-dev-qa-db-fra.com

Recherche / filtre de taxonomie avec plusieurs taxonomies et plusieurs termes de taxonomie

J'essaie de créer un formulaire de recherche avancée qui permet aux utilisateurs de choisir parmi deux menus déroulants basés sur la taxonomie. Chaque liste déroulante de taxonomie a des termes de taxonomie parmi lesquels l'utilisateur peut sélectionner plusieurs termes. Lorsqu'ils effectuent leurs sélections, ils doivent être transférés vers une page de résultats de recherche qui interroge et affiche les résultats correspondants. J'ai essayé de m'adapter à partir de ce post: http://fearlessflyer.com/how-to-create-an-advanced-search-form-for-wordpress/ .

J'ai un type de message personnalisé nommé "recette" avec deux taxonomies nommées "Types de repas" et "Cuisines". Les taxonomies ont les termes suivants:

Types de repas

  • Dîner
  • Petit déjeuner

Cuisines

  • Français
  • Américain

Le code ci-dessous fonctionne bien lorsque l'on sélectionne Dîner et Américain ou Petit-déjeuner et Français, mais pas quand on sélectionne plus d'un terme dans une liste déroulante de taxonomie. Logiquement, lorsque l'on sélectionne et soumet le français et l'américain, les messages qui ont le français ou l'américain devraient s'afficher. Mais cela ne fonctionne pas. Il devrait fonctionner comme la recherche avancée suivante: http://cooking.nytimes.com/search?

Je pense que le problème est lié au fait que je suis incapable de comprendre comment soumettre plusieurs termes de taxonomie à la page de recherche via $ _POST afin qu'ils puissent ensuite être interrogés et affichés sur la page de résultats.

Merci!

functions.php

function buildSelect($tax){ 
$terms = get_terms($tax);
$x = '<select multiple="multiple" name="'. $tax .'">';
$x .= '<option value="">Select '. ucfirst($tax) .'</option>';
foreach ($terms as $term) {
   $x .= '<option value="' . $term->slug . '">' . $term->name . '</option>';    
}
$x .= '</select>';
return $x;
}

page d'accueil

<form  method="post" action="<?php bloginfo('url');?>/listing-search-results/"> 
<?php  $taxonomies = get_object_taxonomies('recipe');
    foreach($taxonomies as $tax){
        echo buildSelect($tax);
    }
?>
<input type="submit"/>  
</form>

Page de résultats de recherche

 <?php  
$list = array();
$item = array();  
foreach($_POST as $key => $value){
    if($value != ''){
        $item['taxonomy'] = htmlspecialchars($key);
        $item['terms'] = htmlspecialchars($value);
        $item['field'] = 'slug';
        $list[] = $item;
    }       
}  
$cleanArray = array_merge(array('relation' => 'AND'), $list);

$args['post_type'] = 'recipe';
$args['showposts'] = 9;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args['paged'] = $paged;  
$args['tax_query'] = $cleanArray; 
$the_query = new WP_Query( $args );

?>

<?php echo ($the_query->found_posts > 0) ? '<h3 class="foundPosts">' . $the_query->found_posts. ' listings found</h3>' : '<h3 class="foundPosts">We found no results</h3>';?>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post();?>

    //add our code here i.e. the_title();

    <?php endwhile; wp_reset_postdata();?>       

<div class="row page-navigation"> 
     <?php next_posts_link('&laquo; Older Entries', $the_query->max_num_pages) ?> 
     <?php previous_posts_link('Newer Entries &raquo;') ?> 
</div>
1
taxman

Le principal problème est que, dans votre $_POST boucle, $value est un tableau, mais vous lui appliquez htmlspecialchars, qui vomira et ne renverra rien.

Si vous ne l'avez pas déjà fait, définissez WP_DEBUG à true dans votre wp-config.php - développer sans elle n'est tout simplement pas une option.

Quoi qu'il en soit, réparons ce sale $_POST boucle:

$tax_query = array(); // Don't need relation "AND", it's the default

foreach ( get_object_taxonomies( 'recipe' ) as $tax ) {
    if ( isset( $_POST[ $tax ] ) ) {
        $tax_query[] = array(
            'taxonomy' => $tax,
            'terms' => wp_unslash( ( array ) $_POST[ $tax ] ),
            'field' => 'slug',          
        );
    }
}

$args['tax_query'] = $tax_query; 
2
TheDeadMedic