Suche nur nach Meta-Schlüssel / Meta-Werten

Ich bin fast dabei.

Auf functions.php habe ich folgendes:

function base_home_product_post_type( $query ) { if($query->is_search() && $_POST['box'] == 'sku') { $query->query_vars['post_type'] = 'product'; $query->query_vars['meta_key'] = 'sku'; $query->query_vars['meta_value'] = $query->query_vars['s']; return; } } add_action('pre_get_posts', 'base_home_product_post_type', 1); 

Und es tut, was es gesagt hat. Sucht nach dem Suchbegriff auf dem Meta-Schlüssel ‘sku’. Problem hierbei ist, dass das von WordPress zurückgegebene Query-Objekt standardmäßig auch dieses enthält und post_title und post_content standardmäßig abfragt:

 SELECT SQL_CALC_FOUND_ROWS whirl_2_posts.ID FROM whirl_2_posts INNER JOIN whirl_2_postmeta ON (whirl_2_posts.ID = whirl_2_postmeta.post_id) WHERE 1=1 AND (((whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%') OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%'))) 

Ich will das wirklich nicht, wenn ich nur nach dem “sku” -Wert suche, also habe ich versucht, es mit posts_where und einigen ziemlich hässlichen REGEXs zu entfernen (Warnung, hacky und buggy):

 function get_rid_of_titles($search) { if(is_search() && $_POST['box'] == 'sku') { $search = preg_filter('|AND\s\({3}\w*\.post_title\sLIKE\s\'\%[^%]*\%\'\) OR \(\w*\.post_content\sLIKE\s\'\%[^%]*\%\'\){3}\s|', '', $search); } return $search; } add_filter('posts_where','get_rid_of_titles'); 

Aber zu keinem Glück. Kann mir jemand die Anleitungen zeigen, um in diesem Fall nach dem benutzerdefinierten Wert zu suchen?

LÖSUNG

Dank @Kaiser unten, habe ich das funktioniert:

 function get_rid_of_titles($search) { if(is_search() && $_POST['box'] == 'sku') { $sku = $_POST['s']; // get search string $needle = "LIKE '%$sku%'"; // search only for LIKE '%_SEARCH_STRING_%'. This is a multisite environment, so involving table names directly is a bad idea $replace = "LIKE '%'"; // replace it with SQL Wildcard so any title and any content are welcome $count = 2; // only the first 2 occurrencies which happen to be post_title and post_content return str_replace($needle,$replace,$search, $count); } } add_filter('posts_where','get_rid_of_titles'); 

Solutions Collecting From Web of "Suche nur nach Meta-Schlüssel / Meta-Werten"

Du könntest zwei Dinge tun:

A) Ersetzen Sie die Suche durch eine SQL-Abfrage, die nur die Postmeta-Tabelle durchsucht (schneller, da kein JOIN involviert ist – Sie können den Post später über seine ID erhalten, wenn die Ergebnisse angezeigt werden).

B) Teilen Sie die Saite direkt nach WHERE 1=1 und lassen Sie den späteren Teil fallen. Sie können eine einfache return str_replace( $query_part_below, '', $search ); .

  AND ( (whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%') OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%') ) 

$wpdb->prepare() Sie sicher, dass Sie $wpdb->prepare() richtig $wpdb->prepare() bevor Sie es zurückschieben.