Wordpress元键搜索结合使用WP查询的帖子标题搜索

时间:2016-01-21 12:02:13

标签: php wordpress

我正在尝试自己的自定义搜索,查看元键和帖子标题。

我当前的代码不会将结果限制为指定的类别(由于查询中的OR)。但是,通过使其成为AND,然后在元键中搜索将停止工作,除非该单词位于标题中。

有没有办法可以同时搜索标题和元键,还是将其限制在该类别中?

编辑:只是为了澄清, 我想要做的搜索如下:

在这些元字段或帖子标题中搜索搜索字词,但所有结果必须在该类别中。

                    function search_title_filter( $where, &$wp_query ) {
                        global $wpdb;
                        if ( $search_title = $_GET['search-in-main-category'] ) {
                            $where .= ' OR ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $search_title ) ) . '%\'';
                        }

                        return $where;
                    }

                    if(isset($_GET['search-in-main-category'])) {

                        add_filter( 'posts_where', 'search_title_filter', 10, 2 );
                        $search_key = $_GET['search-in-main-category'];
                        $query_args = array(
                            'meta_query' => array(
                                'relation' => 'OR',
                                array(
                                    'key' => 'course_overview',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                ),
                            array(
                                'key' => 'intended_audience',
                                'value' => $search_key,
                                'compare' => 'LIKE',
                            ),
                                array(
                                    'key' => 'method_of_delivery',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                ),
                                array(
                                    'key' => 'course_content/agenda',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                )),
                            'product_cat' => $current_cat_slug,
                            'posts_per_page' => 50
                            );
                        $search_query = new WP_Query( $query_args );

3 个答案:

答案 0 :(得分:0)

你的问题有点不清楚,你提到类别是在wp_query的关系设置中吗?情况并非如此,你的类别密钥存在问题,除非它实际上被称为product_cat,它不正确,但即使它已被折旧(参见下面的tax_query)

我最接近的猜测是你在询问如何在元查询字段中组合关系,如下所示:

'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'course_overview',
            'value' => $search_key,
            'compare' => 'LIKE',
        ),
        array(
            'key' => 'intended_audience',
            'value' => $search_key,
            'compare' => 'LIKE',
        ),
        array(
              'relation' => 'AND',  
              array(
                    'key' => 'method_of_delivery',
                    'value' => $search_key,
                    'compare' => 'LIKE',
                ),
                array(
                    'key' => 'course_content/agenda',
                    'value' => $search_key,
                    'compare' => 'LIKE',
                )
        ),   


    ),

正如您所看到的,指定了AND的新数组和关系。

对于类别,您有两种不同的类型,一种是内置类别分类,您可以使用类别的cat = id,category_name即slug名称。你可以看一下这个例子的代码。

自定义分类法适用于您自己的分类法(产品不是内置分类法。您使用tax_query,类似于meta_query

 'tax_query' => array(
    array(
        'taxonomy' => 'product',
        'field'    => 'slug',
        'terms'    => 'phpcourse',
    ),
 ),

答案 1 :(得分:0)

我通过向自定义SQL添加更多代码解决了这个问题。我可以将变量放入函数的唯一方法是使用全局变量。

                    global $current_cat;
                    $current_cat = $current_cat_id;
                    function search_title_filter( $where, &$wp_query) {
                        global $wpdb;
                        global $current_cat;
                        if ( $search_title = $_GET['search-in-main-category'] ) {
                            $where .= ' OR ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $search_title ) ) . '%\'
                            AND '.$wpdb->term_relationships.'.term_taxonomy_id = '.$current_cat;
                        }

                        return $where;
                    }

答案 2 :(得分:0)

您最终的查询将是这样的:

                          $query_args = array(
                            'tax_query' => array(
                                  array(
                               'taxonomy' => 'product',
                              'field'    => 'slug',
                              'terms'    => 'phpcourse',
                                   ),
                             ),
                            'meta_query' => array(
                                'relation' => 'OR',
                                array(
                                    'key' => 'course_overview',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                ),
                            array(
                                'key' => 'intended_audience',
                                'value' => $search_key,
                                'compare' => 'LIKE',
                            ),
                                array(
                                    'key' => 'method_of_delivery',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                ),
                                array(
                                    'key' => 'course_content/agenda',
                                    'value' => $search_key,
                                    'compare' => 'LIKE',
                                )),
                            'product_cat' => $current_cat_slug,
                            'posts_per_page' => 50
                            );
                        $search_query = new 

                       WP_Query( $query_args );