Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Dodatak IP-to-Country

Postoje mnogi WordPress dodaci za geolociranje (povezivanje države i, eventualno, grada sa datom IP adresom). Na žalost, svi oni su namenjeni korisnicima WordPress –a, a ne programerima koji prave dodatke. Pokušao sam da popravim ovu situaciju svojim novim dodatkom IP-to-Country, koji ne daje nikakav vidljivi izlaz – on samo objavljuje metode koje drugi programeri mogu koristiti u svojim dodacima. Ovo sam odmah i sam upotrebio u svom dodatku Simple Download Manager.

Instalacija i ažuriranje

Da biste instalirali ovaj dodatak, pratite standardne WordPress korake: Preuzmite distribucionu arhivu sa WordPress repozitorijuma, ili direktno sa ove strane, raspakujte je u neki direktorijum i otpremite je na vaš blog. Zatim aktivirajte dodatak iz administratorskog menija za upravljanje dodacima (Dodaci / Plugins).

Ažuriranje funkcioniše na isti način, a takođe možete koristiti i automatsko ažuriranje sa WordPress repozitorijuma sa dodacima.

Uvoz podataka

Geolociranje, u svom najuobičajenijem obliku, koristi listu IP adresa sa kojima su povezane određene države. Moj dodatak takođe koristi ovakve podatke. Postoji više mogućih izvora, nakon “iscrpljujućeg istraživanja” (=pokretanja Google pretrage i uzimanja prvog prihvatljivog rezultata), odlučio sam da koristim podatke sa ip-to-country.webhosting.info, koji ima stabilnu adresu za preuzimanje (koja, pak, omogućava lako ažuriranje) i fajl koji se lako parsira: to je standardni CSV fajl sa 5 kolona: početna IP adresa, završna IP adresa (te dve adrese definišu interval adresa koje pripadaju istoj državi), dvo-slovni ISO kod države, tro-slovni ISO kod države i puno ISO ime države. Kolone su navedene pod navodnicima " i razdvojene zapetom ,, odvajač redova je LF (ASCII kod 10, PHP reprezentacija \n). Primer:

 "100663296","121195295","US","USA","UNITED STATES"
"121195296","121195327","IT","ITA","ITALY"
"121195328","134693119","US","USA","UNITED STATES"
"134693120","134693375","CA","CAN","CANADA"

Za razliku od uobičajenog predstavljanja IP adresa, u vidu 8-bitnih brojeva razdvojenih tačkama, ovaj fajl koristi predstavljanje u vidu jedne 32-bitne celobrojne vrednosti. U PHP –u možete pretvarati jedan način predstavljanja u drugi pomoću funkcije ip2long (4x8 bita u 32 bita) i long2ip (u obrnutom smeru). Ili možete računati “ručno” – adresu EEEE možete dobiti iz adrese A.B.C.D sledeći ovu formulu:EEEE = 2563*A + 2562*B + 2561*C + 2560*D = 16777216*A + 65536*B + 256*C + D.

Jednom kada ste podatke dobili u željenom formatu, njihovo otpremanje u vašu bazu podataka je krajnje jednostavno: Otvorite konfiguracioni meni dodatka, izaberite izvor podataka („zvanični“ URL, vaš sopstveni URL, ili fajl sa vaeg računara) i kliknite na dugme „Sačuvati podešenja i otpremiti podatke“. Trebalo bi da ovo funkcioniše na svakom serveru; međutim, moraće da vam bude omogućena ekstenzija php_zip ako želite da koristite arhivirani (“zip” –ovani) izvor (kao što je onaj sa zvaničnog URL -a).

Plugin settings

Korišćenje dodatka

