web-dev-qa-db-fra.com

Recherche par catégories multiples

J'essaie de créer une fonctionnalité de recherche qui permettra aux utilisateurs d'entrer un terme de recherche et de sélectionner deux catégories. Le script recherche parfaitement dans une seule catégorie, mais lorsque j'en ajoute plusieurs, je me heurte à un obstacle.

Mon code est le suivant:

<form method="get" id="searchform" action="<?php echo home_url(); ?>">
    <input type="text" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'Search...':this.value;" value="Search..." name="s" id="s" />
    <input type="hidden" name="post_type" value="product" />
    <?php wp_dropdown_categories('taxonomy=product_cat&id=make&child_of=15&show_option_all=Select Make...'); ?>
    <?php wp_dropdown_categories('taxonomy=product_cat&id=model&child_of=21&show_option_all=Select Model...'); ?>
    <input type="submit" id="searchsubmit" value="Search" />
</form>

En cherchant, j'ai découvert: Wordpress la recherche par catégories multiples , qui semble faire exactement ce que je veux ... mais je ne sais pas comment incorporer la suggestion.

Je suis sûr que vous ajoutez les éléments suivants à votre fichier de fonctions:

add_action( 'parse_request', 'category_search_logic', 11 );
function category_search_logic( $query ) {

    if ( ! isset( $query->query_vars[ 'cat' ] ) )
        return $query;

    // split cat query on a space to get IDs separated by '+' in URL
    $cats = explode( ' ', $query->query_vars[ 'cat' ] );

    if ( count( $cats ) > 1 ) {
        unset( $query->query_vars[ 'cat' ] );
        $query->query_vars[ 'category__and' ] = $cats;
    }

    return $query;
}

Mais comment puis-je incorporer cela dans le formulaire de recherche? Je suis sûr que c'est quelque chose de simple, mais je suis perdu ... quelqu'un a des idées?

Merci josh

1
Josh Rodgers

J'ai trouvé la solution ...

Ma page de fonctions ressemble maintenant à:

<?php
    class dropdown extends Walker_CategoryDropdown {
        function start_el(&$output, $category, $depth, $args) {
            $pad = str_repeat('&nbsp;', $depth * 3);
            $cat_name = apply_filters( 'list_cats', $category->name, $category );
            $output .= "\t<option class=\"level-$depth\" value=\"".$category->slug."\""; 
            $output .= '>';
            $output .= $pad.$cat_name;
            if ( $args['show_count'] )
                $output .= '&nbsp;&nbsp;('. $category->count .')';
            if ( $args['show_last_update'] ) {
                $format = 'Y-m-d';
            $output .= '&nbsp;&nbsp;' . gmdate($format, $category->last_update_timestamp);
            }
            $output .= "</option>\n";
        }
    }
?>

Mon formulaire ressemble maintenant à:

<form method="get" id="searchform" action="<?php echo home_url(); ?>">
    <input type="text" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'Product Search...':this.value;" value="Product Search..." name="s" id="s" class="left" />
    <input type="image" src="<?php bloginfo('template_directory') ?>/images/icosearch.png" id="searchsubmit" value=""/>
    <?php
        wp_dropdown_categories(
            array(
                'child_of' => 426,
                'class' => 'styled',
                'id' => 'make',
                'name' => 'make',
                'show_option_all' => 'Make...',
                'taxonomy' => 'product_cat',
                'walker' => new dropdown
            ))
    ?>
    <?php
        wp_dropdown_categories(
            array(
                'child_of' => 427,
                'class' => 'styled',
                'id' => 'model',
                'name' => 'model',
                'show_option_all' => 'Model...',
                'taxonomy' => 'product_cat',
                'walker' => new dropdown
            ))
    ?>
</form>

Ma page de recherche ressemble maintenant à:

<?php
    $tmp[]=$_GET["model"];
    $tmp[]=$_GET["make"];
    $product_cat=array();                                          
    foreach($tmp as $v) {
        if($v!="0")
        $product_cat[]=$v;
    }
    if(count($product_cat)>0) {
        $product_cat="&product_cat=".implode(",",$product_cat);    
    }
    else {
        $product_cat="";
    }                                                           
    $query=query_posts("s=$text".$product_cat);
    $count =count($query);
    if ($count == 0) { 
        echo 'No Results'; 
    }
    elseif ($count == 1) { 
        echo ''.$count.' Result'; 
    } 
    else { 
        echo ''.$count.' Results'; 
    } 
?>
2
Josh Rodgers