Je configure une page de recherche avancée avec des champs ACF avec un type de message personnalisé dans wordpress.
Dans mon exemple, j'envoie 'Etudiants' dans mes paramètres d'URL sous la forme? LicenseType = Students
* EDIT en ajoutant PHP code:
<select id="licenseType" name="licenseType">
<option value="">All License Types</option>
<?php $field = get_field_object('software_license_type');
if( $field )
{
foreach( $field['choices'] as $key => $value )
{
echo '<option value="'.$key.'" '.((isset($_GET['licenseType']) && $_GET['licenseType'] == $value)?' selected':'').' >'.$value.'</option>';
}
}
?></select>
J'ai enregistré mes query_vars
add_filter( 'query_vars', 'software_register_query_vars' );
function software_register_query_vars( $vars ) {
$vars[] = 'licenseType';
return $vars;
}
et configurer mon filtre pre_get_posts
add_action('pre_get_posts','software_pre_get_posts');
function software_pre_get_posts( $query ) {
if ( is_main_query() && $query->get('post_type') == 'uc_software' ) {
$query->set('nopaging','true');
$query->set( 'orderby', 'title' );
$query->set( 'order', 'ASC' );
$meta_query = array();
if( !empty( get_query_var( 'licenseType' ) ) ){
$meta_query[] = array( 'key' => 'software_license_type', 'value' =>
get_query_var( 'licenseType' ), 'compare' => 'LIKE' );
}
// ...
//I will add more fields here...
// ...
if( count( $meta_query ) > 1 ){
$meta_query['relation'] = 'AND';
}
if( count( $meta_query ) > 0 ){
$query->set( 'meta_query', $meta_query );
}
}
}
Lorsque je visualise la requête en cours de création, je vois
SELECT wp_125_posts.* FROM wp_125_posts INNER JOIN wp_125_postmeta ON (
wp_125_posts.ID = wp_125_postmeta.post_id ) WHERE 1=1 AND ( (
wp_125_postmeta.meta_key = 'software_license_type' AND
wp_125_postmeta.meta_value LIKE
'{4d69cec85576e5c23416d1afb6df73c1a4a288f24aff1da852b18ad70b464309}Students{4d69cec85576e5c23416d1afb6df73c1a4a288f24aff1da852b18ad70b464309}'
) ) AND wp_125_posts.post_type = 'uc_software' AND (wp_125_posts.post_status = 'publish'
OR wp_125_posts.post_status = 'acf-disabled' OR wp_125_posts.post_status = 'private')
GROUP BY wp_125_posts.ID ORDER BY wp_125_posts.post_title ASC
Quelle est la chaîne aléatoire qui est capturée avec mon query_var? Est-il possible de récupérer ma requête_var sans cette requête? Je vois la même chose lorsque j'utilise $ _GET ['licenseType'].
Ceci est un symptôme d'avoir un caractère %
dans la valeur de votre méta-requête. Depuis la version 4.8.3, %
caractères sont échappés (en fait remplacés par une chaîne semi-aléatoire) et ne doivent pas être échappés avant d’exécuter la requête SQL.
Vous devriez vérifier auprès de l'auteur du plug-in quelle serait la meilleure façon de le gérer, mais dans votre cas spécifique, je dirais qu'une légère refonte de votre code serait une meilleure solution que tout code non dissimulé. LIKE
est une opération coûteuse qu'il vaut mieux éviter et sur la base de votre interface utilisateur, vous pouvez simplement faire une comparaison stricte des valeurs.