Dodatak podržava sledeće zadatke. Ako želite još neko svojstvo, samo mi napišite to.

  • Proveru, da li je dodatak aktivan: Ako je dodatak aktivan, klasa PepakIpToCountry je definisana:

    if (class_exists('PepakIpToCountry'))
      echo "Geolocation is available";
    else
      echo "Please activate Ip-to-Country plugin";
  • Pronalaženje u kojoj državi se nalazi data IP adresa: Ako je dodatak aktivan, možete pozvati jedan od pet definisanih statičkih metoda. Svi oni kao parametar očekuju IP adresu u numeričkom obliku i vraćaju određen deo podataka:

    $country = PepakIpToCountry::IP_to_Country_Full('8.8.8.8');
    // $country = 'UNITED STATES';
    $code2 = PepakIpToCountry::IP_to_Country_XX('8.8.8.8');
    $code2a = PepakIpToCountry::IP_to_Country('8.8.8.8');
    // $code2 = $code2a == 'US';
    $code3 = PepakIpToCountry::IP_to_Country_XXX('8.8.8.8');
    // $code3 = 'USA';
    $info = PepakIpToCountry::IP_to_Country_Info('8.8.8.8');
    // $info = Array('iso_name'=>'UNITED STATES', 'iso_code2'=>'US', 'iso_code3'=>'USA')`;

    Svi zahtevi se keširaju, tako da nema puno razlike između toga kada informacije za određenu IP adresu čitate iz jednog pozivanja funkcije IP_to_Country_Info, ili kada pozivate sve ostale funkcije.

    Ne morate da navedete IP adresu ako vas zanima samo država trenutnog korisnika:

    echo "Welcome, visitor from " . PepakIpToCountry::IP_to_Country_Full();

    Ove funkcije su korisne ako vaša skripta ima neku IP adresu i mora da zna njenu državu.

  • Dodavanje informacije o državi u SQL upit: Ako je dodatak aktivan, možete koristiti njegov metod PepakIpToCountry::Subselect(...), koji može da uključi informaciju o državi u skoro svaki SQL upit. Recimo da imate sledeći uit (uzet iz mog dodatka Simple Download Monitor)::

    $sql = "SELECT id, download_date, ip, referer, userid, username
    FROM wp_sdmon_details
    WHERE download=123
    ORDER BY download_date DESC
    LIMIT 20";

    Sada želite da dodate informaciju o državi u svaki red u ovom upitu. To možete uraditi pozivajući 20 puta metod IP_to_Country..., ali to nepotrebno opterećuje vaš server baze podataka. Koristeći Subselect lako možete dodati novo polje u skup rezultata:

    if (class_exists('PepakIpToCountry'))
      $zeme2 = PepakIpToCountry::Subselect('INET_ATON(wp_sdmon_details.ip)', 'iso_code2');
    else
      $zeme2 = 'NULL';
    $sql = "SELECT id, download_date, ip, referer, userid, username, $code2 code2
    FROM wp_sdmon_details
    WHERE download=123
    ORDER BY download_date DESC
    LIMIT 20";

    Metod PepakIpToCountry::SubSelect($field, $resultfield) prihvata dva argumenta:

    1. $field definiše izvorno polje za IP adresu. To može biti bilo koje polje u vašem upitu (u mom slučaju je to polje ip u tabeli wp_sdmon_details), važno je osigurati da ono bude potpuno kvalifikovano – to jest, umesto da koristite field_name, pokušajte table_name.field_name. Drugi zahtev je da polje mora biti u 32-bitnom brojčanom obliku. Ako vaše tabele koriste uobičajeni oblik A.B.C.D, možete upotrebiti MySQL funkciju INET_ATON, da pretvorite A.B.C.D u jedan broj. Možete upotrebiti gornji kod kao primer.

    2. $resultfield definiše koje polje će biti vraćeno od funkcije subselect. Moguće vrednosti su: iso_name (vraća puno ISO ime države, poput „UNITED STATES“), iso_code2 (vraća dvo-slovni ISO kod, npr. „US“), iso_code3 (vraća tro-slovni ISO kod, npr. „USA“).

    Važna sigurnosna napomena: Metod Subselect ne može da proveri svoje ulazne parametre na prisustvo SQL-injekcionih napada (to jest, $resultfield može biti proveren, pošto on može da sadrži samo jednu od nekoliko znakovnih vrednosti, ali $field uopšte ne može da se proveri). Od kritične važnosti je da budete sigurni da funkciji nikada ne šaljete nešto što bi korisnik mogao da definiše! Ako se ne pridržavate ovoga, dajete svojim korisnicima mogućnost da rade šta god žele sa vašom bazom podataka. Preporučujem da ovom metodu šaljete samo čiste stringove ili konstante (dobro, i $wpdb->prefix), i njihove kombinacije.

Nekoliko funkcija za unos podataka je takođe dostupno, ali sam siguran da ćete, ako smatrate da treba da ih koristite, moći da ih pronađete u izvornom kodu.

Ukoliko imate bilo kakva pitanja, ili zahteve za neku funkcionalnost, objavite novi komentar ovde ili na mojim forumima (da biste ovde objavili komentar, ne morate da se registrujete).

Preuzimanje





Published (Last edited): 11-08-2013 , source: http://www.pepak.net/wordpress/ip-to-country-plugin/