web-dev-qa-db-fra.com

Filtrer le type de publication personnalisé à l'aide de plusieurs listes déroulantes de taxonomie

J'essaie de créer deux zones de liste déroulante sur une page de type publication personnalisée appelée Activités. Une catégorie de taxonomie est pour le niveau d'activité et l'autre pour le type d'activités. Avec ce que j'ai maintenant, si vous laissez une des boîtes de dépôt vides, la recherche ira à une page 404. J'ai utilisé le code de ce wordpress forum et voici ce que j'ai dans mon dossier de fonctions:

function get_terms_dropdown_grade_level($taxonomies, $args){
        $myterms = get_terms($taxonomies, $args);
        $output ="<select name='activities_grade_level'>";
        $output .="<option value='#'>Select grade level</option>";
        foreach($myterms as $term){
                $root_url = get_bloginfo('url');
                $term_taxonomy=$term->taxonomy;
                $term_slug=$term->slug;
                $term_name =$term->name;
                $link = $term_slug;
                $output .="<option value='".$link."'>".$term_name."</option>";
        }
        $output .="</select>";
return $output;
}

function get_terms_dropdown_type($taxonomies, $args){
        $myterms = get_terms($taxonomies, $args);
        $output ="<select name='activities_type'>";
        $output .="<option value='#'>Select  activity type</option>";
        foreach($myterms as $term){
                $root_url = get_bloginfo('url');
                $term_taxonomy=$term->taxonomy;
                $term_slug=$term->slug;
                $term_name =$term->name;
                $link = $term_slug;
                $output .="<option value='".$link."'>".$term_name."</option>";
        }
        $output .="</select>";
return $output;
}

Et voici ce que j'ai sur la page d'archive de type poste:

    <h2>Filter by</h2>
    <form action="<?php bloginfo('url'); ?>" method="get">
    <div>
    <?php
    $taxonomies = array('activities_grade_level');
    $args = array('orderby'=>'name','hide_empty'=>false);
    $select = get_terms_dropdown_grade_level($taxonomies, $args);
    $select = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $select);
    echo $select;
    ?>
    <?php
    $taxonomies = array('activities_type');
    $args = array('orderby'=>'name','hide_empty'=>false);
    $select = get_terms_dropdown_type($taxonomies, $args);

    $select = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $select);
    echo $select;
    ?>
    <input type="submit" name="submit" value="filter" />
    </div>
    </form>

Si c'est une bonne information, j'inclurai aussi les URL. Une URL régulière menant à la recherche correcte est

[...] /? activities_grade_level = elementary-school & activities_type = engineering & submit = filter

Une URL où l'une des boîtes de dépôt est vide est

[...] /? activities_grade_level =% 23 & activities_type = engineering & submit = filtre où% 23 a remplacé un élément qui aurait pu être une école élémentaire ou un collège

Une URL menant à la bonne catégorie serait

[...]/activities_type/engineering /

ou

[...]/activities_grade_level/middle-school

Des suggestions pour ce débutant php et wordpress?

1
anita

Oui, ça semble un peu vide ici, mais j'ai à nouveau résolu le problème moi-même. L'astuce consistait à avoir des valeurs vides dans les variables de sortie $.

Alors

$output .="<option value=''>Select taxonomy #1</option>"; 

NE PAS

$output .="<option value='#'>Select taxonomy #1</option>"; 

Voici comment vous pouvez créer deux menus déroulants et filtrer vos publications en utilisant vos taxonomies personnalisées.

Collez ceci dans votre functions.php file

function get_terms_dropdown_grade_level($taxonomies, $args){
            $myterms = get_terms($taxonomies, $args);
            $output ="<select name='MYTAXONOMY#1'>"; //CHANGE ME!
            $output .="<option value=''>Select taxonomy #1</option>"; //CHANGE ME TO YOUR LIKING!
            foreach($myterms as $term){
                    $root_url = get_bloginfo('url');
                    $term_taxonomy=$term->taxonomy;
                    $term_slug=$term->slug;
                    $term_name =$term->name;
                    $link = $term_slug;
                    $output .="<option value='".$link."'>".$term_name."</option>";
            }
            $output .="</select>";
    return $output;
    }

    function get_terms_dropdown_type($taxonomies, $args){
            $myterms = get_terms($taxonomies, $args);
            $output ="<select name='MYTAXONOMY#2'>"; //CHANGE ME!
            $output .="<option value=''>Select taxonomy #2</option>"; //CHANGE ME TO YOUR LIKING!               foreach($myterms as $term){
                    $root_url = get_bloginfo('url');
                    $term_taxonomy=$term->taxonomy;
                    $term_slug=$term->slug;
                    $term_name =$term->name;
                    $link = $term_slug;
                    $output .="<option value='".$link."'>".$term_name."</option>";
            }
            $output .="</select>";
    return $output;
    }

Collez ceci sur la page sur laquelle vous souhaitez que les menus déroulants apparaissent . (J'ai mis le mien sur une page d'archives spéciale, comme archive-activities.php.)

<h3>Filter by:</h3>
                    <form action="<?php bloginfo('url'); ?>" method="get">
                        <div>
                            <?php
                            $taxonomies = array('MYTAXONOMY#1'); //CHANGE ME!
                            $args = array('orderby'=>'name','hide_empty'=>false);
                            $select = get_terms_dropdown_grade_level($taxonomies, $args);
                            $select = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $select);
                            echo $select;
                            ?>
                            <?php
                            $taxonomies = array('MYTAXONOMY#2'); //CHANGE ME!
                            $args = array('orderby'=>'name','hide_empty'=>false);
                            $select = get_terms_dropdown_type($taxonomies, $args);

                            $select = preg_replace("#<select([^>]*)>#", "<select$1 onchange='return this.form.submit()'>", $select);
                            echo $select;
                            ?>
                            <input type="submit" name="submit" value="filter" /> <!--CHANGE VALUE TO YOUR LIKING!-->
                        </div>
                    </form>

À votre santé! :)

1
anita