web-dev-qa-db-fra.com

Utilisation de pre_get_posts pour la méta-valeur de la comparaison LIKE sur un sous-champ répéteur ACF

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?

1
Jordan Carter

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',
    ),
  ));
2
kuchenundkakao