Créer un plugin sur les conditions météorologiques avec Yahoo et SimpleXML

Dans ce didacticiel, vous apprendrez à créer un plug-in utilisant la bibliothèque SimpleXML intégrée à PHP pour accéder à Yahoo! Service météorologique. Les conditions météorologiques actuelles seront affichées avec un tag shortcode ou template..


Yahoo! Météo

Yahoo! fournit un flux météo RSS / XML gratuit qui renvoie les conditions actuelles (et les prévisions) pour un lieu donné. Voici l'URL du flux pour London, GB:

Yahoo! Météo

Vous verrez quelque chose comme ça:

Voir la source de cette page et vous trouverez une mine d'or de données météorologiques au format XML. Nous pouvons analyser ces données à l'aide de la bibliothèque SimpleXML de PHP, extraire ce dont nous avons besoin et les afficher dans nos publications, pages et modèles WordPress.

WOEIDs

Yahoo! utilise WOEID pour identifier de manière unique des entités géographiques telles que des villes ainsi que des points d’intérêt spécifiques tels que Disneyland et la Tour Eiffel. Interroger Yahoo! Le service météo avec WOEID est extrêmement précis puisque chaque site possède un WOEID unique. Par exemple, il y a 36 lieux nommés Paris dans le monde mais chacun a un WOEID unique..

Vous pouvez utiliser ce service de recherche WOEID pour trouver un emplacement exact.

Dans l'URL ci-dessus, les deux paramètres utilisés sont w pour WOEID et u pour l'échelle de température (Celsius ou Fahrenheit). Nous allons utiliser les deux dans notre plugin.


Étape 1 Configurer le plugin

Le dossier du plugin WordPress se trouve dans votre dossier d’installation WordPress à wp-content / plugins. Créez un dossier dans le dossier plugins. Appelons ça obtenir le temps actuel. Maintenant, créez le fichier de plugin lui-même. Appelons ça get_current_weather.php Le chemin d'accès à votre fichier de plugin devrait maintenant être: wp-content / plugins / get-current-weather / get_current_weather.php

Chaque plugin WordPress nécessite des informations d'en-tête afin que WordPress puisse l'identifier et le rendre disponible sur votre page de plugin de tableau de bord. Placez ce code en haut de votre fichier plugin et enregistrez-le..

  

Vous pouvez modifier cette information selon vos propres exigences.

Maintenant, allez sur votre tableau de bord WordPress et sélectionnez le menu Plugins. Vous verrez le plugin répertorié comme ceci:

Ne l'activez pas pour l'instant.


Étape 2 Etiquette de code court et de modèle

Les codes courts WordPress vous permettent de placer la sortie du plugin dans vos publications et vos pages. Les balises de modèle vous permettent de placer la sortie du plugin dans vos fichiers de modèle (en-tête, pied de page, barre latérale, etc.). Nous devons définir deux fonctions dans notre plugin, une pour le shortcode et une pour la balise de modèle. Les deux renverront les mêmes données météorologiques.

L'étiquette de modèle

La balise template sera utilisée comme: get_current_weather_template_tag (woeid, tempscale), où woeid est le WOEID pour un emplacement et tempo est l’échelle de température requise, Celsius ou Fahrenheit. Donc, pour obtenir les données météorologiques pour Londres, GB en degrés Celsius, nous utiliserions la balise template get_current_weather_template_tag ('44418', 'c').

Placez le code suivant dans votre fichier de plugin:

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

Cette fonction accepte le WOEID et le tempscale. Vous remarquerez que tempscale a un paramètre par défaut de c, juste au cas où il ne serait pas défini et pour plus de commodité. La fonction renvoie un appel à une autre fonction get_current_weather_display qui nous fournira les données météorologiques formatées.

Le Shortcode

Le shortcode renverra les mêmes données météorologiques formatées que la balise de modèle, avec un peu plus de travail. Le shortcode WordPress sera utilisé dans les posts et les pages comme ceci: [get_current weather woeid = "tempscale ="]. Donc, pour obtenir les données météorologiques pour Londres, GB en degrés Celsius, nous utiliserions le shortcode [get_current_weather woeid = '44418' tempscale = 'c'). Comme nous utilisons un shortcode, nous devons en informer WordPress. Pour ce faire, nous utilisons la fonction WordPress add_shortcode.

Placez le code suivant dans votre fichier de plugin:

 add_shortcode ('get_current_weather', 'get_current_weather_shortcode');

