Maak een plug-in voor weersomstandigheden met Yahoo en SimpleXML

In deze zelfstudie leert u hoe u een eenvoudige plug-in maakt die PHP's ingebouwde SimpleXML-bibliotheek gebruikt om toegang te krijgen tot Yahoo! Weersdienst. De huidige weersomstandigheden worden weergegeven met een shortcode of een sjabloontag.


Yahoo! Weer

Yahoo! biedt een gratis RSS / XML-weerfeed die huidige condities (en voorspelling) gegevens voor een bepaalde locatie retourneert. Hier is de feed-URL voor Londen, GB:

Yahoo! Weer

Je ziet zoiets als dit:

Bekijk de bron van die pagina en je vindt een goudmijn van weergegevens in XML-formaat. We kunnen deze gegevens ontleden met PHP's SimpleXML-bibliotheek, extraheren wat we nodig hebben en deze weergeven in onze WordPress-berichten, -pagina's en -sjabloonbestanden.

WOEIDs

Yahoo! gebruikt WOEID's om op unieke wijze geografische entiteiten zoals steden te identificeren, evenals specifieke aandachtspunten zoals Disneyland en de Eiffeltoren. Querying the Yahoo! weersdienst met behulp van WOEID's is uiterst nauwkeurig, omdat elke locatie een unieke WOEID heeft. Er zijn bijvoorbeeld 36 plaatsen met de naam Parijs in de wereld, maar elk heeft een unieke WOEID.

U kunt deze WOEID Lookup-service gebruiken om een ​​exacte locatieaanpassing te vinden.

In de bovenstaande URL zijn de twee gebruikte parameters w voor WOEID en u voor temperatuurschaal (Celsius of Fahrenheit). We zullen ze allebei gebruiken in onze plug-in.


Stap 1 Stel de plug-in in

De map WordPress-plug-in bevindt zich in uw WordPress installatiemap op wp-content / plugins. Maak een map in de map met plug-ins. Laten we het noemen get-huidige-weather. Maak nu zelf het plugin-bestand aan. Laten we het noemen get_current_weather.php Het pad naar uw plugin-bestand zou nu moeten zijn: wp-content / plugins / get-current-weather / get_current_weather.php

Elke WordPress-plugin heeft wat header-informatie nodig, zodat WordPress het kan identificeren en beschikbaar kan maken op de plugin-pagina van je dashboard. Plaats deze code bovenaan uw plugin-bestand en sla deze op.

  

U kunt deze informatie bewerken volgens uw eigen vereisten.

Ga nu naar uw WordPress-dashboard en selecteer het menu Plug-ins. De plug-in wordt als volgt weergegeven:

Activeer het nog niet.


Stap 2 Shortcode en sjabloontag

Met WordPress-shortcodes kunt u plugin-uitvoer in uw berichten en pagina's plaatsen. Met sjabloontags kunt u pluginuitvoer in uw sjabloonbestanden plaatsen (koptekst, voettekst, zijbalk, enzovoort). We moeten twee functies definiëren in onze plug-in, één voor de shortcode en één voor de sjabloontag. Beide keren dezelfde weergegevens terug.

De sjabloontag

De sjabloontag zal worden gebruikt als: get_current_weather_template_tag (woeid, tempscale), waarbij woeid de WOEID is voor een locatie en temp-schaal de vereiste temperatuurschaal is, Celsius of Fahrenheit. Dus, om de weergegevens voor Londen, GB in graden Celsius te krijgen, zouden we de sjabloon-tag gebruiken get_current_weather_template_tag ('44418', 'c').

