J'essaie d'organiser ma page de résultats de recherche en fonction d'une valeur de sous-champ ACF d'un champ de répéteur. Je voudrais un résultat semblable à plutôt que =.
Jusqu'ici, j'ai eu ce qui suit (modifié avec l'aide ci-dessous, mais ne fonctionne toujours pas):
// Modify meta key to allow wildcard
function add_wildcard_to_meta_key_filter( $where ) {
$where = str_replace("meta_key = 'test_repeater_%", "meta_key LIKE 'test_repeater_%", $where);
return $where;
}
add_filter('posts_where', 'add_wildcard_to_meta_key_filter');
//Modify search query
function alter_search_query($query) {
if ( !$query->is_search )
return $query;
$search = $query->query;
$query->set('post_type' ,'page');
$query->set('meta_query', array(
array(
'meta_key' => 'test_repeater_%_test_sub_field',
'meta_value' => '%'.$search.'%',
'compare' => 'LIKE',
),
));
$query->set('s', '');
}
add_action('pre_get_posts','alter_search_query');
Cela fonctionne bien si j'ajoute la valeur exacte, c'est-à-dire "filet de boeuf", mais si j'entre "boeuf", cela échoue. Comment puis-je rendre la recherche plus générique?
J'ai installé le plugin Query Monitor et j'ai remarqué que j'avais le code SQL suivant
SELECT SQL_CALC_FOUND_ROWS wpfb_posts.ID
FROM wpfb_posts
INNER JOIN wpfb_postmeta
ON ( wpfb_posts.ID = wpfb_postmeta.post_id )
WHERE 1=1
AND ( ( wpfb_postmeta.meta_key LIKE 'test_repeater_%_test_sub_field'
AND wpfb_postmeta.meta_value IN ('beef') ) )
AND wpfb_posts.post_type = 'page'
AND (wpfb_posts.post_status = 'publish'
OR wpfb_posts.post_status = 'acf-disabled'
OR wpfb_posts.post_status = 'private')
GROUP BY wpfb_posts.ID
ORDER BY wpfb_posts.post_date DESC
LIMIT 0, 10
Si je change ceci:
AND ( ( wpfb_postmeta.meta_key LIKE 'test_repeater_%_test_sub_field'
AND wpfb_postmeta.meta_value IN ('beef') ) )
Pour ça:
AND ( ( wpfb_postmeta.meta_key LIKE 'test_repeater_%_test_sub_field'
AND wpfb_postmeta.meta_value LIKE '%beef%' ) )
Et exécutez cela dans le SQL de phpMyAdmin, je reçois la ligne désirée. La question est, comment puis-je changer la requête pour qu'elle ressemble à cela en utilisant des fonctions WordPress?
Vous devez ajouter des caractères génériques à votre meta_value.
Changement
$query->set('meta_query', array(
array(
'meta_key' => 'test_repeater_%_test_sub_field',
'meta_value' => $search,
'compare' => 'LIKE',
),
));
À
$query->set('meta_query', array(
array(
'meta_key' => 'test_repeater_%_test_sub_field',
'meta_value' => '%'.$search.'%',
'compare' => 'LIKE',
),
));