wordpress显示评论者来自哪个城市

实现的原理是利用新浪和淘宝的IP查询接口,返回IP所属城市

小修了下代码,去掉了挂载点,直接在显示评论时调用函数

将以下函数放到你的functions.php 中

/**
* 使用api获取城市
* @param string $ip
* @return string|mixed
*/
function wpgo_get_city($ip = null) {
$ip = $ip == null ? wpgo_get_ip() : $ip;
$ipApi = array (
'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=',
'http://ip.taobao.com/service/getIpInfo.php?ip='
);

foreach ( $ipApi as $k=> $api ) {
$res = wp_remote_get ( $api . $ip );
if ( is_object ( $res ) && $k == 0 ) {
continue;
}
if (! empty ( $res ['body'] )) {
$return = json_decode ( $res ['body'], true );
if (! empty ( $return ['city'] )) {
return $return ['city'];
} elseif( $return ['province'] == '香港' || $return ['province'] == '澳门') {
return $return ['province'];
} else {
return $return ['country'];
}
}
}
return false;
}

/**
* 获取当前用户ip
* @return string
*/
function wpgo_get_ip() {
if ( getenv ( "HTTP_CLIENT_IP" ) && strcasecmp ( getenv ( "HTTP_CLIENT_IP" ), "unknown" ) ) {
$ip = getenv ( "HTTP_CLIENT_IP" );
} elseif (getenv ( "HTTP_X_FORWARDED_FOR" ) && strcasecmp ( getenv ( "HTTP_X_FORWARDED_FOR" ), "unknown" )) {
$ip = getenv ( "HTTP_X_FORWARDED_FOR" );
} elseif (getenv ( "REMOTE_ADDR" ) && strcasecmp ( getenv ( "REMOTE_ADDR" ), "unknown" )) {
$ip = getenv ( "REMOTE_ADDR" );
} elseif (isset ( $_SERVER ['REMOTE_ADDR'] ) && $_SERVER ['REMOTE_ADDR'] && strcasecmp ( $_SERVER ['REMOTE_ADDR'], "unknown" )) {
$ip = $_SERVER ['REMOTE_ADDR'];
}
if ($_SERVER ['REMOTE_ADDR'] == '127.0.0.1' && $ip == 'unknown') {
$ip = 'localhost';
}
return $ip;
}

最重要的一段:最后在你的模板输出评论之前,获取城市字段,下面是引用我模板里的代码,你只能参考判断方式,具体怎么修改得根据你的模板来修改

// 如果是管理员回复
if ( $is_admin ) {
$city = '来自管理员的回复';
} else {
// 兼容以前还没有城市字段的评论
$city = get_comment_meta( $comment->comment_ID, 'city_name', true );
if( !$city ) {
$city = wpgo_get_city ( $comment->comment_author_IP );
// 如果api可以正常获取到城市信息,则插入数据库
if ( $city ) {
update_comment_meta( $comment->comment_ID, 'city_name', $city );
} else {
// 如果因为异常获取不到api的信息,返回自定义字符串,留着下次读取评论时再重新获取
$city = '火星';
}
}
$city = "来自{$city}的网友";
}

From Cuelog