如何更改 wordpress 搜索栏中的搜索操作?

Posted

技术标签:

【中文标题】如何更改 wordpress 搜索栏中的搜索操作?【英文标题】:How to change the search action in wordpress search bar? 【发布时间】:2019-05-21 17:03:01 【问题描述】:

创建一个新帖子并发布它。

标题为my test for search,内容如下:

no host route

检查 wordpress 数据库中发生的情况。

 select post_title from wp_posts
     where post_content like "%no%"
       and post_content like "%route%"
       and post_content like "%to%"
       and post_content like "%host%";

名为my test for search 的帖子不会出现在选择结果中。 在 wordpress 搜索栏中输入no route to host,然后点击回车。 名为my test for search 的帖子显示为结果。

我找到了网页包含to的原因,在左上角,有一个单词Customize,其中包含搜索到的单词to。 如何在 wordpress 搜索栏中更改此类搜索操作? 我想让wordpress saerch bar中的搜索行为,例如,当你输入no route to host时,等于下面的sql命令。

select post_title from wp_posts where post_content like "%no%route%to%host%";

我wordpress中的所有插件。

CodePen Embedded Pens Shortcode
Crayon Syntax Highlighter
Disable Google Fonts
Quotmarks Replacer
SyntaxHighlighter Evolved

【问题讨论】:

请提供SHOW CREATE TABLE wp_posts。我怀疑整理。 您的搜索查询不是由默认 WP 安装生成的。看起来你已经修改了它。搜索支持 GET 参数,如句子和精确,但它们不会生成您想要的 post_content like "%no%route%to%host%";。您能否进一步扩展为什么自定义标签会影响您的搜索,它应该与搜索完全无关。 【参考方案1】:

wp-includes/class-wp-query.php:1306 的 SQL WHERE 子句中添加了 this

<?php
// wp-includes/class-wp-query.php:~1306

foreach ( $q['search_terms'] as $term ) 
    //...
    $like = $n . $wpdb->esc_like( $term ) . $n;
    $search .= $wpdb->prepare( "$searchand(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_excerpt $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s))", $like, $like, $like );
    // ...

因此,我将连接到pre_get_posts,并将查询的单词作为明确的“search_terms”提供,因为它们被添加到该子句中,正如您所说的那样使用LIKE 修饰符正在寻找为!

所以,我们可以这样做:

<?php
// functions.php

function fuzzify_query(\WP_Query $q) 
    if (true === $q->is_search()
        && true === property_exists($q, 'query')
        && true === key_exists('s', $q->query)
    ) 
        $original_query = $q->query['s'];
        $words          = explode(' ', $original_query);
        $fuzzy_words    = array_map(
            function($word) 
                return '%'.$word.'%';
            ,
            $words
        );

        $q->query_vars['search_terms'] = $fuzzy_words;

        return $q;
    

    return $q;


 add_action('pre_get_posts', 'fuzzify_query', 100); // Or whatever priority your fuzziness requires!

【讨论】:

这不会按照 OP 的要求生成 like "%no%route%to%host%"。听起来更像是您正在尝试执行搜索查询参数exact=0 默认情况下已经执行的操作。但我不认为您可以设置这样的搜索词,因为它们是在WP_Query::parse_search() 中生成搜索 SQL 时直接从搜索查询 $q['s'] 中提取的。因此,这里设置的搜索词似乎会被覆盖,并且对搜索 SQL 查询没有影响。干杯

以上是关于如何更改 wordpress 搜索栏中的搜索操作?的主要内容,如果未能解决你的问题,请参考以下文章

无法更改 iOS 7 搜索栏中的文本颜色

如果搜索,则在方向更改时不会恢复工具栏中的搜索图标

当我在表格视图的搜索栏中搜索时如何检索复选框按钮位置更改

仅在父片段中的操作栏中显示搜索视图

如何更改 SearchView 上的默认图标,以便在 Android 的操作栏中使用?

如何在操作栏中构建类似 Gmail 的搜索框?