domingo, 18 de julio de 2010 (Hace 123 dias)

Acabo de incorporar al javascript del Cuaderno de campo la extensión para jQuery que añade funcionalidades para manejo de eventos de mousewheel. Vamos que ahora es posible detectar y dar uso a la rueda del ratón en el blog.
Iré extendiendolo por el blog allí donde se me ocurre que puede tener algún sentido o facilitar algo, como por ejemplo en el banner de «En twitter» que se puede ver a la derecha, en la página principal del blog. Ahora, con la rueda del ratón podeis rotar entre los posts publicados en Twitter.

jueves, 1 de julio de 2010 (Hace 140 dias)

Unos pequeños ajustes en Cuaderno de campo: ahora el ancho de la columna principal pasa de 910 pixel a 970 pixels, quedando la zona de apuntes del blog en 690px. Así nos preparamos para hacer uso del nuevo tamaño de imagen (640px) que desde la semana pasada a incorporado Flickr a su servicio y que no creo que tarde en convertirse en el standart (los 500 px ya se quedaban algo pequeños y desfasados).

martes, 29 de junio de 2010 (Hace 142 dias)

En fase beta todavía.
He implementado una sencilla versión de Cuaderno de campo en negro, tambien llamada hoja de estilos alternativa. Podeis probarla cliqueando en CSS Blanco ó CSS Negro que aparece en la barra lateral, sección «Del sitio» (sutil a la par que geek homenaje a Kusturica).

Es muy sencillo, básicamente via Javascript+JQuery se cambia la cabecera de la página donde se especifica la hoja de estilo en uso, y se guarda la información en una cookie. Al cargar la página PHP comprueba si existe esta cookie y aplica un estilo u otro.

Ni que decir tiene, es necesario tener las cookies activas para que a vuestra siguiente visita el último estilo seleccionado prevalezca.

lunes, 21 de junio de 2010 (Hace 150 dias)

Ayer instalé el plugin Tweetly Updater con algunas modificaciones que comento más abajo, con lo cual, desde hoy aquellos que usen Twitter (no es mi caso) pueden estar al tanto de los nuevos apuntes que aparezcan por aqui. La cuenta es twitter.com/Trebol_a

Modificaciones aTweetly Updater

He optado por Tweetly updater plugin para wordpress por su simplicidad, sin más parafernalia que acortar URL y enviar a Twitter. A pesar de eso le he realizado algunas modificaciones para adaptarlo al caso particular de Cuaderno de campo. Estas son algunas de las modifcaciones que he hecho en el plugins.

Innutilizar acortador de url bit.ly

WordPress ya dispone de sistema de su propio acortador de url y además lo estoy usando bastante (ver enlaces a Facebook, Twitter y demás), me resultaba absurdo darme de alta y usar un servicio que no necesito. Sigue leyendo…

viernes, 4 de junio de 2010 (Hace 167 dias)

Un par de modificaciones simples a las funciones de WordPress que imprimen el paginador (ver al pie de la página principal, donde aparece «Apuntes más antiguos», ahora aparece un numerito de fondo) para que incluyan el número de página a la que apunta el enlace. Me pareció mas cómodo, intuitivo, etc., etc…
Solo hay que tocar dos funciones (get_previous_posts_link y get_next_posts_link) para incluir una etiqueta nueva conteniendo el número y a continuación via CSS se formatea para que quede bonito, y todo sin gastar ni un kb en bitmaps.

Así es como se ha quedado la función get_next_posts_link en /raiz_wp/wp_includes/link_template.php
function get_next_posts_link( $label = 'Next Page »', $max_page = 0 ) {
global $paged, $wp_query;
if ( !$max_page ) {
$max_page = $wp_query->max_num_pages;
}
if ( !$paged )
$paged = 1;
$nextpage = intval($paged) + 1;
if ( !is_single() && ( empty($paged) || $nextpage <= $max_page) ) {
$attr = apply_filters( 'next_posts_link_attributes', '' );
return '<a href="' . next_posts( $max_page, false ) . "\" $attr title=\"Ir a la página $nextpage\">". preg_replace('/&([^#])(?![a-z]{1,8};)/', '&$1', $label) .'</a><small id="numeroSiguiente" class="numeroPaginaFondo">'.$nextpage.'</small>';
}
}

