webentwicklung-frage-antwort-db.com.de

Hinzufügen von benutzerdefinierten Feldern zur Suche

Ich versuche, meiner Suche benutzerdefinierte Felder hinzuzufügen, damit sie durch Metawerte verfeinert werden kann. Momentan habe ich meiner normalen Suche einige Auswahllisten hinzugefügt:

<form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
    <input type="hidden" name="s" value="carcpt" /> <!-- // hidden 'products' value -->

    <select name="price">
        <option value="">Nothing</option>
        <option value="500.00">500.00</option>
        <option value="100.00">100.00</option>
        <option value="50.00">50.00</option>
    </select>

    <select name="year">
        <option value="">Nothing</option>
        <option value="2011">2011</option>
        <option value="2007">2007</option>
        <option value="1991">1991</option>
    </select>

    <input type="submit" alt="Search" value="Search" />
</form>

und oben in meinem search.php habe ich folgende bedingung:

$q = get_search_query();
if($q = 'carcpt'){

    $price = $_GET['price'];
    $year = $_GET['year'];

    $search = new WP_Query(
        array(
            'post_type' => 'carcpt',
            'meta_query' => array(
                array(
                    'key' => '_price',
                    'value' => $price
                ),
                array(
                    'key' => '_year',
                    'value' => $year
                )
            )
        )
    );
}

Das ist das Szenario - ich habe 2 Fragen:

1) Dies scheint eine sehr "hackige" Möglichkeit zu sein, meine Suchergebnisse nach benutzerdefinierten Feldern hinzuzufügen und zu verfeinern - gibt es eine bessere/allgemein akzeptierte Möglichkeit, dies zu tun?

2) Das Problem mit der obigen Abfrage ist, dass, wenn der Benutzer keinen Preis oder kein Jahr eingibt, die Abfrage ausgeführt wird und nur Post mit leerem Preis/Jahr-Meta zurückgegeben wird. Gibt es in meiner Abfrage eine Möglichkeit, festzustellen, ob ein Meta leer ist, und meine Abfrage entsprechend zu ändern - ohne einen Schalter?

1
Howdy_McGee

1) Ich denke, dass Ihre Lösung in Bezug auf den "richtigen Weg" vollkommen akzeptabel ist - Post-Meta ist für die Suche gedacht. Kommt mir nicht komisch vor.

2) Sie sollten die meta_query separat erstellen:

$meta_query = array();

if( !empty( $_GET['price'] ) ) {
    $meta_query[] = array( 'key' => '_price', 'value' => $_GET['price'] );
}
if( !empty( $_GET['year'] ) ) {
    $meta_query[] = array( 'key' => '_year', 'value' => $_GET['year'] );
}

$search = new WP_Query( array(
    'post_type' => 'carcpt',
    'meta_query' => $meta_query
) );

Auf diese Weise fragen Sie nur nach Metaschlüsseln ab, die einen angegebenen, nicht leeren Wert haben.

Ich möchte darauf hinweisen, dass das Ändern von Abfragevariablen besser in der Aktion pre_get_posts erfolgt, da in diesem Fall zwei Abfragen ausgeführt werden: eine für die Suche nach 'carcpt' und die zweite für die 'carcpt'. Beitragstyp und Meta-Abfrage.

3
Bendoh