web-dev-qa-db-fra.com

Ajout de champs personnalisés à la recherche

J'essaie d'ajouter des champs personnalisés à ma recherche afin qu'elle puisse être affinée par des méta-valeurs. Actuellement, j'ai ajouté des listes de sélection à ma recherche normale:

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

et en haut de mon search.php j'ai ce conditionnel:

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

C'est le scénario - j'ai 2 questions:

1) Cela semble être un moyen très astucieux d’ajouter et d’affiner mes résultats de recherche par champs personnalisés - existe-t-il un moyen meilleur/plus largement accepté de le faire?

2) Le problème avec la requête ci-dessus est que si l'utilisateur n'entre pas de prix ou d'année, il exécutera la requête et renverra uniquement la publication avec une méta de prix/année vide. Dans ma requête, existe-t-il un moyen de déterminer si une méta est vide et de modifier ma requête en conséquence - sans inclure un commutateur?

1
Howdy_McGee

1) Je pense que votre solution est parfaitement acceptable en termes de "bonne manière" - post meta est destiné à la recherche. Ne me semble pas hacky.

2) Ce que vous devriez faire est de construire la meta_query séparément:

$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
) );

De cette façon, vous interrogez uniquement les clés méta qui ont une valeur fournie non vide.

Je voudrais souligner que la modification des variables de requête est préférable dans l'action pre_get_posts, sinon, comme dans cet exemple, deux requêtes seront exécutées: une pour la recherche de 'carcpt', puis la seconde pour le 'carcpt' type de message et méta requête.

3
Bendoh