Какой метод сравнения мета-запросов Должен ли я использовать?

Как мне сравнить «как» с числовым значением с meta_query?

У меня есть код, который выполняет автозаполнение поиска продукта в WooCommmerce. Он отлично работает для не numeric skus, но я не могу заставить его работать с числовым skus. Я использую compare => 'like', потому что мой сценарий автозаполнения настроен для начала поиска после ввода двух символов (чтобы можно было искать вместо 10 символов длиной менее 10 символов). Вот что я сейчас работаю:

$products1 = array( 'post_type' => array ('product', 'product_variation'), 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => '_sku', 'value' => $_REQUEST['term'], 'compare' => 'LIKE' ) ), 'fields' => 'ids' ); 

Нет причин, по которым мета-запрос не должен работать. Столбец базы данных – varchar поэтому ваш номер будет обрабатываться как строка. Я тестировал как можно лучше, не имея вашей базы данных, и тестирование, похоже, подтверждает это.

Я думаю, вы получите много ложных матчей. По умолчанию LIKE поиск помещает подстановочный символ % на каждом конце строки, так что 123 будет соответствовать в любом месте строки, например, здесь – 12345678 но также здесь – 45678123 . Я подозреваю, что вам нужен только односторонний LIKE чтобы 123 12345123 но спереди 12345123 но не конец. Для этого вам нужен фильтр.

 function one_sided_like($sql) { remove_filter('get_meta_sql','wildcard_meta_like'); $pat = '%([^%]*)%'; preg_match('|'.$pat.'|',$sql['where'],$matches); if (!empty($matches[1])) { $sql['where'] = str_replace($matches[0],$matches[1].'%',$sql['where']); } return $sql; } add_filter('get_meta_sql','one_sided_like');