我应该使用哪种元查询比较方法?

时间:2014-05-06 作者:Jeremiah Prummer

如何使用meta\\u查询对数值进行“like”比较?

我有一些代码可以在Woocommerce中自动完成产品sku的搜索。它适用于非数字SKU,但我无法让它适用于数字SKU。我使用compare=>“like”,因为我的自动完成脚本设置为在输入2个字符后开始搜索(这样可以搜索10个字符长的SKU,而不是准确输入)。以下是我现在的工作内容:

$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\'
);

1 个回复
SO网友:s_ha_dum

没有理由认为元查询不起作用。数据库列为varchar 因此,您的数字将被视为字符串。我在没有你的数据库的情况下尽我所能进行了测试,测试似乎证实了这一点。

我想你会得到很多虚假的比赛。默认值LIKE 搜索将放置% 字符串两端的通配符,以便123 将匹配字符串中的任何位置,例如,此处--12345678-- 但也在这里--45678123. 我怀疑你只想要一面LIKE 因此123 匹配但在前面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\');

结束

相关推荐