Creați un plugin de condiții meteo folosind Yahoo și SimpleXML

În acest tutorial, veți învăța cum să creați un plugin simplu care folosește biblioteca simplă XML din PHP pentru a accesa Yahoo! Serviciul meteo. Condițiile meteorologice curente vor fi afișate fie cu un cod scurt, fie cu un șablon de șablon.


Yahoo! Vreme

Yahoo! oferă un flux RSS / XML gratuit care oferă date privind condițiile actuale (și previzionate) pentru o anumită locație. Iată urlul de feed pentru Londra, GB:

Yahoo! Vreme

Veți vedea ceva de genul:

Vizualizați sursa acestei pagini și veți găsi o mină de aur a datelor meteo în format XML. Putem analiza aceste date folosind biblioteca SimpleXML din PHP, extrageți ceea ce avem nevoie și afișați-o în fișierele WordPress, paginile și fișierele șablon.

WOEIDs

Yahoo! utilizează WOEIDs pentru a identifica în mod unic entități geografice precum orașele, precum și puncte de interes specifice, cum ar fi Disneyland și Turnul Eiffel. Interogarea Yahoo! serviciul meteo folosind WOEID este extrem de precis, deoarece fiecare locație are un WOEID unic. De exemplu, există 36 de locuri numite Paris în lume, dar fiecare are un WOEID unic.

Puteți utiliza acest serviciu WOEID Lookup pentru a găsi o potrivire exactă a locației.

În URL-ul de mai sus, cei doi parametri utilizați sunt W pentru WOEID și u pentru scala de temperatură (Celsius sau Fahrenheit). Vom folosi amândouă în plugin-ul nostru.


Pasul 1 Configurați pluginul

Dosarul plugin WordPress este localizat în folderul de instalare WordPress la wp-content / plugins. Creați un dosar în interiorul dosarului de pluginuri. Să spunem asta get-curent-meteo. Acum, creați fișierul plugin-ului însuși. Să spunem asta get_current_weather.php Calea către fișierul pluginului trebuie să fie acum: wp-content / plugins / get-curent-meteo / get_current_weather.php

Fiecare plugin WordPress are nevoie de câteva informații de antet, astfel încât WordPress să o poată identifica și să o pună la dispoziție pe pagina dvs. de plugin pentru tabloul de bord. Plasați acest cod în partea de sus a fișierului dvs. de plugin și salvați-l.

  

Puteți edita aceste informații conform cerințelor dvs..

Acum, mergeți la tabloul de bord WordPress și selectați meniul Pluginuri. Veți vedea pluginul afișat astfel:

Nu-l activa încă.


Pasul 2 Eticheta cu cod scurt și șablon

Codurile scurte WordPress vă permit să plasați ieșirea pluginului în mesajele și paginile dvs. Etichetele de șabloane vă permit să plasați fișierele șablon în fișierele șablon (antet, subsol, bara laterală etc.) Trebuie să definim două funcții în plugin-ul nostru, unul pentru codul scurt și unul pentru eticheta șablonului. Ambele vor returna aceleași date despre vreme.

Eticheta șablonului

Eticheta șablonului va fi utilizată ca: get_current_weather_template_tag (vierme, tempscale), în cazul în care woeid este WOEID pentru o locație și tempscale este scara de temperatură cerută, Celsius sau Fahrenheit. Deci, pentru a obține datele meteo pentru Londra, GB în grade Celsius am folosi eticheta șablonului get_current_weather_template_tag ('44418', 'c').