Plaats de volgende code in uw plugin-bestand:

 functie get_current_weather_template_tag ($ woeid = ", $ tempscale = 'c') echo get_current_weather_display ($ woeid, $ tempscale);

Deze functie accepteert de WOEID en de tempscale. U ziet dat de tempscale een standaardparameter van c heeft, voor het geval deze niet is gedefinieerd en voor het gemak. De functie echoot een oproep naar een andere functie get_current_weather_display die ons van de geformatteerde weergegevens zal voorzien.

De shortcode

De shortcode retourneert dezelfde opgemaakte weergegevens als de sjabloontag, met iets meer werk. De WordPress shortcode wordt gebruikt in berichten en pagina's zoals deze: [get_current weather woeid = "tempscale ="]. Dus, om de weergegevens voor Londen, GB in graden Celsius te krijgen, zouden we de shortcode gebruiken [get_current_weather woeid = '44418' tempscale = 'c'). Omdat we een shortcode gebruiken, moeten we WordPress erover vertellen. Om dat te doen gebruiken we de WordPress-functie add_shortcode.

Plaats de volgende code in uw plugin-bestand:

 add_shortcode ('get_current_weather', 'get_current_weather_shortcode');

De eerste parameter get_current_weather definieert de naam van de shortcode die we zullen gebruiken in onze berichten en pagina's. De tweede parameter get_current_weather_shortcode is de naam van de functie die wordt aangeroepen door de shortcode.

Dit is de functie met de naam get_current_weather. Plaats de volgende code in uw plugin-bestand:

 functie get_current_weather_shortcode ($ atts) $ args = shortcode_atts (array ('woeid' => ", 'tempscale' => 'c'), $ atts); $ args ['tempscale'] = ($ args ['tempscale'] ] == 'c')? 'c': 'f'; return get_current_weather_display ($ args ['woeid'], $ args ['tempscale']);

De Shortcode-functie uitgelegd

Onze shortcode-functie get_current_weather_shortcode accepteert shortcode-attributen in de $ atts matrix. Deze kenmerken moeten onze WOEID en tijdelijke schaal zijn. Maar wat als ze dat niet zijn? De shortcode-API biedt ons een manier om standaardwaarden voor deze verwachte kenmerken te bieden, de shortcode_atts functie.

Shortcode_atts neemt twee argumenten. De eerste is een array van naam => waardeparen. Naam is het verwachte kenmerk shortcode en waarde is de standaardwaarde. Als naam niet voorkomt in $ atts, wordt deze gemaakt met de standaardwaarde. Hierdoor kunnen we ervoor zorgen dat onze functie de juiste kenmerken heeft met standaardwaarden.

Maar wat als in plaats van c of f een andere waarde werd doorgegeven voor de tijdelijke schaal? Dat is waar de volgende verklaring in het spel komt.

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

Deze verklaring is onze garantie dat c of f wordt gebruikt voor de tijdelijke schaal. Het maakt gebruik van de PHP ternaire operator en functioneel gelijk aan:

 if ($ args ['tempscale'] == 'c') $ args ['tempscale'] = 'c';  else $ args ['tempscale'] = 'f'; 

U kunt een van beide gebruiken, maar de ternaire operator is eleganter voor dit doel.

Ten slotte worden de argumenten doorgegeven aan de get_current_weather_display functie.


Stap 3 Licht hijsen

Hier is de get_current_weather_display functie die wordt aangeroepen door zowel de shortcode als de sjabloontag.

Plaats de volgende code in uw plugin-bestand:

 functie get_current_weather_display ($ woeid, $ tempscale) $ weather_panel = '
'; if ($ weather = get_current_weather_data ($ woeid, $ tempscale)) $ weather_panel. = ''. $ weer ['stad']. ''; $ weather_panel. = ''. $ weer ['temp']. 'я'. strtoupper ($ tempscale). ''; $ weather_panel. = ''; $ weather_panel. = ''. $ weer ['voorwaarden']. ''; else // geen weergegevens $ weather_panel. = 'Geen weergegevens!'; $ weather_panel. = '
'; return $ weather_panel;

Deze functie is eigenlijk alleen voor het formatteren van de weergegevens die worden geretourneerd get_current_weather_data (Stap 4). Als er geen weergegevens worden geretourneerd, zijn de "Geen weergegevens!" bericht wordt geretourneerd.


Stap 4 Zwaar hijsen

Hier is de get_current_weather_data functie die wordt aangeroepen door de get_current_ weather_display functie in stap 3

Plaats de volgende code in uw plugin-bestand:

 functie get_current_weather_data ($ woeid, $ tempscale) $ query_url = 'http://weather.yahooapis.com/forecastrss?w='. $ woeid. '& u ='. $ Tempscale; if ($ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> channel-> description), 'error'); // serverreactie maar geen weergegevens voor woeid else $ error = WAAR; // geen reactie van weerserver als (! $ Fout) $ weer ['stad'] = $ xml-> kanaal-> kinderen ('yweather', TRUE) -> locatie-> attributen () -> stad; $ weer ['temp'] = $ xml-> kanaal-> item-> kinderen ('yweather', TRUE) -> voorwaarde-> attributen () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> voorwaarde-> attributen () -> tekst; $ description = $ xml-> channel-> item-> description; $ imgpattern = '/src="(.*?)"/i'; preg_match ($ imgpattern, $ description, $ matches); $ weather ['icon_url'] = $ overeenkomsten [1]; return $ weer;  retourneer 0; 

Contact opnemen met Yahoo! Weer en controle van de respons

De get_current_weather_data functie gebruikt SimpleXML om de Yahoo! weerservice met behulp van de gegeven WOEID en temp-schaal. Als er een fout is, geven we 0 terug.

SimpleXML stelt ons in staat om xml-items te benaderen op een object-georiënteerde manier. De eerste keer dat we dit moeten doen, is controleren of we een fout hebben gemaakt in onze reactie.

 if ($ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> channel-> description), 'error'); // serverreactie maar geen weergegevens voor woeid else $ error = TRUE; // geen reactie van weerserver

Dit if-else-blok probeert het antwoord van $ query_url in $ xml te laden met behulp van de SimpleXML-methode simplexml_load_file.

Als we een reactie krijgen, controleren we de channel-> beschrijving veld van de geretourneerde xml voor de tekenreeks "error". Probeer bijvoorbeeld de volgende URL die een fout zal retourneren. Bekijk de bron om het te zien channel-> beschrijving veld dat de string "error" bevat.

Yahoo! Weer - Foutpagina

Als we geen antwoord krijgen (het andere), betekent dit dat er een probleem moet zijn bij het bereiken van Yahoo! service en $ error is ingesteld op TRUE. Dat zorgt voor beide foutmogelijkheden: ongeldige gegevens of slechte verbindingen.

Extractie van weersgegevens

Als er geen fouten zijn gevonden, kunnen we de relevante weergegevens extraheren uit de XML.

Laten we eerst eens bekijken hoe goede reactiegegevens eruitzien:

    Yahoo! Weer - Londen, GB       Voorwaarden voor Londen, GB om 3:49 uur 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 15:49 BST   
De huidige omstandigheden:
Redelijk, 15 C

voorspelling:
Di - gedeeltelijk bewolkt. Hoog: 21 Laag: 13
Woe - half bewolkt. Hoog: 23 Laag: 14

Volledige voorspelling bij Yahoo! Weer

(geleverd door The Weather Channel)
]]>

