web-dev-qa-db-de.com

Verwenden von pre_get_posts für den Metawert des LIKE-Vergleichs im ACF-Repeater-Unterfeld

Ich versuche, meine Suchergebnisseite basierend auf einem ACF-Unterfeldwert eines Repeater-Felds zu organisieren. Ich hätte lieber ein LIKE-Ergebnis als =.

Bisher habe ich Folgendes erhalten (mit Hilfe von unten geändert, funktioniert aber immer noch nicht):

// 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');

Es funktioniert einwandfrei, wenn ich den genauen Wert hinzufüge, d. H. "Rinderfilet", aber wenn ich "Rindfleisch" eingebe, schlägt dies fehl. Wie kann ich die Suche allgemeiner gestalten?

Ich habe das Query Monitor Plugin installiert und festgestellt, dass ich die folgende SQL habe

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

Wenn ich das ändere:

AND ( ( wpfb_postmeta.meta_key LIKE 'test_repeater_%_test_sub_field'
AND wpfb_postmeta.meta_value IN ('beef') ) )

Dazu:

AND ( ( wpfb_postmeta.meta_key LIKE 'test_repeater_%_test_sub_field'
AND wpfb_postmeta.meta_value LIKE '%beef%' ) )

Und führe das in phpMyAdmins SQL aus, ich bekomme die gewünschte Zeile. Die Frage ist, wie kann ich die Abfrage mithilfe von WordPress-Funktionen so ändern?

1
Jordan Carter

Sie müssen Ihrem meta_value Platzhalter hinzufügen.

Veränderung

$query->set('meta_query', array(
    array(
      'meta_key' => 'test_repeater_%_test_sub_field',
      'meta_value' => $search,
      'compare' => 'LIKE',
    ),
  ));

Zu

$query->set('meta_query', array(
    array(
      'meta_key' => 'test_repeater_%_test_sub_field',
      'meta_value' => '%'.$search.'%',
      'compare' => 'LIKE',
    ),
  ));
2
kuchenundkakao