如何使这个WordPress搜索可选择考虑元值?

时间:2014-09-22 19:19:03

标签: php wordpress search

我尝试配置WordPress搜索功能,以便考虑存储在Advanced Custom Fields插件创建的元字段中的数据。

我正在使用此代码尝试实现这一目标:

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

        $query->set('meta_query', array(
            array(
                'key' => 'detailed_product_title',
                'value' => sanitize_text_field($_GET['s']),
                'compare' => 'LIKE'
            )
        ));
}

这对我来说只是在meta字段中包含搜索字词的帖子的搜索结果。例如,如果我搜索" white",我只会在搜索结果中收到包含其中包含白色的元值的帖子。

这引出了我的问题:

  • 我如何选择性地搜索元值,使我的搜索返回将搜索词保留在元值中的某个位置的帖子,但是否则忽略了元值?

这是我目前的代码:

function searchProductTitle($query) {
    if (!is_admin() && $query->is_search) {

        $query->set('meta_query', array(
            'relation' => 'OR',
            array(
                'key' => 'detailed_product_title',
                'value' => sanitize_text_field($_GET['s']),
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'detailed_product_title',
                'compare' => 'NOT EXISTS'
            )
        ));

    }
}
add_filter('pre_get_posts', 'searchProductTitle');

function my_posts_where($where) {

    global $wpdb;

    if ( isset( $_GET['s'] ) && !empty( $_GET['s'] ) ) {
        $search = sanitize_text_field($_GET['s']);

        $where .= " OR wp_posts.post_content LIKE '%' . $search . '%'";
    }
    return $where;
}
add_filter('posts_where' , 'my_posts_where');

1 个答案:

答案 0 :(得分:0)

尝试类似:

    $query->set('meta_query', array(
        'relation' => 'OR',
        array(
            'key' => 'detailed_product_title',
            'value' => sanitize_text_field($_GET['s']),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'detailed_product_title',
            'compare' => 'NOT EXISTS'
        )
    ));

<强>更新

您将无法直接将上面的meta_query与搜索post_content字段(使用和OR关系)结合起来。您可以做的不是上述内容,而是添加custom query,如下所示:

add_filter( 'posts_where', 'my_posts_where' );

function my_posts_where( $where ) {
    if ( is_search() ) {

        global $wpdb;
        $search = get_search_query();
        $search = like_escape( $search );


        // include postmeta in search
        $where .= " OR {$wpdb->posts}.ID IN (SELECT {$wpdb->postmeta}.post_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->postmeta}.meta_key = 'detailed_product_title' AND {$wpdb->postmeta}.meta_value LIKE '%$search%' AND {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)";

    }

    return $where;
}

请注意,我没有对上述内容进行过测试,但这样可以让您了解自己需要做什么。