找到了!核心搜索可在wp includes/query中找到。php和我版本中的mysql代码是在第2094行的函数“parse\\u search(&;q)”下构建的,这一行是有问题的:
$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title LIKE %s) OR ($wpdb->posts.post_content LIKE %s))", $like, $like );
然而,我有一个主题,它有一个搜索表单。php文件。然而,我在那里找不到MYSQL语句,我阅读了其他人的Q&;修改该文件并没有修改核心搜索函数(我在上面粘贴的那个),该函数先执行,然后执行searchform。php是在执行核心搜索函数之后执行的。因此,要真正修改搜索算法,似乎我需要更改核心搜索函数,并且需要修改上面的行才能这样做。我错了吗?第一次使用wordpress。
核心搜索之所以糟糕,是因为像“cat”这样的简短搜索查询是无用的,因为几乎每个帖子的post\\u内容的某处都有“cat”嵌入到某个单词(常见单词,如…scat、deprecate、mastitate、category等)的某处。[顺便说一句,一个实际用户不得不费力地浏览5页的搜索结果,因为几乎整个商店都在搜索中。我不想让我的用户受制于此。]
所以,我宁愿做一些像。。。
post\\u标题(如%qry%)或post\\u内容(如%qry%);也就是说,在title中进行部分匹配,在post\\u内容中进行精确匹配。
或者更好的方法是,使用类似于\'%qry%或\'qry%\'的post\\u标题或类似于\'%qry%\'的post\\u内容。(获取标题中单词的开头、标题的最开头以及内容中的精确匹配。)
现在我必须找到这个prepare()函数,找出如何实现它。我似乎无法轻松地将其直接添加到代码中,因为似乎在prepare函数中添加了百分号(不需要的行为;我需要手动添加百分号)。
[编辑,它们实际上是在前面的parse\\u search函数中添加的]
嗯,在进一步研究代码之后,我想我可能想添加一个过滤器,lol(核心函数设计用于对所有术语进行精确搜索,或对所有术语进行部分搜索,两者之间没有实数)。“如何?”这是我接下来几天要绞尽脑汁的问题,我可以说。A.
(编辑,达格·纳比特。我让它工作了一次,然后我改变了一些东西,再也不能让它工作了。我发誓Wordpress喜欢捉弄我。)
编辑:我尝试添加过滤器,它工作过一次,再也没有工作过。所以,我说去死吧,然后编辑核心文件。像个魔术师一样工作,无忧无虑,立即工作。但是,你知道,我不是那种敢于冒险的人,所以我确实保留了原始文件的备份,以防万一。
这是我的最后一段代码,是的,它确实像我想象的那样生成了/很棒/搜索结果。理想情况下,唯一不能正常工作的单词是同音异义词。(例如,像“can”这样的词可以返回整个商店。但是,我认为这是一个可以接受的权衡。我认为我应该按照我的商店当前的设置方式禁用内容搜索。)
protected function parse_search( &$q ) {
global $wpdb;
$search = \'\';
// added slashes screw with quote grouping when done early, so done later
$q[\'s\'] = stripslashes( $q[\'s\'] );
if ( empty( $_GET[\'s\'] ) && $this->is_main_query() )
$q[\'s\'] = urldecode( $q[\'s\'] );
// there are no line breaks in <input /> fields
$q[\'s\'] = str_replace( array( "\\r", "\\n" ), \'\', $q[\'s\'] );
$q[\'search_terms_count\'] = 1;
if ( ! empty( $q[\'sentence\'] ) ) {
$q[\'search_terms\'] = array( $q[\'s\'] );
} else {
if ( preg_match_all( \'/".*?("|$)|((?<=[\\t ",+])|^)[^\\t ",+]+/\', $q[\'s\'], $matches ) ) {
$q[\'search_terms_count\'] = count( $matches[0] );
$q[\'search_terms\'] = $this->parse_search_terms( $matches[0] );
// if the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence
if ( empty( $q[\'search_terms\'] ) || count( $q[\'search_terms\'] ) > 9 )
$q[\'search_terms\'] = array( $q[\'s\'] );
} else {
$q[\'search_terms\'] = array( $q[\'s\'] );
}
}
$n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
$searchand = \'\';
$q[\'search_orderby_title\'] = array();
foreach ( $q[\'search_terms\'] as $term ) {
if ( $n ) {
$like = \'%\' . $wpdb->esc_like( $term ) . \'%\';
$q[\'search_orderby_title\'][] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $like );
}
$like1 = $n .\' \'. $wpdb->esc_like( $term ) . $n;
$like2 = $wpdb->esc_like( $term ) . $n;
$like3 = $n.\' \'.$wpdb->esc_like( $term ).\' \'.$n;
$search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title LIKE %s) OR ($wpdb->posts.post_title LIKE %s) OR ($wpdb->posts.post_content LIKE %s))", $like1, $like2,$like3 );
$searchand = \' AND \';
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = \'\') ";
}
return $search;
}
现在我开始认为YITH ajax搜索插件可能开始有用了。。。(刚刚测试过,哦,是的,完全是!)