Ulzurrun de Asanza i Sàez

Tag: fechas

Contar artículos, comentarios y calcular algunas medias en WordPress

Parte del código de la función
Parte del código de la función

Nunca está de más mostrar algún que otro recuento de contenidos de nuestros blogs. Por ejemplo, el día del aniversario de Sumolari.com publiqué algunos números del blog, como el recuento de artículos, la media de artículos por dia, comentarios por artículo, etc. Cuando calculé estos números lo hice “a mano”, es decir, calculé yo mismo las medias y conté los días pasados, que aunque no lo hice de forma manual (para algo tenemos la calculadora), me llevó más tiempo del que habría necesitado el servidor para hacer unas simples operaciones matemáticas. Sin embargo no es necesario hacerlo manualmente, ya que podemos hacer que el servidor lo calcule, y es realmente fácil realizar el recuento de artículos, comentarios, días pasados desde el inicio del blog y medias artiméticas con estos datos.

Preparando la función básica

Antes de comenzar a contar artículos, comentarios y demás, crearemos una función básica, que acepte un parámetro y que con un switch le asigne el valor de lo que buscamos a la variable $value, que devolveremos más adelante. Como valores para el parámetro de la función, usaremos:

También deberemos cargar la variable $wpdb, que nos dará acceso a los nombres de las tablas de la Base de Datos de WordPress. Esta función la añadiremos al archivo functions.php de nuestro theme, aunque también podemos añadirla en un plugin. Después de este paso, tendremos un código similar a:

[php]
function datos($date) {
global $wpdb;

switch ($date) {
case ‘TOTPOST’:
break;
case ‘TOTDAYS’:
break;
case ‘POSTPERDAY’:
break;
case ‘TOTCOM’:
break;
case ‘COMPERPOST’:
break;
default:
$value = ”;
break;
}
return $value;
}
[/php]

Contar artículos y comentarios

Contar los artículos y los comentarios es bastante sencillo. Primero nos situaremos entre las líneas 5 y 6, y añadiremos:

[php]
$query = $wpdb->get_results(“SELECT * FROM $wpdb->posts WHERE post_status = ‘publish’ AND post_type = ‘post'”);
$value = count($query);
[/php]

Creamos la variable $query, que recibe los resultados de la consulta a la Base de Datos. Esta consulta busca en la tabla de artículos todos las filas que tengan por estado publish y por tipo post. Filtrando por la columna de estado logramos contar sólo el contenido público (fuera borradores y autoguardados). Filtrando por la columna de tipo eliminamos las páginas del resultado.

A continuación le asignamos a $value el recuento de los resultados de la consulta.

El caso de los comentarios es muy similar. Nos situamos entre las líneas 11 y 12 y añadimos:

[php]
$query = $wpdb->get_results(“SELECT * FROM $wpdb->comments WHERE comment_approved = ‘1’”);
$value = count($query);
[/php]

De nuevo, la variable $query almacena el resultado de la consulta, sólo que esta vez la consulta busca en la tabla de comentarios y filtra por la columna de comentarios aprovados, de modo que sólo devuelve los comentarios aprovados (fuera spam). La variable $value almacena el resultado del recuento.

Para sacar la media de comentarios por artículos, crearemos dos variables, una para el recuento de cada uno, les asignaremos el valor llamando a esta misma función y luego dividiremos, calcularemos el valor absoluto y redondearemos a 3 decimales. El código que debemos añadir entre las líneas 13 y 14 es:

[php]
$articulos = datos(‘TOTPOST’);
$comentarios = datos(‘TOTCOM’);
$division = $comentarios / $articulos;
$division = abs($division);
$value = round($division, 3);
[/php]

El código realmente se explica sólo: creamos la variable $artículos (que almacena el recuento de artículos), creamos la variable $comentarios (recuento de comentarios), creamos la variable $division (resultado de la división del total de comentarios entre el total de artículos), calculamos el valor absoluto (con la función abs) y le asignamos a la variable $value el redondeo de la división con 3 decimales de precisión (podéis cambiar el 3 por el número que queráis).

Calculando los días pasados desde la apertura del blog y la fecha actual

Quizá este sea el punto más complejo del tutorial, ya que requiere que usemos funciones que no solemos usar a menudo. La lógica del código siguiente, que deberemos situar entre las líneas 7 y 8), es simple: calculamos el UNIX timestamp (los segundos pasados desde el 00:00:00 UTC del 1 de enero de 1970) de la fecha de inicio del blog, calculamos el de hoy, calculamos la diferencia entre el último y el primero, calculamos el valor absoluto de la diferencia (aunque en realidad, si todo está bien, el resultado sería el mismo que sin calcular el valor absoluto), pasamos esos segundos a días (60 segundos en un minuto, 60 minutos en una hora, 24 horas en un día: 86400 segundos en un día) y truncamos (eliminamos los decimales) el resultado (calculamos sólo días, no fracciones de días).

