我想获取用户的国家/地区代码,并将其与函数内的变量进行比较。
我下载了maxMind GEOIP_STANDARD数据库文件' geoip.dat'和文件' geoip.inc'并将它们放在根目录中。
然后我将以下代码放在函数中。
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
但是代码只会导致页面上的大部分内容消失。
为什么这可能不起作用的任何线索?当我使用$user_location = geoip_detect2_get_info_from_current_ip();
和$user_country_code = $user_location->country->isoCode;
代替时,该功能就像它应该的那样。
整个功能如下。
function set_visibility( $items, $menu, $args ) {
require_once("geoip.inc");
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
foreach( $items as $key => $item ) {
$hidden_items = array();
$item_parent = get_post_meta( $item->ID, '_menu_item_menu_item_parent', true );
// $user_location = geoip_detect2_get_info_from_current_ip();
// $user_country_code = $user_location->country->isoCode;
$locations_string = get_post_meta( $item->ID, 'locations', true );
$locations_string = strtoupper($locations_string);
$locations_array = explode(',', $locations_string);
$locations_array_trimmed = array_map('trim', $locations_array);
$locations_array_filtered = array_filter($locations_array_trimmed);
$selected_locations = $locations_array_filtered;
$hide_show = get_post_meta( $item->ID, 'hide_show', true );
var_dump($country_code);
if( $hide_show == 'show' && in_array($country_code, $selected_locations ) )
$visible = true;
elseif( $hide_show == 'show' && (!in_array($country_code, $selected_locations ) ) )
$visible = false;
elseif( $hide_show == 'hide' && in_array($country_code, $selected_locations ) )
$visible = false;
else
$visible = true;
if( ! $visible || isset( $hidden_items[$item_parent] ) ) { // also hide the children of hidden items
unset( $items[$key] );
$hidden_items[$item->ID] = '1';
}
}
return $items;
}
此外,无论我在foreach循环之前还是之后放置它都是一样的。我也尝试了require和require_once。
答案 0 :(得分:0)
知道了。我必须为.dat文件创建一个名称空间。
$gi = \LSMIGeoIP\geoip_open(WP_PLUGIN_DIR . "/location-specific-menu-items/GeoIP.dat", GEOIP_STANDARD);
$user_country = \LSMIGeoIP\geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
\LSMIGeoIP\geoip_close($gi);