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