[php]
$timestamp1 = mktime(0,0,0,9,13,2008);
$timestamp2 = mktime(0,0,0,date(‘n’),date(‘j’),date(‘Y’));
$segundos_diferencia = $timestamp1 – $timestamp2;
$dias_diferencia = $segundos_diferencia / (60 * 60 * 24);
$dias_diferencia = abs($dias_diferencia);
$value = floor($dias_diferencia);
[/php]

La función mktime acepta unos cuantos parámetros, pero nosotros nos centraremos en los 6 primeros, que corresponden, de izquierda a derecha, a las horas, los minutos, los segundos, el mes, el día y el año de la fecha en cuestión. En mi caso, dejo las horas, minutos y segundos a 0 (no creo que se gane mucho especificándolos) y establezco el mes en 9 (septiembre) el día en 13 y el año en 2008. Vosotros tendréis que cambiar estos números por los de la fecha del inicio de vuestro blog.

Ahora calcular la media de artículos por día es muy sencillo: recurrimos al mismo método que usamos para calcular la media de comentarios por artículo y listo:

[php]
$articulos = datos(‘TOTPOST’);
$dias = datos(‘TOTDAYS’);
$division = $articulos / $dias;
$division = abs($division);
$value = round($division, 3);
[/php]

Reemplazando etiquetas por valores

Ahora tenemos una función que nos devuelve el valor del dato que buscamos, sin embargo nos interesaría más poder escribir en un artículo una etiqueta del estilo de [TOTPOST] y que WordPress la reemplazase por el valor que le corresponde. Para hacerlo tenemos que crear una nueva función, la cual tendrá dos matrices: la primera conendrá las etiquetas y la segunda los valores. A continuación la función reemplazará las etiquetas por los valores. Por último añadiremos esta función como un filtro de WordPress y ya lo tendremos listo. La función quedaría así:

[php]
add_filter(‘the_content’, ‘reemplaza_etiquetas_con_los_datos’);
function reemplaza_etiquetas_con_los_datos($text) {
$etiquetas = array(‘[TOTPOST]’, ‘[TOTDAYS]’, ‘[POSTPERDAY]’, ‘[TOTCOM]’, ‘[COMPERPOST]’);
$valores = array(datos(‘TOTPOST’), datos(‘TOTDAYS’), datos(‘POSTPERDAY’), datos(‘TOTCOM’), datos(‘COMPERPOST’));
$text = str_replace($etiquetas, $valores, $text);
return $text;
}
[/php]

Con todo esto hecho, el código que tendremos será el siguiente:

[php]
function datos($date) {
global $wpdb;

switch ($date) {
case ‘TOTPOST’:
$query = $wpdb->get_results(“SELECT * FROM $wpdb->posts WHERE post_status = ‘publish’ AND post_type = ‘post'”);
$value = count($query);
break;
case ‘TOTDAYS’:
$timestamp1 = mktime(0,0,0,9,13,2008);
$timestamp2 = mktime(0,0,0,date(‘n’),date(‘j’),date(‘Y’));
$segundos_diferencia = $timestamp1 – $timestamp2;
$dias_diferencia = $segundos_diferencia / (60 * 60 * 24);
$dias_diferencia = abs($dias_diferencia);
$value = floor($dias_diferencia);
break;
case ‘POSTPERDAY’:
$articulos = datos(‘TOTPOST’);
$dias = datos(‘TOTDAYS’);
$division = $articulos / $dias;
$division = abs($division);
$value = round($division, 3);
break;
case ‘TOTCOM’:
$query = $wpdb->get_results(“SELECT * FROM $wpdb->comments WHERE comment_approved = ‘1’”);
$value = count($query);
break;
case ‘COMPERPOST’:
$articulos = datos(‘TOTPOST’);
$comentarios = datos(‘TOTCOM’);
$division = $comentarios / $articulos;
$division = abs($division);
$value = round($division, 3);
break;
default:
$value = ”;
break;
}
return $value;
}
add_filter(‘the_content’, ‘reemplaza_etiquetas_con_los_datos’);
function reemplaza_etiquetas_con_los_datos($text) {
$etiquetas = array(‘[TOTPOST]’, ‘[TOTDAYS]’, ‘[POSTPERDAY]’, ‘[TOTCOM]’, ‘[COMPERPOST]’);
$valores = array(datos(‘TOTPOST’), datos(‘TOTDAYS’), datos(‘POSTPERDAY’), datos(‘TOTCOM’), datos(‘COMPERPOST’));
$text = str_replace($etiquetas, $valores, $text);
return $text;
}
[/php]

Cualquier duda, no dudéis en preguntarla en los comentarios.


Mejorando la forma de mostrar fechas con PHP

Nota: Este tutorial requiere conocimientos de Bases de Datos MySQL y de PHP básicos (ambos). No está pensado para recién llegados, sinó para aquellos que se hayan atascado durante la programación de un script que requiera modificar la forma de mostrar las fechas.

Bien, puede que el título de este artículo no sea de los mejores que he escrito (es cierto, realmente no aclara mucho), pero es que este tutorial tampoco puede resumirse de forma fácil de una frase.

Es sabido por muchos que la mayoría de los scripts PHP usan Bases de Datos MySQL para almacenar los datos. Entre estos datos es muy común guardar fechas, por ejemplo, al publicar un artículo en un blog o al editar un mensaje de un foro, aunque ejemplos hay a toneladas.

Estas fechas se pueden guardar de muchas formas, pero una de las más fáciles de leer es la que genera la función CURRENT_TIMESTAMP. Esta función genera fechas como la siguiente: 2009-09-03 13:58:56. Como podéis ver es un formato muy fácil de leer, sin embargo no es el formato al que solemos estar acostumbrado (por ejemplo, Jueves 3 de Septiembre de 2009, 13:58).

Transformar la fecha que genera CURRENT_TIMESTAMP manualmente para que devuelva el formato al que estamos acostumbrados es una tarea larga y lenta (y en algunos casos compleja). No hay más que pensar que deberíamos crear una función que determine qué día de la semana es cada día del año y del mes para que a muchos se nos vayan las ganas de crear una función similar.

No obstante, PHP nos permite usar la función date(), una función la mar de útil: Nos muestra la fecha actual en el formato que queramos. Podemos mostrar sólo el año, el día, el día con dos dígitos, la semana del año, el mes, el nombre del día de la semana, el nombre del mes, y muchísimos más datos. Lo mejor es que también podemos usar la función date() para que nos genere esos datos de una fecha dada. En este caso usaremos la función date() para que genere todos esos datos basándose en la fecha que tenemos en nuestra Base de Datos.

Sin embargo, la función date() no acepta la fecha en el formato en la que la tenemos, sinó en el formato UNIX, así que primero tendremos que convertir nuestra fecha. Para ello recurriremos a la función strtotime().

Finalmente nuestro pequeño script para convertir la fecha quedaría así:

[php]

/* Función */

function convertir_fecha($fecha, $formato_final=”) {
if ($formato_final == ”) {
/* Si no se ha especificado formato, se devuelve la fecha tal como la teníamos al principio */
return $fecha;
} else {
return date($formato_final, strtotime($fecha));
}

/* Aplicación */

echo convertir_fecha(‘2009-08-29 12:45:05’, ‘D j \de F \del Y a \las G:i’);
// Mostrará: Sat 29 de August del 2009 a las 12:45

?>
[/php]

Los parámetros que aceptará la función convertir_fecha() son los mismos que acepta la función date().

No es nada nuevo, podíamos hacer esto desde hace tiempo, pero es hoy cuando me he fijado en el segundo parámetro de la función date() y todas las posibilidades que ofrece a los programadores.

PD: No me he parado a explicar el funcionamiento de cada función, ya que es bastante simple y la documentación lo deja bastante claro.


Añade un calendario con Javascript

Cuando creamos un proyecto en el que hay que usar fechas y formularios no enfrentamos un problema: el estándar de formato de fecha.

Algunos usuarios escribirán DIA/MES/AÑO, otros DIA-MES-AÑO, otros AÑO/DIA/MES y un sin fin de posibilidades más.

Hoy Desde hace unos días en El mundo de Deckerix podemos encontrar un tutorial para añadir un calendario en Javascript sin recurrir a jQuery, Mootools y demás frameworks.

Podéis leer el tutorial aquí, y descargar el script aquí.


Fechas de lanzamiento de Ubuntu 9.04: Jaunty Jackalope

Vía Mundogeek descubro las fechas de lanzamiento de las versiones Alpha, Beta, RC y final de Ubuntu 9.04: Jaunty Jackalope.