Crear un complemento de condiciones meteorológicas usando Yahoo y SimpleXML

En este tutorial, aprenderá cómo crear un complemento simple que use la biblioteca SimpleXML incorporada de PHP para acceder a Yahoo! Servicio Meteorológico. Las condiciones meteorológicas actuales se mostrarán con un código abreviado o una etiqueta de plantilla.


Yahoo! Clima

Yahoo! proporciona una fuente de información RSS / XML gratuita que devuelve datos de condiciones actuales (y pronóstico) para una ubicación determinada. Aquí está la url de alimentación para Londres, GB:

Yahoo! Clima

Verás algo como esto:

Vea la fuente de esa página y encontrará una mina de oro de datos meteorológicos en formato XML. Podemos analizar estos datos utilizando la biblioteca SimpleXML de PHP, extraer lo que necesitamos y mostrarlo en nuestras publicaciones, páginas y archivos de plantilla de WordPress..

WOEIDs

Yahoo! utiliza los WOEID para identificar de manera única entidades geográficas como las ciudades, así como puntos de interés específicos, como Disneyland y la Torre Eiffel. Consultando el Yahoo! El servicio meteorológico que utiliza WOEID es extremadamente preciso ya que cada ubicación tiene un WOEID único. Por ejemplo, hay 36 lugares llamados París en el mundo, pero cada uno tiene un WOEID único..

Puede utilizar este servicio de búsqueda de WOEID para encontrar una coincidencia de ubicación exacta.

En la URL anterior, los dos parámetros utilizados son w para WOEID yu para la escala de temperatura (grados Celsius o Fahrenheit). Usaremos ambos en nuestro plugin..


Paso 1 Configurar el complemento

La carpeta del complemento de WordPress se encuentra en su carpeta de instalación de WordPress en wp-content / plugins. Crea una carpeta dentro de la carpeta de complementos. Llamémoslo obtener el clima actual. Ahora, crea el archivo del complemento. Llamémoslo get_current_weather.php La ruta a su archivo de complemento ahora debería ser: wp-content / plugins / get-current-weather / get_current_weather.php

Cada complemento de WordPress necesita información de encabezado para que WordPress pueda identificarlo y ponerlo a disposición en su página de complemento del panel. Coloque este código en la parte superior de su archivo de complemento y guárdelo.

  

Puede editar esta información según sus propios requisitos.

Ahora, vaya a su panel de WordPress y seleccione el menú Complementos. Verás el plugin listado así:

No lo actives todavía.


Paso 2 Código corto y etiqueta de plantilla

Los códigos cortos de WordPress te permiten colocar la salida del complemento en tus publicaciones y páginas. Las etiquetas de plantilla le permiten colocar la salida del complemento en sus archivos de plantilla (encabezado, pie de página, barra lateral, etc.) Necesitamos definir dos funciones en nuestro complemento, una para el código corto y otra para la etiqueta de la plantilla. Ambos devolverán los mismos datos meteorológicos..

La etiqueta de la plantilla

La etiqueta de la plantilla se utilizará como: get_current_weather_template_tag (woeid, tempscale), donde woeid es el WOEID para una ubicación y la escala de temperatura es la escala de temperatura requerida, grados Celsius o Fahrenheit. Por lo tanto, para obtener los datos meteorológicos de Londres, GB en grados Celsius, usaríamos la etiqueta de plantilla get_current_weather_template_tag ('44418', 'c').

Coloque el siguiente código en su archivo de complemento:

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

Esta función acepta el WOEID y el tempscale. Notará que la escala de temperatura tiene un parámetro predeterminado de c, en caso de que no esté definido y por conveniencia. La función hace eco de una llamada a otra función. get_current_weather_display Lo que nos proporcionará los datos meteorológicos formateados..

El shortcode

El código abreviado devolverá los mismos datos meteorológicos formateados que la etiqueta de la plantilla, con un poco más de trabajo. El código corto de WordPress se utilizará en publicaciones y páginas como esta: [get_current weather woeid = "tempscale ="]. Por lo tanto, para obtener los datos meteorológicos de Londres, GB en grados Celsius, usaríamos el código corto [get_current_weather woeid = '44418' tempscale = 'c'). Debido a que estamos usando un código abreviado, debemos informar a WordPress al respecto. Para ello utilizamos la función de WordPress. add_shortcode.

Coloque el siguiente código en su archivo de complemento:

 add_shortcode ('get_current_weather', 'get_current_weather_shortcode');

