纯代码免插件实现WordPress搜索自定义字段

自定义字段是WordPress中提供的更强大的功能之一,通过自定义字段,可以扩展WordPress的功能,比如企业网站的产品编号,价格信息,CMS的图片展示等。因而,在用WordPress建设企业网站的时候,通常会用自定义字段增加产品的详细信息。然而,非常不方便的是,自定义字段不可以通过WordPress常规搜索展现,如果需要通过搜索自定义字段查找产品信息,就需要改造WordPress的搜索查询。

实现无插件搜索自定义字段的方法,国外的大神已经给出了方法,这里就做搬运工,分享给大家。所以,使用谷歌搜索就是学**好帮助。

第一步,改造链接查询

由于自字义字段的数据都是存储在数据库"Postmeta"表中,默认情况下,WordPress的搜索功能被设定为搜索"Post"表对应的内容。因而,要实现搜索自定义字段中的数据,首先需要改造链接查询,将"Post"和"Postmeta"连结在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */

function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
   
    return $join;
}
add_filter('posts_join', 'cf_search_join' );

第二步,修改搜索查询功能

接下来,需要改造的是修改WordPress的搜索查询,让搜索能够展现出自定义字段对应的文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */

function cf_search_where( $where ) {
    global $pagenow, $wpdb;
   
    if ( is_search() ) {
        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

第三步,过滤重复文章

由于"Postmeta"和"Post"已经加入搜索中,搜索的时候,容易造成同一篇文章出现两次或是多次的现象,所以必须要对重复文章进行过滤。将DISTINCT关键字添加到SQL查询,就可以防止返回重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */

function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

最后一步,将以上的代码内容添加到主题模板functions.php,就可以实现通过自定义字段搜索文章。另外,前台样式,需要自行设计修改。

因此,整合所有的步骤,把下面的内容加入主题模板函数文件functions.php中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
/**
 * Extend WordPress search to include custom fields
 *
 * http://adambalee.com
 */


/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */

function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
   
    return $join;
}
add_filter('posts_join', 'cf_search_join' );

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */

function cf_search_where( $where ) {
    global $pagenow, $wpdb;
   
    if ( is_search() ) {
        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */

function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
?>

-END-

站内相关文章:

Comment (8 )
  • 13楼:
    增达网QQ-79513485

    感觉不错哦,认真拜读咯!

    #12
  • 15楼:
    增达网QQ-33092290

    真是时光荏苒!

    #14
  • 17楼:
    增达网

    从百度进来的,拜读一下贵站博文先
    丁酉年(鸡)二月十五 2017-3-12

    #16
  • 19楼:
    增达网

    就是喜欢看你博客!

    #18
  • 21楼:
    三五豪侠传

    拜读大侠博客,感悟人生道理!

    #20
  • 23楼:
    九州套图

    简约不简单,大气有内涵!

    #22
  • 25楼:
    九州套图

    来看看咯~

    #24
  • 27楼:
    九州套图

    又是一年,祝博主要啥有啥想啥来啥总之不缺啥!

    #26
评论是一种美德,说点什么吧,否则我会恨你的。。。