在自定义分类术语、帖子标题和元字段内搜索查询

时间:2012-09-14 作者:TheDeveloper

我想创建一个搜索,它可以:

在我的自定义分类中搜索-自定义标记搜索帖子标题搜索选择元字段??不知道使用自定义帖子类型搜索-简单部分我查看了wordpress API,但找不到任何有用的内置函数,我在下面创建了一个自定义查询:这里有一个bug,因为它有时会返回重复的结果,这里可能需要左连接。

这个查询只在当前搜索术语和标题,但我还希望搜索一个名为cterm的元字段。

SELECT   wp_posts.*
    FROM wp_posts, wp_term_relationships, wp_term_taxonomy, wp_terms
    WHERE (wp_terms.name LIKE \'%car%\'
        OR wp_posts.post_title LIKE \'%car%\')
            AND wp_posts.post_status = \'publish\'
            AND wp_posts.post_type = \'posts_vch\'
        AND wp_posts.ID = wp_term_relationships.object_id
        AND wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
        AND wp_term_taxonomy.term_id = wp_terms.term_id  GROUP BY  wp_posts.ID  LIMIT  1 ,50
更新时间:

在上面更新的查询中,使用管理删除重复结果group by 但另一个缺陷是,它不会带来带有“汽车”一词的帖子。基本上,它只显示标题中有“汽车”一词的帖子,而不显示术语/标签。

3 个回复
SO网友:jessica

您可以使用中允许的搜索参数执行所需的所有操作WP_Query -- 除了只在文章标题中搜索。为此,请参见this answer.

确保查看传递给WP\\u Query的参数中允许的分类法和元子查询。

编辑:由于需要选择使用或,因此有两个选项—可以运行两个查询,然后合并两个post数组,或者如果您更关心性能,可以使用自定义查询,只执行上面编写的SQL。使用全局$wpdb对象和函数$wpdb->get_results(). 为了使查询不返回重复的结果,您应该能够使用SELECT DISTINCT.

SO网友:Alvin

试试这个,它可能会有帮助:

if( !defined( \'ABSPATH\' ) )
    exit;

function modify_wp_search_where( $where ) {
    if( is_search() ) {
        global $wpdb, $wp;
        $where = preg_replace(
            "/($wpdb->posts.post_title (LIKE \'%{$wp->query_vars[\'s\']}%\'))/i",
            "$0 OR ( $wpdb->postmeta.meta_value LIKE \'%{$wp->query_vars[\'s\']}%\' )",
            $where
            );
        add_filter( \'posts_join_request\', \'modify_wp_search_join\' );
        add_filter( \'posts_distinct_request\', \'modify_wp_search_distinct\' );
    }
    return $where;      
}
add_action( \'posts_where_request\', \'modify_wp_search_where\' );

function modify_wp_search_join( $join ) {  
    global $wpdb;   
    return $join .= " LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) ";   
}

function modify_wp_search_distinct( $distinct ) {   
    return \'DISTINCT\';      
} 

SO网友:atstormcup

对于将来可能出现此问题的任何人,Wordpress codex提供了一个由@Alvin提交的解决方案示例。

看见https://codex.wordpress.org/Custom_Queries#Keyword_Search_in_Plugin_Table. 使用$wpdb->posts 插入表名将有助于简化代码并使其更加健壮。

结束

相关推荐

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

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