Le premier paramètre get_current_weather définit le nom du shortcode que nous utiliserons dans nos publications et pages. Le second paramètre get_current_weather_shortcode est le nom de la fonction appelée par le shortcode.

Voici la fonction appelée par get_current_weather. Placez le code suivant dans votre fichier de plugin:

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

La fonction Shortcode expliquée

Notre fonction shortcode get_current_weather_shortcode accepte les attributs de shortcode contenus dans le $ atts tableau. Ces attributs devraient être notre WOEID et notre échelle de temps. Mais si ce n'est pas le cas? L’API de shortcode nous permet de fournir des valeurs par défaut pour ces attributs attendus, le shortcode_atts une fonction.

Shortcode_atts prend deux arguments. Le premier est un tableau de paires nom => valeur. Nom est l'attribut de shortcode attendu et la valeur est sa valeur par défaut. Si name n'est pas présent dans $ atts, il est créé avec la valeur par défaut. Cela nous permet de nous assurer que notre fonction a les attributs corrects avec les valeurs par défaut.

Mais que se passerait-il si, au lieu de c ou de f, une autre valeur était transmise pour l'échelle de temps? C'est là que la prochaine déclaration entre en jeu.

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

Cette déclaration est notre garantie que c ou f est utilisé pour l'échelle de temps. Il utilise l'opérateur ternaire PHP et est fonctionnellement équivalent à:

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

Vous pouvez utiliser l'un ou l'autre, mais l'opérateur ternaire est plus élégant à cet effet.

Enfin, les arguments sont passés à la get_current_weather_display une fonction.


Étape 3 Levage léger

Ici se trouve le get_current_weather_display fonction qui est appelée à la fois par le shortcode et la balise template.

Placez le code suivant dans votre fichier de plugin:

 function get_current_weather_display ($ woeid, $ tempscale) $ weather_panel = '
'; if ($ weather = get_current_weather_data ($ woeid, $ tempscale)) $ weather_panel. = ''. $ météo ['ville']. ''; $ weather_panel. = ''. $ météo ['temp']. 'я'. strtoupper ($ tempscale). ''; $ weather_panel. = ''; $ weather_panel. = ''. $ météo ['conditions']. ''; else // pas de données météo $ weather_panel. = 'Pas de données météo!'; $ weather_panel. = '
'; return $ weather_panel;

Cette fonction sert uniquement à formater les données météorologiques renvoyées par get_current_weather_data (Étape 4). Si aucune donnée météorologique n'est renvoyée, le message "Aucune donnée météorologique!" le message est renvoyé.


Étape 4 Levage lourd

Ici se trouve le get_current_weather_data fonction appelée par le get_current_ weather_display fonction à l'étape 3

Placez le code suivant dans votre fichier de plugin:

 function 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'); // réponse du serveur mais pas de données météorologiques pour woeid else $ error TRUE; // pas de réponse du serveur météo if (! $ Error) $ weather ['city'] = $ xml-> channel-> enfants ('yweather', TRUE) -> location-> attributs () -> ville; $ weather ['temp'] = $ xml-> channel-> item-> enfants ('yweather', TRUE) -> condition-> attributs () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> enfants ('yweather', TRUE) -> condition-> attributs () -> texte; $ description = $ xml-> channel-> item-> description; $ imgpattern = '/src="(.*?)"/i'; preg_match ($ imgpattern, $ description, $ matches); $ weather ['icon_url'] = $ correspond à [1]; retour $ météo;  retourne 0; 

Contacter Yahoo! Météo et vérification de la réponse

le get_current_weather_data Cette fonction utilise SimpleXML pour interroger Yahoo! service météo utilisant le WOEID et l’échelle de temps donnés. S'il y a une erreur, on retourne 0.

SimpleXML nous permet d'accéder aux éléments XML d'une manière orientée objet. La première fois que nous devons faire cela est de vérifier si nous avons une erreur dans notre réponse.

 if ($ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> channel-> description), 'error'); // réponse du serveur mais pas de données météorologiques pour woeid else $ error = TRUE; // pas de réponse du serveur météo

Ce bloc if-else tente de charger la réponse de $ query_url dans $ xml en utilisant la méthode SimpleXML simplexml_load_file.

Si nous obtenons une réponse, nous vérifions la canal-> description champ du XML retourné pour la chaîne "erreur". Par exemple, essayez l’URL suivante qui renverra une erreur. Voir la source pour voir le canal-> description champ qui contient la chaîne "erreur".

