Faire des requêtes personnalisées dans des Custom Post Types (CPT) contenant des Advanced Custom Fields (ACF)
Etude cas d’une requête dans les Users
Dans quasiment tous les projets que je réalise en WordPress j’utilise des CPT combinés à des ACF. Dans mes pages j’utilise également régulièrement des filtres avec lesquels je charge en AJAX des contenus sur base de requêtes personnalisées. Ces requêtes sont basées sur des arrays qui contiennent:
- le champ à comparer
- la valeur à comparer avec la valeur contenue dans le champ de la DB
- le type de comparaison « > = <«
Il est ensuite possible d’inclure tous ces arrays dans la requête.
Dans l’exemple ci-dessous je charge des utilisateurs sur base de critères comme l’âge, la région, le genre etc. au moyen de la fonction get_users()
Dans cette fonction je passe les arrays que j’ai définis préalablement et que je décrirai plus bas
Requête au moyen de la fonction get_users() et meta_query
$blogusers = get_users( array(
'role__in' => array( 'subscriber' ),
// 'meta_key' => "genre",
'meta_query' => array($arraygenre,$arrayage,$arrayregion,$arrayetudes,$arrayenfants),
) ); // recuperation des users sur base des filtres
Définition des arrays (que j’annule si une valeur vide est passée
// filtre GENRE
// si pas de valeur dans ce filtre, on en fait un array vide comme ça pas pris en compte dans la requête
if ($genre == "tous") {
$arraygenre = array();
} else {
$arraygenre = array(
'key' => 'genre',
'value' => $genre,
'compare' => '='
);
}
// filtre REGION
// si pas de valeur dans ce filtre, on en fait un array vide comme ça pas pris en compte dans la requête
if ($region == "tous") {
$arrayregion = array();
} else {
$arrayregion = array(
'key' => 'region',
'value' => $region,
'compare' => '='
);
}
// filtre ETUDES
// si pas de valeur dans ce filtre, on en fait un array vide comme ça pas pris en compte dans la requête
if ($etudes == "tous") {
$arrayetudes= array();
} else {
$arrayetudes = array(
'key' => 'niveau_detudes',
'value' => $etudes,
'compare' => '='
);
}
// filtre ENFANTS
// si pas de valeur dans ce filtre, on en fait un array vide comme ça pas pris en compte dans la requête
if ($enfants == "tous") {
$arrayenfants= array();
} else {
$arrayenfants = array(
'key' => 'enfants',
'value' => $enfants,
'compare' => '='
);
}
// filtre AGE MIN ET MAX
$arrayage = array(
array(
'key' => 'age',
'value' => $agemax,
'compare' => '<='
),
array(
'key' => 'age',
'value' => $agemin,
'compare' => '>='
)
);
Boucle à travers les résultats.
En suite je récupère toutes les valeurs dans une boucle while
foreach ( $blogusers as $user ) {
$author_id = $user->ID;
$image = get_field('tsm_local_avatar', 'user_'.$author_id );
$genre = get_field('genre', 'user_'.$author_id );
$age = get_field('age', 'user_'.$author_id );
$celibataire_depuis= get_field('celibataire_depuis', 'user_'.$author_id );
}