2024年4月18日发(作者:)

发表于周三,5:11下午作者:QiQiBoY分类:PHP,WordPress

如果有关注我博客人,应该会发现最近一周之内博客都一直打不开。我一直以为是主机问题,今天联系了

客服,才发现原来是我自己的主题的问题。所以今天花了大半天的时间一点点排除问题,最后发现原来是

和gravatar的服务器被墙有关。去掉了头像缓存,问题就解决了。

当然,不会白白更新一篇博客的。下面说一个根据自定义字段查询文章的方法。

query_posts可以实现多种组合查询,但是我遇到的一个问题是,需要搜索自定义字段的值。比如为一个

post定义了一个字段“my_address”,它的值表示一个地址,比如“中国北京海淀区北四环路”。如果

我们要想通过搜索“北京”这个关键词来找到这篇post,那么通过query_posts就办不到了。

虽然query_posts的查询有

meta_value

这个方法,但是这个必须是完整的值,也就是只有查询

中国北

京海淀区北四环路

这个长关键句才能找到文章,而只通过

北京

是会查询失败的。也就是说

meta_value是精确查询的,而不能模糊查询。

最后,我琢磨了两种方法,虽然我自己都感觉并不怎么完美。

add_filter('posts_search','wp_custom_search');

functionwp_custom_search($search){

if(!isset($_GET['meta_search']))return$search;//通过$_GET['meta_search']确保是要进行

meta查询

$s=get_query_var('s');

$search="AND(((wp__titleLIKE'%{$s}%')

OR(wp__contentLIKE'%{$s}%')

OR(wp__valueLIKE'%{$s}%')

))AND(wp__password='')";

return$search;

}

add_filter('posts_join','wp_custom_search_join');

functionwp_custom_search_join($join){

if(!isset($_GET['meta_search']))return$join;

$join="INNERJOINwp_postmetaON(wp_=wp__id)";

return$join;

}

为了不影响其它地方的query,所以我们通过检查是否有一个get请求meta_search,来判断是否要对

查询进行处理。

因为默认的post_title和post_content里的内容是模糊查询的,所以我们可以将postmeta的内容追加

到post_content中。手动添加可以,自动加入也行。

下面是自动加入的方法:

add_action('wp_insert_post_data','wp_my_post',10,2);

functionwp_my_post($data,$postarr){

$arrmeta=array('my_address','meta2','meta3');

$info='';

foreach($arrmetaas$meta){

$info.=''.$_POST[$meta];

}

$info.='';

$data['post_content'].=$info;

return$data;

}

仅供参考。

如果你还有更好的方法,欢迎与我交流分享。