如何更改核心帖子搜索算法?它在哪里找到/建造的?

时间:2015-11-12 作者:Andrew Wheels

我安装了wordpress和woocommerce,我注意到woocommerce的产品搜索似乎使用wordpress的搜索。嗯,我不喜欢这个搜索,我宁愿在核心部分修改它,而不是增加额外的页面等等。核心代码在哪里?

我读到核心代码对post\\u内容和post title执行了类似的%查询%,我想对其进行修改,使其只搜索标题。我想知道/核心/代码在哪里,以防我将来想添加额外的功能(可能会),我不想简单地在搜索结果的顶部添加标题过滤器,这将是最简单的解决方案,但我不是在寻找简单的方法,我在寻找对我的网站的完全控制。

然而,在GREP中搜索“SELECT*from wp\\u posts”,除了从我的W3超级缓存插件中,没有发现任何有用的东西。这个搜索算法代码在哪里?当然,它不是某种神秘的、不可修改的二进制编码可执行文件。

2 个回复
SO网友:jdm2112

快速提示-永远不要编辑WP核心文件。更新一年发布几次,除其他原因(如安全性)外,您将丢失更改。

主题和特定模板文件决定了WP搜索的处理方式。假设没有搜索插件处于活动状态,并且您的主题正在调用get_search_form(), 您可以按照WordPress Codex页面中列出的逻辑路径执行该功能:https://codex.wordpress.org/Function_Reference/get_search_form

WordPress将查找searchform。活动主题中的php文件。如果它找到一个,就会加载它。如果没有,则返回到核心搜索表单。因此,修改WP核心搜索表单的正确方法是确保您的主题(或子主题)具有搜索表单。php文件可用。

在这种情况下,您可以创建一个自定义查询,只搜索希望返回结果的值。

SO网友:Andrew Wheels

找到了!核心搜索可在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搜索插件可能开始有用了。。。(刚刚测试过,哦,是的,完全是!)

相关推荐

GET_POSTS在页面模板中工作,但不在短码中工作

我正在尝试编写一个短代码,其中包括“get\\u posts”,以便获取博客帖子数据,然后在页面上显示最近的3篇文章。此代码在模板中工作。然而,当我将其放入输出缓冲区(ob\\u start)内的短代码中时,它无法检索帖子。相反,它会获取当前页面本身并循环浏览该页面(在本例中为主页)。你知道我怎样才能让它按照最初的意图在帖子中循环吗?以下是在模板中工作的代码:<?php $lastposts = get_posts( array(\'posts_per_page\' => 3) );?>