Plasați următorul cod în fișierul plugin:

 funcția get_current_weather_template_tag ($ woeid = ", $ tempscale = 'c') echo get_current_weather_display ($ woeid, $ tempscale);

Această funcție acceptă WOEID și tempscale. Veți observa că tempscale are un parametru implicit de c, doar în cazul în care nu este definit și pentru comoditate. Funcția ascultă un apel către o altă funcție get_current_weather_display care ne va furniza datele meteorologice formate.

Codul scurt

Codul scurt va returna aceleași date meteorologice formate ca eticheta șablonului, cu puțin mai multă muncă. Codul scurt WordPress va fi folosit în postări și pagini de genul: [vremea get_current woeid = "tempscale ="]. Deci, pentru a obține datele meteorologice pentru Londra, GB în grade Celsius am folosi codul scurt [get_current_weather woeid = '44418' tempscale = 'c'). Pentru că folosim un shortcode, trebuie să-i spunem lui WordPress despre asta. Pentru a face acest lucru vom folosi funcția WordPress add_shortcode.

Plasați următorul cod în fișierul plugin:

 add_shortcode ('get_current_weather', 'get_current_weather_shortcode');

Primul parametru get_current_weather definește numele codului scurt pe care îl vom folosi în postările și paginile noastre. Al doilea parametru get_current_weather_shortcode este numele funcției care este numită de codul scurt.

Iată funcția numită de get_current_weather. Plasați următorul cod în fișierul plugin:

 funcția get_current_weather_shortcode ($ atts) $ args = shortcode_atts (array ['woeid' =>, 'tempscale' => 'c'), $ atts); $ args ['tempscale' ] 'c': 'f'; returnați get_current_weather_display ($ args ['woeid'], $ args ['tempscale']);

Funcția Shortcode Explained

Funcția noastră de cod scurt get_current_weather_shortcode acceptă atributele de coduri scurte conținute în $ ATTS matrice. Aceste atribute ar trebui să fie WOLID și tempscale noastre. Dar dacă nu sunt? API-ul Shortcode ne oferă o modalitate de a furniza valori implicite pentru aceste atribute așteptate, shortcode_atts funcţie.

Shortcode_atts ia două argumente. Prima este o matrice de nume => perechi de valori. Numele este atributul de cod scurt și valoarea este valoarea implicită. Dacă numele nu este prezent în $ atts, acesta este creat cu valoarea implicită. Acest lucru ne permite să ne asigurăm că funcția noastră are atributele corecte cu valorile implicite.

Dar dacă în loc de c sau f, o altă valoare a fost trecută pentru tempscale? Acolo este următoarea afirmație.

 $ args ['tempscale'] = ($ args ['tempscale'] == 'c')? "c": "f";

Această declarație este garanția noastră că fie c sau f este utilizat pentru tempscale. Utilizează operatorul ternar PHP și este echivalent din punct de vedere funcțional cu:

 dacă ($ args ['tempscale'] == 'c') $ args ['tempscale'] = 'c';  altceva $ args ['tempscale'] = 'f'; 

Puteti folosi oricum, dar operatorul ternar este mai elegant pentru acest scop.

În cele din urmă, argumentele sunt transmise către get_current_weather_display funcţie.


Pasul 3 Ridicarea ușoară

Iată-l get_current_weather_display care se numește atât prin codul scurt, cât și prin eticheta șablonului.

Plasați următorul cod în fișierul plugin:

 funcția get_current_weather_display ($ woeid, $ tempscale) $ weather_panel = '
„; dacă $ weather = get_current_weather_data ($ woeid, $ tempscale)) $ weather_panel. = '". $ vreme ['oraș']. '„; $ weather_panel. = '". $ vreme ['temp']. "я". strtoupper ($ tempscale). '„; $ weather_panel. = '„; $ weather_panel. = '". $ vreme ['condiții']. '„; altceva // nu există date meteo $ weather_panel. = 'Nu există date meteo!„; $ weather_panel. = '
„; returnați $ weather_panel;

Această funcție este într-adevăr doar pentru formatarea datelor meteo returnate de la get_current_weather_data (Pasul 4). Dacă nu se întoarce date meteorologice, "Date meteo fără meteorologie!" mesajul este returnat.


Pasul 4 Ridicarea ridicată

Iată-l get_current_weather_data funcția numită de get_current_ weather_display în pasul 3

Plasați următorul cod în fișierul plugin:

 funcția get_current_weather_data ($ woeid, $ tempscale) $ query_url = 'http://weather.yahooapis.com/forecastrss?w='. $ nefericit. '& u ='. $ Tempscale; dacă $ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> canal-> descriere), "error" TRUE; // nici un răspuns de la serverul de vreme dacă (! $ Error) $ vreme ['city'] = $ xml-> canal-> copii ('yweather' oraș; $ vreme ['temp'] = $ xml-> canal-> element-> copii ('yweather', TRUE) -> condiție-> atribute () -> temp; $ vreme ['conditii'] = $ xml-> canal-> element-> copii ('yweather', TRUE) -> condition-> atribute () -> text; $ description = $ xml-> canal-> element-> descriere; $ imgpattern = '/src="(.*?)"/i'; preg_match ($ imgpattern, $ description, meciuri $); $ vreme ['icon_url'] = $ meciuri [1]; întoarcere $ vreme;  retur 0; 

Contactați Yahoo! Vremea și verificarea răspunsului

get_current_weather_data funcția utilizează SimpleXML pentru a interoga Yahoo! serviciul meteo folosind WOLID și tempscale date. Dacă există o eroare, vom returna 0.

SimpleXML ne permite să accesăm elementele xml într-un mod orientat pe obiecte. Prima dată când trebuie să facem acest lucru este să verificăm dacă avem o eroare în răspunsul nostru.

 dacă $ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> canal-> descriere), "error" TRUE; // fără răspuns de la serverul de vreme

Acest bloc if-else încearcă să încarce răspunsul de la $ query_url în $ xml folosind metoda SimpleXML simplexml_load_file.

Dacă primim un răspuns, verificăm channel-> descriere câmpul xml returnat pentru șirul de eroare. De exemplu, încercați următoarea adresă URL care va afișa o eroare. Vizualizați sursa pentru a vedea channel-> descriere câmp care conține șirul "eroare".

