这是解决这个问题的基本方法。这会修改SQL查询本身,但它几乎是一个1行程序。我确信还有其他方法,但这种方法对查询构建过程没有太大的影响,因为它只在最后修改SQL。注意:我意识到这个方法可能会在某个时候被查询生成器的语法所篡夺。
首先钩入过滤器:
add_filter(\'posts_request\', \'YP_company_name_where\', 10, 2);
然后,让我们修改SQL请求的确切部分,请注意,我们正在查找正在运行的搜索/筛选是针对第一个字母的情况,在我们的特定情况下,如果$输入包含“short company name”。根据您的喜好调整您的条件。
function YP_company_name_where($input, &$wp_query) {
if (stripos($input, \'short-company-name\') !== FALSE) {
$x = preg_replace("/wp_postmeta.meta_key\\s=\\s\'short-company-name\'\\sAND\\sCAST\\(wp_postmeta.meta_value\\sAS\\sCHAR\\)\\sLIKE\\s\'\\%/",
"wp_postmeta.meta_key = \'short-company-name\' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'", $input, 1);
return $x;
}
return $input;
}
请注意,如果这与您的特定查询不完全一样,只需转储$输入,找到错误的输入,并在此阶段调整SQL,以便您的查询根据您需要的列查找“…like[letter]%”。“replace”真正做的就是准确定位特定查询,删除“LIKE%[letter]%”,并将其替换为“LIKE[letter]%”。
我这样做是因为我已经使用了一个前端插件来过滤/查询帖子,无法轻松地使用独立的SQL查询来查找第一个字母。我正在处理一个多参数、用户驱动和/或逻辑过滤的查询情况,对于这一种情况,修改最终结果更容易。