在查询POST和其他元字段的组合时,有比直接修改WHERE值更好的解决方案吗?

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

这个问题是a question I recently asked.

我已经实现了似乎是唯一的解决方案,而且似乎奏效了(耶!)。我只需要验证一下:

这是修改查询以匹配(post_title OR post_content 所需的任何其他元字段posts_where 过滤器,但认为最好依靠修改$query 尽可能多地限制直接修改WHERE. 这是一个合理的选择吗在任何情况下,以下是用于修改WHERE:

function st_posts_where( $where ){
    if( !is_admin() ){
        global $wpdb;
        $ptn = "/(\\s*AND \\(\\(\\({$wpdb->prefix}posts.post_title LIKE \'%.*%\'\\)\\s+OR\\s+\\(".
               "{$wpdb->prefix}posts.post_content LIKE \'%.*%\'\\)\\)\\)\\s+)AND(.*)/";
        $where = preg_replace( $ptn, "$1OR$2", $where );
    }
    return $where;
}
add_filter( \'posts_where\' , \'st_posts_where\' );
此外,以下是original question 正在寻址,它仍然与上面的一个一起使用。

function st_search_all( $query ) {
    if( !is_admin() && $query->is_search ) {
        $query->set( \'post_type\', array( \'page\', \'attachment\' ) );
        $query->set( \'post_status\', \'inherit\' );
        $query->set( \'meta_query\', array(
            \'relation\' => \'OR\',
            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\' );
所有这些结合在一起会产生以下查询结果,从而获得所需的结果:

AND (((dev_posts.post_title LIKE \'%sbir%\') 
  OR (dev_posts.post_content LIKE \'%sbir%\')))  
OR 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网友:kingkool68

您需要确保只处理主查询,而不是从插件或搜索页面上的模板中调用的后续查询。换句话说。。。

 if( !is_admin() && $query->is_search ) {
应该是

 if( !is_admin() && $query->is_search && $query->is_main_query() ) {
请参见http://codex.wordpress.org/Function_Reference/is_main_query

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post