Laten we de waarde van de stad (Londen) pakken die is opgeslagen in de channel-> yweather: locatie-> plaats attribuut.

Merk op dat de RSS-header voor het xml-antwoord twee namespaces definieert: yweather en geo-. Om het attribuut city te krijgen, hebben we toegang nodig tot yweather naamruimte als een kind van kanaal. Het TRUE-argument voor kinderen vertelt SimpleXML dat yweather is een itemprefix als in yweather: location.

 $ weer ['stad'] = $ xml-> kanaal-> kinderen ('yweather', TRUE) -> locatie-> attributen () -> stad;

Met dezelfde techniek kunnen we de waarden voor de huidige temperatuur en condities (tekst) krijgen:

 $ weer ['temp'] = $ xml-> kanaal-> item-> kinderen ('yweather', TRUE) -> voorwaarde-> attributen () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> voorwaarde-> attributen () -> tekst;

De URL van het weerpictogram ophalen

De channel-> item-> beschrijving item bevat HTML ingesloten in CDATA-tags. We hebben geen directe toegang tot de HTML-tags en -attributen met SimpleXML, dus we krijgen eerst de beschrijvingsgegevens:

 $ description = $ xml-> channel-> item-> description;

Vervolgens gebruiken we preg_match en een reguliere expressie om alles tussen te extraheren src =" en " van de img-tag.

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

We hebben alle weergegevens waarvoor we zijn gekomen, zodat we deze kunnen terugsturen naar de get_current_weather_display functie voor formatteren vanaf stap 3.


Stap 5 Activeer en test

Activeer de plug-in in uw WordPress-dashboard. Maak een nieuwe post of pagina en plaats de shortcode [get_current_weather woeid = '44418' tempscale = 'c'] in het inhoudsgebied. Bekijk de post of pagina en je zou de weersomstandigheden voor Londen moeten zien.

Nu testen we de sjabloontag. Open de footer.php bestand in de themamap van uw site. Voeg de sjabloontag toe get_current_weather_template_tag ('44418', 'c') net na de

label. Ververs je pagina en je zou de weersomstandigheden voor Londen in het voettekstje moeten zien.


Extra

Make It Pretty

Laten we een beetje CSS toevoegen aan de style.css bestand in uw themamap.

 .gcw_weather_panel background-colour: # B1E7FB; rand: 1px vast # 4BCBFA; opvulling: 10px; breedte: 180 px;  .gcw_weather_panel * margin: 0 auto; text-align: center; weergave: blok; 

Je weersoutput zou er nu als volgt uit moeten zien:

Zo veel als je wilt

Omdat elke shortcode of sjabloontag discrete gegevens uitvoert, kunt u zoveel verschillende weeroutputs hebben als u maar wilt, en allemaal op dezelfde pagina.

Ga ervoor!

Als je kijkt naar de xml geretourneerd door Yahoo !, zul je merken dat we heel weinig van de beschikbare gegevens hebben gebruikt. Er zijn veel andere velden en attributen, inclusief prognosegegevens. Een onmiddellijke verbetering om te maken zou zijn om de regio en het land van de stad die u weergeeft te laten zien. Je kunt ook vochtigheid, windsnelheid en nog veel meer laten zien.

Veel plezier!


handige links

  • Yahoo! Weer
  • SimpleXML
  • WOEID Lookup Service
  • Een WordPress-plug-in schrijven
  • WordPress Shortcodes
  • WordPress Sjabloontags