在函数中获取用户的国家/地区代码

时间:2016-02-11 12:53:54

标签: php geoip

我想获取用户的国家/地区代码,并将其与函数内的变量进行比较。

我下载了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。

1 个答案:

答案 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);