Yahoo! Météo - Page d'erreur

Si nous n'obtenons pas de réponse (le reste), cela signifie qu'il doit y avoir un problème pour atteindre le compte Yahoo! service et $ error est défini sur TRUE. Cela prend en charge les deux possibilités d'erreur: données non valides ou mauvaise connexion.

Extraction de données météorologiques

Si aucune erreur n’a été trouvée, nous pouvons extraire les données météorologiques pertinentes du fichier XML..

Tout d'abord, revoyons à quoi ressemblent les bonnes données de réponse:

    Yahoo! Météo - Londres, GB       Conditions pour Londres, GB à 03h49, heure de Paris. 51,51 -0,13 http://us.rd.yahoo.com/dailynews/rss/weather/London__GB/*http://weather.yahoo.com/forecast/UKXX0085_c.html Mar., 16 août 2011 3:49 am BST   
Conditions actuelles:
Foire, 15 C

Prévoir:
Mar - Partiellement nuageux. Haute: 21 Basse: 13
Mer. Partiellement nuageux. Haute: 23 Basse: 14

Prévisions complètes sur Yahoo! Météo

(fourni par The Weather Channel)
]]>

Prenons la valeur de la ville (Londres) qui est stockée dans le channel-> yweather: emplacement-> ville attribut.

Notez que l'en-tête RSS de la réponse XML définit deux espaces de noms: beau temps et géo. Pour obtenir l'attribut city, nous devons accéder à la beau temps espace de noms en tant qu'enfant de canal. L'argument TRUE aux enfants indique à SimpleXML que beau temps est un préfixe d'objet comme dans temps: emplacement.

 $ weather ['city'] = $ xml-> channel-> enfants ('yweather', TRUE) -> location-> attributs () -> ville;

En utilisant la même technique, nous pouvons obtenir les valeurs de la température et des conditions actuelles (texte):

 $ weather ['temp'] = $ xml-> channel-> item-> enfants ('yweather', TRUE) -> condition-> attributs () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> enfants ('yweather', TRUE) -> condition-> attributs () -> texte;

Obtenir l'URL de l'icône météo

le channel-> item-> description L'élément contient du code HTML inclus dans les balises CDATA. Nous ne pouvons pas accéder directement aux balises et attributs HTML à l'aide de SimpleXML. Nous obtenons donc d'abord les données de description:

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

Ensuite, nous utilisons preg_match et une expression régulière pour extraire le tout entre src = " et " à partir du tag img.

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

Nous avons toutes les données météorologiques que nous avons obtenues pour pouvoir les restituer au get_current_weather_display fonction de formatage selon l'étape 3.


Étape 5 Activer et tester

Activez le plugin dans votre tableau de bord WordPress. Créez un nouveau message ou une nouvelle page et insérez le shortcode [get_current_weather woeid = '44418' tempscale = 'c'] dans la zone de contenu. Consultez le post ou la page et vous devriez voir les conditions météo de Londres.

Nous allons maintenant tester la balise template. Ouvrez le footer.php fichier dans le dossier de thème de votre site. Ajouter la balise template get_current_weather_template_tag ('44418', 'c') juste après

étiquette. Actualisez votre page et vous devriez voir les conditions météo de Londres dans le pied de page.


Additionnel

Le rendre joli

Ajoutons un peu de CSS à la style.css fichier dans votre dossier de thème.

 .gcw_weather_panel background-color: # B1E7FB; bordure: 1px solide # 4BCBFA; rembourrage: 10px; largeur: 180px;  .gcw_weather_panel * margin: 0 auto; text-align: center; bloc de visualisation; 

Votre météo devrait maintenant ressembler à ceci:

Autant que vous le souhaitez

Étant donné que chaque balise de code ou de modèle génère des données discrètes, vous pouvez avoir autant de sorties météo que vous le souhaitez, et toutes sur la même page..

Fonce!

Si vous regardez le xml renvoyé par Yahoo !, vous remarquerez que nous avons très peu utilisé les données disponibles. Il existe de nombreux autres champs et attributs, y compris les données prévisionnelles. Une amélioration immédiate à faire serait de montrer la région et le pays de la ville que vous affichez. Vous pouvez également afficher l'humidité, la vitesse du vent et beaucoup plus.

S'amuser!


Liens utiles

  • Yahoo! Météo
  • SimpleXML
  • Service de recherche WOEID
  • Écrire un plugin WordPress
  • WordPress Shortcodes
  • Balises de modèle WordPress