Así es como se ha quedado la función get_previous_posts_link en /raiz_wp/wp_includes/link_template.php
function get_previous_posts_link( $label = '« Previous Page' ) {
global $paged;
if ( !is_single() && $paged > 1 ) {
$paginaanterior = intval($paged) - 1;
$attr = apply_filters( 'previous_posts_link_attributes', '' );
return '<small id="numeroAnterior" class="numeroPaginaFondo">'.$paginaanterior.'</small><a href="' . previous_posts( false ) . "\" $attr title=\"Ir a la página $paginaanterior\">". preg_replace( '/&([^#])(?![a-z]{1,8};)/', '&$1', $label ) .'</a>';
}
}

y en el CSS algo como
.paginador .numeroPaginaFondo { font-weight:bold; display:inline; position:absolute; top:-55px; font-size:102px; color:#eed;z-index:-1;}
.paginador .numeroPaginaFondo#numeroAnterior {right:0px;}
.paginador .numeroPaginaFondo#numeroSiguiente {left:0px;}

Creo que queda más bonico del tó que unicamente el enlace del texto.

miércoles, 2 de junio de 2010 (Hace 169 dias)

He modificado la función get_calendar de este WordPress 2.9.0 ubicada en /raiz_wp/wp_includes/general_template.php para reemplazar el titulo del més por una lista de mes-año (numero de apuntes).
Creo que con esto se mejora bastante la navegación por los apuntes antiguos y aunque me suena de algún plugins que hace algo parecido vereis que se pueden ahorrar algunos recursos simplemente añadiendo unas líneas a la función.
La función get_calendar ha quedado de la siguiente manera (la parte corregida/modificada está advertida, el resto de la función es la original … creo… :) )
function get_calendar($initial = true) {
global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
$cache = array();
$key = md5( $m . $monthnum . $year );
if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) {
if ( is_array($cache) && isset( $cache[ $key ] ) ) {
echo $cache[ $key ];
return;}
}
if ( !is_array($cache) )
$cache = array();
// Quick check. If we have no posts at all, abort!
if ( !$posts ) {
$gotsome = $wpdb->get_var("SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1");
if ( !$gotsome ) {
$cache[ $key ] = '';
wp_cache_set( 'get_calendar', $cache, 'calendar' );
return;
}
}
ob_start();
if ( isset($_GET['w']) )
$w = ''.intval($_GET['w']);
// week_begins = 0 stands for Sunday
$week_begins = intval(get_option('start_of_week'));
// Let's figure out when we are
if ( !empty($monthnum) && !empty($year) ) {
$thismonth = ''.zeroise(intval($monthnum), 2);
$thisyear = ''.intval($year);
} elseif ( !empty($w) ) {
// We need to get the month from MySQL
$thisyear = ''.intval(substr($m, 0, 4));
$d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
$thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('${thisyear}0101', INTERVAL $d DAY) ), '%m')");
} elseif ( !empty($m) ) {
$thisyear = ''.intval(substr($m, 0, 4));
if ( strlen($m) < 6 )
$thismonth = '01';
else
$thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2);
} else {
$thisyear = gmdate('Y', current_time('timestamp'));
$thismonth = gmdate('m', current_time('timestamp'));
}
$unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear);
// Get the next and previous month and year with at least one post
$previous = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date < '$thisyear-$thismonth-01'
AND post_type = 'post' AND post_status = 'publish'
ORDER BY post_date DESC
LIMIT 1");
$next = $wpdb->get_row("SELECT DISTINCT MONTH(post_date) AS month, YEAR(post_date) AS year
FROM $wpdb->posts
WHERE post_date > '$thisyear-$thismonth-01'
AND MONTH( post_date ) != MONTH( '$thisyear-$thismonth-01' )
AND post_type = 'post' AND post_status = 'publish'
ORDER BY post_date ASC
LIMIT 1");
/* translators: Calendar caption: 1: month name, 2: 4-digit year */
$calendar_caption = _x('%1$s %2$s', 'calendar caption');
echo '<table id="wp-calendar" summary="' . esc_attr__('Calendar') . '">';
echo '<caption>';
//INICIO seccion cambiada
$unixPrimero=mktime(0,0,0,4,5,2003);
$anoAnterior="";
$unixUltimo=time();
echo '<select onchange="document.location.href=this.value;">';
while ( $unixPrimero < $unixUltimo ) {
$apuntesMensuales = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_date LIKE '%".date('Y-m-', $unixPrimero)."%' AND post_status='publish' LIMIT 1");
$anoEnCurso=date('Y', $unixPrimero);
if($apuntesMensuales > 0) {
if( $anoAnterior != $anoEnCurso ) {
if($anoAnterior != "") echo "</optgroup>";
echo "<optgroup label=\"$anoEnCurso\">";
$anoAnterior=$anoEnCurso;
}
echo "<option value=\"/".date('Y/m', $unixPrimero)."\"";
if( date('Y/m', $unixPrimero) == "$thisyear/$thismonth" ) echo " selected=\"selected\" ";
echo ">".$wp_locale->get_month(date("m",$unixPrimero))." - ".date('Y', $unixPrimero)." (".$apuntesMensuales.")</option>\n";
}
else {
if( $anoAnterior != $anoEnCurso ) {
if($anoAnterior != "") echo "</optgroup>";
echo "<optgroup label=\"$anoEnCurso\">";
$anoAnterior=$anoEnCurso;
}
echo "<option disabled>".$wp_locale->get_month(date("m",$unixPrimero))." - ".date('Y', $unixPrimero)." (0)</option>";
}
$unixPrimero=$unixPrimero+2678400;
}
echo "<option value=\"/\"";
if( date('Y/m', $unixUltimo) == "$thisyear/$thismonth" ) echo " selected=\"selected\" ";
echo ">".$wp_locale->get_month(date("m",$unixUltimo))." - ".date('Y', $unixUltimo)." (actualmente)</option>\n";
echo '</select>';
// $mesSegundo=$primerMes + 2592000;
// echo date('F Y', $mesSegundo);
// $mesActual="";
// echo sprintf($calendar_caption, $wp_locale->get_month($thismonth), date('Y', $unixmonth));
//FIN seccion cambiada
echo '</caption>
<thead>
<tr>';
$myweek = array();
for ( $wdcount=0; $wdcount<=6; $wdcount++ ) {
$myweek[] = $wp_locale->get_weekday(($wdcount+$week_begins)%7);
}
foreach ( $myweek as $wd ) {
$day_name = (true == $initial) ? $wp_locale->get_weekday_initial($wd) : $wp_locale->get_weekday_abbrev($wd);
$wd = esc_attr($wd);
echo "\n\t\t<th abbr=\"$wd\" scope=\"col\" title=\"$wd\">$day_name</th>";
}
echo '
</tr>
</thead>
<tfoot>
<tr>';
if ( $previous ) {
echo "\n\t\t".'<td abbr="' . $wp_locale->get_month($previous->month) . '" colspan="3" id="prev"><a href="' .
get_month_link($previous->year, $previous->month) . '" title="' . sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($previous->month),
date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year))) . '">« ' . $wp_locale->get_month_abbrev($wp_locale->get_month($previous->month)) . '</a></td>';
} else {
echo "\n\t\t".'<td colspan="3" id="prev" class="pad"> </td>';
}
echo "\n\t\t".'<td class="pad"> </td>';
if ( $next ) {
echo "\n\t\t".'<td abbr="' . $wp_locale->get_month($next->month) . '" colspan="3" id="next"><a href="' .
get_month_link($next->year, $next->month) . '" title="' . esc_attr( sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($next->month) ,
date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year))) ) . '">' . $wp_locale->get_month_abbrev($wp_locale->get_month($next->month)) . ' »</a></td>';
} else {
echo "\n\t\t".'<td colspan="3" id="next" class="pad"> </td>';
}
echo '
</tr>
</tfoot>
<tbody>
<tr>';
// Get days with posts
$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
FROM $wpdb->posts WHERE MONTH(post_date) = '$thismonth'
AND YEAR(post_date) = '$thisyear'
AND post_type = 'post' AND post_status = 'publish'
AND post_date < '" . current_time('mysql') . '\'', ARRAY_N);
if ( $dayswithposts ) {
foreach ( (array) $dayswithposts as $daywith ) {
$daywithpost[] = $daywith[0];
}
} else {
$daywithpost = array();
}
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'camino') !== false || strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'safari') !== false)
$ak_title_separator = "\n";
else
$ak_title_separator = ', ';
$ak_titles_for_day = array();
$ak_post_titles = $wpdb->get_results("SELECT post_title, DAYOFMONTH(post_date) as dom "
."FROM $wpdb->posts "
."WHERE YEAR(post_date) = '$thisyear' "
."AND MONTH(post_date) = '$thismonth' "
."AND post_date < '".current_time('mysql')."' "
."AND post_type = 'post' AND post_status = 'publish'"
);
if ( $ak_post_titles ) {
foreach ( (array) $ak_post_titles as $ak_post_title ) {
$post_title = esc_attr( apply_filters( 'the_title', $ak_post_title->post_title ) );
if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) )
$ak_titles_for_day['day_'.$ak_post_title->dom] = '';
if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one
$ak_titles_for_day["$ak_post_title->dom"] = $post_title;
else
$ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . $post_title;
}
}
// See how much we should pad in the beginning
$pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
if ( 0 != $pad )
echo "\n\t\t".'<td colspan="'. esc_attr($pad) .'" class="pad"> </td>';
$daysinmonth = intval(date('t', $unixmonth));
for ( $day = 1; $day <= $daysinmonth; ++$day ) {
if ( isset($newrow) && $newrow )
echo "\n\t</tr>\n\t<tr>\n\t\t";
$newrow = false;
if ( $day == gmdate('j', (time() + (get_option('gmt_offset') * 3600))) && $thismonth == gmdate('m', time()+(get_option('gmt_offset') * 3600)) && $thisyear == gmdate('Y', time()+(get_option('gmt_offset') * 3600)) )
echo '<td id="today">';
else
echo '<td>';
if ( in_array($day, $daywithpost) ) // any posts today?
echo '<a href="' . get_day_link($thisyear, $thismonth, $day) . "\" title=\"" . esc_attr($ak_titles_for_day[$day]) . "\">$day</a>";
else
echo $day;
echo '</td>';
if ( 6 == calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins) )
$newrow = true;
}
$pad = 7 - calendar_week_mod(date('w', mktime(0, 0 , 0, $thismonth, $day, $thisyear))-$week_begins);
if ( $pad != 0 && $pad != 7 )
echo "\n\t\t".'<td class="pad" colspan="'. esc_attr($pad) .'"> </td>';
echo "\n\t</tr>\n\t</tbody>\n\t</table>";
$output = ob_get_contents();
ob_end_clean();
echo $output;
$cache[ $key ] = $output;
wp_cache_set( 'get_calendar', $cache, 'calendar' );
}

Podeis ver como queda echando un vistazo al calendario que aparece en estas páginas, en la columna de la derecha.

Cuaderno de campo es un blog desarrollado y mantenido por Trebol-a y en el que escriben Trebol-a, Miguel, Merche y Mónica
Si quieres saber algo más sobre los autores acude a la página acerca-de, si quieres contactar con alguno de nosotros hazlo a través de contactar ó de Google+

Creative Commons: Todo el contenido de la web (imágenes, textos, vídeos, a excepción de aquellas obras de otros autores enlazados por Cuaderno de Campo) se acoge a los términos expresados en la licencia Creative Commons