El primer parametro get_current_weather define el nombre del shortcode que usaremos en nuestras publicaciones y páginas. El segundo parametro get_current_weather_shortcode es el nombre de la función que es llamada por el shortcode.

Aquí está la función llamada por get_current_weather. Coloque el siguiente código en su archivo de complemento:

 función get_current_weather_shortcode ($ atts) $ args = shortcode_atts (array ('woeid' =>,, tempscale '=>' c '), $ atts); $ args [' tempscale '] = ($ args [' tempscale ' ] == 'c')? 'c': 'f'; devolver get_current_weather_display ($ args ['woeid'], $ args ['tempscale']);

La función de código corto explicada

Nuestra función shortcode get_current_weather_shortcode acepta los atributos de shortcode contenidos en el $ atts formación. Estos atributos deben ser nuestro WOEID y tempscale. Pero ¿y si no lo son? La API de código corto nos proporciona una manera de proporcionar valores predeterminados para estos atributos esperados, la shortcode_atts función.

Shortcode_atts tiene dos argumentos. El primero es una matriz de pares nombre => valor. Nombre es el atributo de código corto esperado y valor es su valor predeterminado. Si el nombre no está presente en $ atts, se crea con el valor predeterminado. Esto nos permite asegurarnos de que nuestra función tenga los atributos correctos con los valores predeterminados.

Pero, ¿y si en lugar de c o f, se pasó otro valor para la escala temporal? Ahí es donde entra en juego la siguiente afirmación..

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

Esta declaración es nuestra garantía de que c o f se usa para la escala de temperatura. Utiliza el operador ternario de PHP y es funcionalmente equivalente a:

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

Podría usar cualquiera de los dos, pero el operador ternario es más elegante para este propósito..

Finalmente, los argumentos pasan a la get_current_weather_display función.


Paso 3 Levantamiento de luz

Aquí esta la get_current_weather_display función que es llamada tanto por el código corto como por la etiqueta de plantilla.

Coloque el siguiente código en su archivo de complemento:

 function get_current_weather_display ($ woeid, $ tempscale) $ weather_panel = '
'; if ($ weather = get_current_weather_data ($ woeid, $ tempscale)) $ weather_panel. = ''. $ clima ['ciudad']. ''; $ weather_panel. = ''. $ tiempo ['temp']. 'я'. strtoupper ($ tempscale). ''; $ weather_panel. = ''; $ weather_panel. = ''. $ clima ['condiciones']. ''; else // sin datos meteorológicos $ weather_panel. = 'No hay datos del clima!'; $ weather_panel. = '
'; devuelve $ weather_panel;

Esta función es realmente solo para formatear los datos meteorológicos devueltos desde get_current_weather_data (Etapa 4). Si no se devuelven datos meteorológicos, aparece el mensaje "¡Sin datos meteorológicos!" el mensaje es devuelto.


Paso 4 levantamiento pesado

Aquí esta la get_current_weather_data función que es llamada por el get_current_ weather_display funciona en el paso 3

Coloque el siguiente código en su archivo de complemento:

 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'); // respuesta del servidor pero no hay datos meteorológicos para woeid else $ error = TRUE; // no hay respuesta del servidor meteorológico if (! $ Error) $ weather ['city'] = $ xml-> channel-> children ('yweather', TRUE) -> location-> attributes () -> ciudad; $ weather ['temp'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> condition-> attributes () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> condition-> attributes () -> text; $ description = $ xml-> channel-> item-> description; $ imgpattern = '/src="(.*?)"/i'; preg_match ($ imgpattern, $ description, $ coincidencias); $ weather ['icon_url'] = $ coincidencias [1]; devuelve $ tiempo;  devuelve 0; 

Contactando a Yahoo! Clima Y Comprobando La Respuesta

los get_current_weather_data La función utiliza SimpleXML para consultar el Yahoo! Servicio meteorológico utilizando el WOEID y la temperatura temporal dados. Si hay un error, devolvemos 0.

SimpleXML nos permite acceder a elementos xml de una manera orientada a objetos. La primera vez que necesitamos hacer esto es verificar si tenemos un error en nuestra respuesta..

 if ($ xml = simplexml_load_file ($ query_url)) $ error = strpos (strtolower ($ xml-> channel-> description), 'error'); // respuesta del servidor pero no hay datos meteorológicos para woeid else $ error = VERDADERO; // no hay respuesta del servidor meteorológico

Este bloque if-else intenta cargar la respuesta de $ query_url en $ xml usando el método SimpleXML simplexml_load_file.

Si recibimos una respuesta, comprobamos la canal-> descripción campo del xml devuelto para la cadena "error". Por ejemplo, intente la siguiente url que devolverá un error. Ver la fuente para ver el canal-> descripción campo que contiene la cadena "error".

Yahoo! Tiempo - Página de error

Si no recibimos una respuesta (la otra cosa), significa que debe haber un problema para llegar a Yahoo! servicio y $ error se establece en VERDADERO. Se ocupa de las dos posibilidades de error: datos no válidos o conexión incorrecta.

Extraer datos del clima

Si no se encontraron errores, podemos extraer los datos meteorológicos relevantes del xml.

Primero, revisemos cómo se ven los datos de buena respuesta:

    Yahoo! Tiempo - Londres, GB       Condiciones para Londres, GB a las 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 Martes, 16 de agosto de 2011 3:49 am BST   
Condiciones actuales:
Justo, 15 c

Pronóstico:
Mar - parcialmente nublado Alta: 21 Baja: 13
Mié - parcialmente nublado. Alto: 23 Bajo: 14

Pronóstico completo en Yahoo! Clima

(proporcionado por The Weather Channel)
]]>

