我正在尝试扩大默认可湿性粉剂搜索算法的范围。我做错了什么?

时间:2013-01-24 作者:Dan

我知道有一个插件可以做到这一点,但它对于我想添加的内容来说太广泛了。

下面是我第一次尝试扩展搜索以查询自定义字段,但没有返回任何结果。我以前编写过创建查询的代码,但这是我第一次尝试修改已有的查询,显然我遗漏了一些东西。

function st_search_all( $query ) {
    if ( $query->is_search ) {

        $query->set( \'post_type\', array( \'page\', \'attachment\', \'post\' ) );
        $query->set( \'post_status\', \'inherit\' );
        $query->set( \'meta_query\', array(
                array( 
                    \'key\'       => \'_st_plaintext\',
                    \'value\'     => "%{$query->get(\'s\')}%",
                    \'compare\'   => \'LIKE\'
                ),
                array(
                    \'key\'       => \'Training Classes\',
                    \'value\'     => "%{$query->get(\'s\')}%",
                    \'compare\'   => \'LIKE\'
                ),
                array(
                    \'key\'       => \'External Content\',
                    \'value\'     => "%{$query->get(\'s\')}%",
                    \'compare\'   => \'LIKE\'
                )
            )
        );
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'st_search_all\' );
另一件事是,我还需要包括对页面/帖子的主要内容的搜索,这段代码没有尝试。如果我想在meta_query?

EDIT: 在进行@s\\u ha\\u dum建议的更改后转储生成的查询字符串(删除%s、 添加OR 关系,并删除post 从中键入post_type) 正在返回以下内容(添加缩进)。我对SQL不是很熟悉,但生成的查询似乎需要标题或内容与查询匹配,然后才能检查任何添加的字段。我是不是误读了什么?如果没有,我如何通过WP API修改它?

string(494) " 
  AND ((
        (dev_posts.post_title LIKE \'%SBIR%\') OR 
        (dev_posts.post_content LIKE \'%SBIR%\')
  )) AND 
    (dev_posts.post_password = \'\') AND 
    dev_posts.post_type IN 
    (\'page\', \'attachment\') AND 
    (dev_posts.post_status = \'inherit\') AND 
    ((dev_postmeta.meta_key = \'_st_plaintext\' AND 
      CAST(dev_postmeta.meta_value AS CHAR) LIKE \'%SBIR%\') OR 
      (mt1.meta_key = \'Training Classes\' AND 
        CAST(mt1.meta_value AS CHAR) LIKE \'%SBIR%\') OR 
      (mt2.meta_key = \'External Content\' AND 
        CAST(mt2.meta_value AS CHAR) LIKE \'%SBIR%\') )
"

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

将此临时添加到functions.php. 它会破坏一切,但你可以看到WHERE 条款一定要把它拿走,因为如果你把它放在那里,事情就不会正常进行。

function dump_where($w){
 var_dump($w);
}
add_filter(\'posts_where\',\'dump_where\');
您应该注意的第一件事是% 标志消失。删除这些内容,WordPress会将它们添加回原处。如果您在开始或结束时只想要其中一个,而不是两个,那么这可能会更棘手。幸运的是你没有。

其次,默认关系似乎是AND 所以除非你想对每一个都进行匹配meta_keys您应该添加relationship 到您的元查询。

 $query->set( \'meta_query\', array(
            \'relation\' => \'OR\',
            array( 
                \'key\'       => \'_st_plaintext\',
                /* and the rest of your query */
第三,已经搜索了帖子内容。你不应该做任何事情来实现这一点。看看WHERE 子句我的临时代码转储,您应该能够看到发生这种情况的地方。

http://codex.wordpress.org/Class_Reference/WP_Query

结束

相关推荐

Search URL parameters query

Possible Duplicate:Custom search form with empty parameters 希望这是一个快速的过程,但我遇到了麻烦。我有多个搜索词,关键字,类别,国家和日期。我将其设置为用户不必搜索所有这些过滤器。我可以省略类别和/或日期,它将显示更松散的结果。但如果我离开国家,它不会显示任何结果,对任何其他参数执行相同的操作仍会显示结果。问题只在于国家。/?s=a&cat=41&country=&monthnum=&year= 不产生结果,但