web-dev-qa-db-de.com

Filtern Sie den benutzerdefinierten Beitragstyp mithilfe mehrerer Taxonomie-Dropdowns

Ich versuche, zwei Dropdown-Felder auf einer benutzerdefinierten Beitragstypseite mit dem Namen "Aktivitäten" zu erstellen. Eine Taxonomiekategorie ist für die Aktivitätsstufe und die andere für die Aktivitätsart. Mit dem, was ich jetzt habe, geht die Suche auf eine 404-Seite, wenn Sie eine der Dropboxen leer lassen. Ich habe den Code aus diesem WordPress-Forum verwendet und das habe ich in meinem Funktionsordner:

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;
}

Und das ist, was ich auf der Posttyp-Archivseite habe:

    <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>

Sofern es sich um gute Informationen handelt, werde ich auch die URLs einfügen. Eine reguläre URL, die zur korrekten Suche führt, ist

[...] /? activities_grade_level = Grundschule & activities_type = Ingenieurwesen & submit = Filter

Eine URL, bei der eine der Dropboxen leer ist, lautet

[...] /? activities_grade_level =% 23 & activities_type = engineering & submit = filter wobei% 23 etwas ersetzt hat, das eine Grundschule oder eine Mittelschule gewesen sein könnte

Eine URL, die zur richtigen Kategorie führt, wäre

[...]/activities_type/engineering /

oder

[...]/activities_grade_level/middle-school

Irgendwelche Vorschläge für diesen PHP- und WordPress-Anfänger?

1
anita

Richtig, scheint hier etwas leer zu sein, aber ich habe das Problem selbst herausgefunden. Der Trick bestand darin, leere Werte in den Ausgabevariablen $ zu haben.

So

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

NICHT

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

Auf diese Weise können Sie zwei Dropdown-Menüs erstellen und Ihre Posts mithilfe Ihrer benutzerdefinierten Taxonomien herausfiltern.

Fügen Sie dies in Ihre functions.php Datei ein

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;
    }

Fügen Sie dies auf der Seite ein, auf der die Dropdown-Menüs angezeigt werden sollen . (Ich habe meine auf einer speziellen Archivseite abgelegt, zB 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>

Prost! :)

1
anita