Vamos a tomar el valor de la ciudad (Londres) que se almacena en el canal-> yweather: ubicación-> ciudad atributo.

Tenga en cuenta que el encabezado RSS para la respuesta xml define dos espacios de nombres: yweather y geo. Para obtener el atributo de ciudad, necesitamos acceder a la yweather espacio de nombres como un niño de canal. El argumento VERDADERO para los niños le dice a SimpleXML que yweather es un elemento prefijo como en yweather: ubicación.

 $ weather ['city'] = $ xml-> channel-> children ('yweather', TRUE) -> location-> attributes () -> city;

Usando la misma técnica, podemos obtener los valores para la temperatura y condiciones actuales (texto):

 $ weather ['temp'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> condition-> attributes () -> temp; $ weather ['conditions'] = $ xml-> channel-> item-> children ('yweather', TRUE) -> condition-> attributes () -> text;

Obtener la URL del icono del tiempo

los canal-> item-> descripción El artículo contiene HTML incluido en las etiquetas CDATA. No podemos acceder a las etiquetas y atributos HTML directamente usando SimpleXML, así que primero obtenemos los datos de la descripción:

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

Luego usamos preg_match y una expresión regular para extraer todo entre src = " y " de la etiqueta img.

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

Tenemos todos los datos meteorológicos para los que vinimos, por lo que podemos devolverlos a la get_current_weather_display Función para formatear según el Paso 3.


Paso 5 Activar y probar

Activa el plugin en tu panel de WordPress. Crea una nueva publicación o página e inserta el código corto [get_current_weather woeid = '44418' tempscale = 'c'] en el área de contenido. Ver la publicación o la página y debería ver las condiciones meteorológicas de Londres.

Ahora probaremos la etiqueta de la plantilla. Abre el footer.php archivo en la carpeta de tema de su sitio. Añadir la etiqueta de la plantilla get_current_weather_template_tag ('44418', 'c') justo después de la

etiqueta. Actualice su página y verá las condiciones meteorológicas de Londres en el pie de página..


Adicional

Hazlo bonito

Vamos a añadir un poco de CSS a la style.css archivo en su carpeta de temas.

 .gcw_weather_panel background-color: # B1E7FB; frontera: 1px sólido # 4BCBFA; relleno: 10px; ancho: 180px;  .gcw_weather_panel * margen: 0 auto; text-align: center; bloqueo de pantalla; 

Tu salida del tiempo ahora debería verse así:

Tantos como quieras

Debido a que cada código de shortcode o etiqueta de plantilla genera datos discretos, puede tener tantas salidas de clima diferentes como desee, y todas en la misma página.

Ve a por ello!

Si observa el xml devuelto por Yahoo !, notará que hemos usado muy poco de los datos disponibles. Hay muchos otros campos y atributos, incluidos los datos de pronóstico. Una mejora inmediata para hacer sería mostrar la región y el país de la ciudad que está mostrando. También puedes mostrar la humedad, la velocidad del viento y mucho más..

Que te diviertas!


Enlaces útiles

  • Yahoo! Clima
  • SimpleXML
  • Servicio de búsqueda WOEID
  • Escribiendo un Plugin de WordPress
  • WordPress Shortcodes
  • Etiquetas de plantillas de WordPress