J'ai un type de message personnalisé 'Propriété' que mes utilisateurs doivent pouvoir rechercher par métadonnées.
J'ai 3 fonctions de recherche - 2 sur le front-end 1 dans la zone d'administration - 2 fonctionnent comme prévu et une qui ne semble pas filtrer les résultats du tout.
Je pense que ma définition ou l'utilisation de query_vars personnalisé peut poser problème.
Dans mon functions.php, j'ai les éléments suivants:
function add_query_vars($public_query_vars) {
$public_query_vars[] = 'bedrooms';
$public_query_vars[] = 'type';
$public_query_vars[] = 'location';
return $public_query_vars;
}
add_filter('query_vars', 'add_query_vars');
function meta_search_query($query) {
$query_args_code = array(
'posts_per_page' => 5,
'post_type' => 'nc_property',
'meta_key' => 'nc_code',
'meta_value' => $query->query_vars['s'],
'meta_compare' => 'LIKE'
);
$query_args_meta = array(
'posts_per_page' => -1,
'post_type' => 'nc_property',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'nc_bedrooms',
'value' => $query->query_vars['bedrooms'],
'compare' => 'LIKE'
),
array(
'key' => 'nc_type',
'value' => $query->query_vars['type'],
'compare' => 'LIKE'
),
array(
'key' => 'nc_location',
'value' => $query->query_vars['location'],
'compare' => 'LIKE'
)
)
);
if (is_admin() && $query->is_search ) {
query_posts($query_args_code);
} elseif (!is_admin() && $query->is_search ) {
if ($_REQUEST["which_form"] == 'meta_form') {
query_posts($query_args_meta);
} elseif ($_REQUEST["which_form"] == 'code_form'){
query_posts($query_args_code);
}
}
}
add_filter( 'pre_get_posts', 'meta_search_query');
La recherche par code de propriété ne pose aucun problème à la fois au niveau du front-end et du back-end. Cependant, essayer de filtrer les résultats selon les vars de requête personnalisés - emplacement, type et chambres - tombe à plat à chaque fois.
Un exemple de chaîne de requête créée est le suivant:
/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli
Il existe une propriété sur le site qui correspond à ces détails, mais WordPress renvoie tous les résultats à chaque fois.
Ai-je raté quelque chose?
EDIT: Comme mon formulaire de recherche pour mes méta-requêtes n’utilisait pas un élément dont le nom était 's'
, la condition $query->is_search
de mon instruction if retournait false, ce qui voulait dire que ma méta_query n’était tout simplement pas appelée.
Félicitations à fischi pour avoir remarqué cela pour moi! :RÉ
Dans ce cas, lorsque vous mélangez de jolis permaliens avec des paramètres de requête, je voudrais utiliser les variables $_GET
dans votre requête.
$query_args_meta = array(
'posts_per_page' => -1,
'post_type' => 'nc_property',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'nc_bedrooms',
'value' => sanitize_text_field( $_GET['bedrooms'] ),
'compare' => 'LIKE'
),
array(
'key' => 'nc_type',
'value' => sanitize_text_field( $_GET['type'] ),
'compare' => 'LIKE'
),
array(
'key' => 'nc_location',
'value' => sanitize_text_field( $_GET['location'] ),
'compare' => 'LIKE'
)
)
);
Veillez à utiliser l'assainissement approprié, en fonction de vos besoins, ou à l'aide d'une fonction qui vérifie les valeurs des données $_GET
figurant sur la liste blanche.
Vérifiez également votre fonction des conditions - vous modifiez simplement la requête s'il s'agit d'une demande de recherche (en utilisant s
comme paramètre de recherche), ou modifiez l'instruction if
.