Yahoo! Vremea - Pagina de eroare

Dacă nu primim un răspuns (altceva), înseamnă că trebuie să existe o problemă care să ajungă la Yahoo! servicii și servicii $ eroare este setat la TRUE. Aceasta are grijă de ambele posibilități de eroare: date nevalide sau conexiune necorespunzătoare.

Extragerea datelor meteo

Dacă nu s-au găsit erori, putem extrage datele meteorologice relevante din xml.

Mai întâi, să revedem ce arată datele de răspuns bun:

    Yahoo! Vremea - Londra, GB       Condiții pentru Londra, GB la 3:49 am BST 51.51 -0,13 http://us.rd.yahoo.com/dailynews/rss/weather/London__GB/*http://weather.yahoo.com/forecast/UKXX0085_c.html Tue, 16 Aug 2011 3:49 am BST   
Condițiile actuale:
Târg, 15 ° C

Prognoza meteo:
Tue - Parțial înorat. Înaltă: 21 Scăzut: 13
Sâmbătă - Parțial înorat. Înaltă: 23 Scăzut: 14

Prognoza completa la Yahoo! Vreme

(furnizat de The Weather Channel)
]]>

Să luăm valoarea orașului (Londra) care este stocată în channel-> yweather: localizare face> oraș atribut.

Rețineți că antetul RSS pentru răspunsul xml definește două spații de nume: yweather și geo. Pentru a obține atributul orașului, trebuie să accesăm yweather spațiu de nume ca un copil al canal. Argumentul TRUE pentru copii spune SimpleXML că yweather este un prefix de element ca în yweather: locație.

 $ vreme ['city'] = $ xml-> canal-> copii ('yweather', TRUE) -> locație-> atribute () -> oraș;

Folosind aceeași tehnică, putem obține valorile pentru temperatura și condițiile actuale (text):

 $ vreme ['temp'] = $ xml-> canal-> element-> copii ('yweather', TRUE) -> condiție-> atribute () -> temp; $ vreme ['conditii'] = $ xml-> canal-> element-> copii ('yweather', TRUE) -> condition-> atribute () -> text;

Obținerea adresei URL a pictogramei meteo

channel-> item-> descriere elementul conține cod HTML inclus în etichete CDATA. Nu putem accesa etichetele și atributele HTML direct folosind SimpleXML, așa că mai întâi primim datele de descriere:

 $ description = $ xml-> canal-> element-> descriere;

Apoi folosim preg_match și o expresie regulată pentru a extrage totul între src =“ și " din eticheta img.

 $ imgpattern = '/src="(.*?)"/i'; preg_match ($ imgpattern, $ description, meciuri $); $ vreme ['icon_url'] = $ meciuri [1];

Avem toate datele meteorologice pe care le-am primit, ca să le putem returna get_current_weather_display funcția de formatare conform pasului 3.


Pasul 5 Activați și testați

Activați plugin-ul în tabloul de bord WordPress. Creați un post sau o pagină nouă și introduceți codul scurt [get_current_weather woeid = '44418' tempscale = 'c'] în zona de conținut. Vizualizați postarea sau pagina și ar trebui să vedeți condițiile meteorologice pentru Londra.

Acum vom testa eticheta șablonului. Deschide footer.php fișier în dosarul temei site-ului dvs. Adăugați eticheta șablonului get_current_weather_template_tag ('44418', 'c') imediat după

etichetă. Actualizați-vă pagina și ar trebui să vedeți condițiile de vreme pentru Londra în subsolul paginii.


Adiţional

Fa-o destul

Să adăugăm un mic CSS la style.css fișier în dosarul tematic.

 .gcw_weather_panel background-color: # B1E7FB; frontieră: 1px solid # 4BCBFA; padding: 10px; lățime: 180px;  .gcw_weather_panel * marja: 0 auto; text-align: centru; afișare: bloc; 

Ieșirea dvs. de vreme ar trebui să arate acum:

La fel de multe ca tine

Deoarece fiecare etichetă de cod scurt sau șablon emite date discrete, puteți obține cât mai multe ieșiri meteorologice diferite, după cum doriți, și toate pe aceeași pagină.

Du-te!

Dacă vă uitați la xml returnat de la Yahoo !, veți observa că am folosit foarte puține dintre datele disponibile. Există multe alte câmpuri și atribute, inclusiv date de prognoză. O imbunatatire imediata de realizat ar fi sa aratati regiunea si tara orasului pe care il afisati. De asemenea, puteți arăta umiditatea, viteza vântului și multe altele.

A se distra!


Link-uri utile

  • Yahoo! Vreme
  • SimpleXML
  • Serviciul de căutare WOLID
  • Scrierea unui plug-in WordPress
  • WordPress Shortcodes
  • WordPress Tag-uri șablon
Cod