第一件事:您的“所有单词”复选框的name属性不应该是“s”。这会将搜索文本替换为“1”,因此选中后,您将搜索“1”,而不是搜索文本。
如果你想复制你在问题中给出的例子,我认为你不想使用“精确”。
下面是一个示例:
Search for "Two Things" in titles and content:
Matches Does not match
"Two" "Two Things More"
"Things" "One or Two Things"
"Two Things" "Two Things."
我可以滔滔不绝地谈论它不匹配的地方,但你明白了。这可能就是为什么你会得到意想不到的结果。
无论如何,请尝试将“所有单词”复选框的名称更改为无法匹配的名称,例如\'fake_search_flag_name\'
, 因为该标志只是描述WordPress的正常默认搜索功能。
编辑
好的,既然它们是收音机,下面是您可以做的事情:
第一个是WordPress的默认行为,因此需要将该值设为空:
<input type="radio" name="sentence" value="" checked="checked" /> All Words
如果选中该框,由于该值为空,WordPress将忽略它并使用其默认功能。下一部分有些棘手。更改其他两个收音机的值,如下所示:
<input type="radio" name="sentence" value="or" /> Some Word<br />
<input type="radio" name="sentence" value="and" /> Entire phrase
就其本身而言,这将使它们的行为方式相同:即您希望“整个短语”发挥作用的方式。所以我们需要让“一些词”起作用。我还没有测试下一部分,但它应该可以工作。
我们需要过滤搜索查询,以允许搜索词与包含部分词但不是全部词的帖子匹配:
add_filter( \'posts_search\', \'my_awesome_posts_search_filter\' );
function my_awesome_posts_search_filter( $sql, $wpq ){
if( !isset( $wpq->query_vars[\'sentence\'] ) || \'or\' != $wpq->query_vars[\'sentence\'] )
return $sql;
$new_search = str_replace( \') AND (\', \') OR (\', $sql );
return $new_search;
}
应该这样做。