如果有关注我博客人,应该会发现最近一周之内博客都一直打不开。我一直以为是主机问题,今天联系了客服,才发现原来是我自己的主题的问题。所以今天花了大半天的时间一点点排除问题,最后发现原来是和gravatar的服务器被墙有关。去掉了头像缓存,问题就解决了。
当然,不会白白更新一篇博客的。下面说一个根据自定义字段查询文章的方法。
query_posts可以实现多种组合查询,但是我遇到的一个问题是,需要搜索自定义字段的值。比如为一个post定义了一个字段“my_address”,它的值表示一个地址,比如“中国 北京 海淀区 北四环路”。如果我们要想通过搜索“北京”这个关键词来找到这篇post,那么通过query_posts就办不到了。
虽然query_posts的查询有“meta_value”这个方法,但是这个必须是完整的值,也就是只有查询“中国 北京 海淀区 北四环路”这个长关键句才能找到文章,而只通过“北京”是会查询失败的。也就是说meta_value是精确查询的,而不能模糊查询。
最后,我琢磨了两种方法,虽然我自己都感觉并不怎么完美。
方法一,通过add_filter处理posts_join、posts_search勾子
add_filter( 'posts_search', 'wp_custom_search' );
function wp_custom_search($search){
if(!isset($_GET['meta_search']))return $search;//通过$_GET['meta_search']确保是要进行meta查询
$s=get_query_var('s');
$search = "AND (((wp_posts.post_title LIKE '%{$s}%')
OR (wp_posts.post_content LIKE '%{$s}%')
OR (wp_postmeta.meta_value LIKE '%{$s}%')
)) AND (wp_posts.post_password = '')";
return $search;
}
add_filter( 'posts_join', 'wp_custom_search_join' );
function wp_custom_search_join($join){
if(!isset($_GET['meta_search']))return $join;
$join = "INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)";
return $join;
}
为了不影响其它地方的query,所以我们通过检查是否有一个get请求meta_search,来判断是否要对查询进行处理。
方法二,将字段信息加入到post_content中
因为默认的post_title和post_content里的内容是模糊查询的,所以我们可以将postmeta的内容追加到post_content中。手动添加可以,自动加入也行。
下面是自动加入的方法:
add_action('wp_insert_post_data','wp_my_post',10,2);
function wp_my_post($data, $postarr){
$arrmeta=array('my_address','meta2','meta3');
$info='<span style="display:none;color:#fff;">';
foreach($arrmeta as $meta){
$info .= ' '.$_POST[$meta];
}
$info.='</span>';
$data['post_content'] .= $info;
return $data;
}
仅供参考。
如果你还有更好的方法,欢迎与我交流分享。
