Contenido

Cambia la cantidad de comentarios del panel de administración

22 Dic

+ 0

Nuestros amigos de AyudaWordpress, nos muestra un sistema para ayudarnos a mejorar la pantalla de moderación de comentarios haciendo que en lugar de 20, aparezcan 100 o lo que deseemos que aparezca.

20-comentarios
(Imagen de AyudaWordpress)

El problema que le encuentro al sistema propuesto es el tener que modificar un fichero del core de WordPress 2.7 para conseguir dicho efecto, así que he mirado un poco el fichero y he logrado sacarlo para adaptarlo a un plugin, insertarlo en my-hacks.php o incluso en el functions.php de nuestro theme.

<?php
$numComments = 100;
function comentarios_por_pagina(){
	global $numComments;
	return $numComments;
}
add_filter("comments_per_page", "comentarios_por_pagina");
?>

Simplemente tendremos que introducir este código en alguno de los ficheros nombrado anteriormente y reemplazar el 100 de $numComments por el valor de comentarios que deseemos mostrar. De esta forma, ya perderemos esta modificación al actualizar nuestro blog.

Comentarios con estilo en tu WordPress

25 Ago

+ 2

Los chicos de CSS-Trick nos muestran un tutorial de como conseguir mostrar los comentarios de cada entrada de una forma bastante elegante y original.

comments

Como podeis ver, hay mucho CSS por delánte. Usando los iconos de calendario de Sotak, y mucho códugo CSS podremos conseguir el mismo efecto de la imagen. Un complemento perfecto para aquel calendario que pusimo hace más de 2 años 😀

Elimina las páginas de los resultados de busqueda de WordPress

25 Jul

+ 7

Lucas Savelli, me preguntó hace unos días sobre como evitar que WordPress 2.6 no incluyera las páginas en los resultados de busqueda. Recordemos que esta inclusión forma parte de una nueva mejora dentro de WordPress 2.6 y que antes de esta versión no era posible realizar este tipo de búsquedas.

Aunque personalmente creo que esta opción es una buena forma de ofrecer más información al usuario, siempre puede haber algún caso en el que quitar esta inclusión y únicamente permitir que se muestren resultados de la busqueda del contenido de los posts.

Revisando el código, he visto que la variable post_type. Una variable privada que condiciona las busquedas de query_posts(), podia ser cargada como pública añadiendo un filtro a la función query_vars(), así que así lo hemos hecho 😀

function addPostType($vars) {
        array_push($vars,'post_type');
        return $vars;
}
add_filter('query_vars', 'addPostType');

Este código podemos incluirlo en cualquiera de los 3 sitios disponibles para incrementar las funcionalidades de WordPress:

  1. Mediante un plugin
  2. En el fichero my-hacks.php
  3. En el fichero functions.php de nuestro theme

Añade una imagen personalizada a tus posts

22 Jul

+ 12

Esta mañana con Ignacio Lledó hemos llegado a desarrollar un sistema con el que hacer que la primera imagen subida a nuestro post, pase ser la foto del post. Y todo ello sin plugins.

Antecendentes

Como vemos en la imagen queremos mostrar una imagen, en este caso en el sidebar de nuestro WordPress y queremos ver una imagen relacionada al artículo. Inicialmente se hacía de forma manual, el usuario insertaba la URL de la imagen en un campo personalizado al que le dama un nombre ya pactado con el resto de usuarios para así poder repescarlo en el sidebar.

auto_meta

Una vez insertada la URL, unicamente había que indicar en el HTML del sidebar.php de nuestro theme la URL de la imagen que queremos que aparezca.

auto_meta2

....
<ul class="sidebar">
<li class="post">
<img src="<?php echo get_post_meta($post->ID, 'KEY_DEFINIDA', true); ?>" alt="<?php the_title(); ?>" class="align_left" />
<?php the_excerpt('Leer más'); ?>
</li>
....

El sistema funciona, pero ¿por que no hacerlo más fácil?

Haciendoló más fácil al usuario

Para empezar dejamos el theme igual que el sistema anterior, seguimos leyendo la información de la misma KEY_DEFINIDA con la que los usuarios ya se han familiarizado. Ahora tendremos que hacerles el trabajo nosotros 😀

Para añadir la funcionalidad podemos elegir uno de los 3 posibles sistemas de los que podemos hacer uso para añadir funcionalidades a WordPress.

  1. Mediante un plugin
  2. En el fichero my-hacks.php
  3. En el fichero functions.php de nuestro theme

En este caso hemos optado por el fichero functions.php de nuestro theme ya que esta funcionalidad está ligada completamente al diseño y si cambiamos de diseño, quizas no necesitemos que siga ejecutandosé.

Así que añadimos el siguiente código:

// Cambia el nombre del META
define ("META_KEY", "KEY_DEFINIDA");

function auto_add_meta_images($postID) {
    // Solo añadirá la primera imagen como Meta
    $post = get_post( $postID );
    if (!get_post_meta($postID, META_KEY, true))
        add_post_meta($post->post_parent, META_KEY, $post->guid);
    return $postID;
}

add_action('add_attachment', 'auto_add_meta_images');

¿Como funciona?

Con este sistema, únicamente tendremos que dedicarnos a subir imágenes mediante el sistema de subidas de WordPress 2.5 o superior y el automáticamente almacenará en el Campo personalizado definido previamente con la dirección de la primera imagen que subamos.

Conclusión

Con wordpress podemos hacer lo que queramos y la imaginación es el límite. Las cosas más simples a veces pueden serlo todavía más 😀

Controla tus miniaturas de una vez por todas 2.5…

16 Jul

+ 10

Llevo unos días mirando de montar un sistema con el que permitir crear miniaturas desde WordPress 2.5+ indicandoles el tamaño de las mismas, osea que además de los tamaños que podemos definir en Opciones > Miscelanea, tambien nos permite crear unas miniaturas con el tamaño especificado en el momento de subir las imagenes.

Por el momento me las crea sin problemas, ahora solo necesito encontrar una forma de introducir las medidas de una forma cómoda y usable para los usuarios y poder recuperar el nombre de la imagen redimensionada a nuestra voluntad.

Os dejo un ejemplo de como redimensionar las imagenes.

function change_sizes($sizes = array()) {
	update_option('NUEVO_size_w', 400);
	update_option('NUEVO_size_h', 400);
	return array_push($sizes, 'NUEVO');
}

add_filter('intermediate_image_sizes', 'change_sizes');

Añadiendo este código al fichero functions.php de nuestro theme o al my-hacks.php, añadirá un nuevo perfil de imagenes llamada «NUEVO» y que creará imagenes de 400×400 pixeles además de las que ya está creando actualmente.

Iré contando cosillas de como evolucionan las cosas 😉

Desactivar el histórico de posts en WordPress 2.6

15 Jul

+ 17

Si eres de los que no necesitan sobresaturar la tabla de posts con las revisiones de las modificaciones hechas a cada post, puedes desactivarlas de una forma realmente sencilla:

1. Editamos el fichero default-filters.php que se encuentra en la carpeta wp-includes/ de nuestro WordPress.
2. Buscamos la línea 184 en la que debe haber algo parecido a esto.

add_action( 'pre_post_update', 'wp_save_post_revision' );

3. Comentamos esa línea dejándola exactamente así.

#add_action( 'pre_post_update', 'wp_save_post_revision' );

Una vez hecho esto, WordPress no almacenará las modificaciones de hechas a cada post, por lo que el histórico desaparecerá y no podremos usarlo.

Actualización

Más fácil todavía:

1. Editamos el fichero wp-config.php de la raiz de nuestro WordPress

2. Añadimos la siguiente línea

define (’WP_POST_REVISIONS’, false);

3. Guardamos los cambios

Gracias Alex.

aNieto2k ahora personalizada para iPhone e iTouch

25 Mar

+ 32

Hace tiempo que quería hacer una versión personalizada para los usuarios que visitan el blog desde el iPhone e iTouch, aprovechando el descubrimiento de Massive News «Mobile Edition» he pensado en hacer uso de él y condicionar la visualización del blog dependiendo del dispositivo desde el que se ve.

anieto2k_iphone.jpg

Usando el fichero my-hacks.php he añadido una condición que me indica si el usuario está accediendo desde un iPhone/iPod Touch y en caso afirmativo le digo que para ese usuario me cargue el theme Massive News «Mobile Edition».

<?php
function is_iphone($user_agent) {
        return (bool)eregi('(iPhone|iPod)', $user_agent);
        }

function theme_for_iphone($tpl) {
        if (!is_iphone($_SERVER['HTTP_USER_AGENT'])) return $tpl;
        else return "mobile";
}

add_filter('template', 'theme_for_iphone');
?>

 Como podemos ver, es un código bastante claro que me ayuda a distinguir entre iPhone/iPod y el resto.

Para que todo funcione correctamente, he introducido el theme en el directorio wp-content/themes/ y he activado el plugin wp-pagenavi, que se complementa perfectamente para mejorar gráficamente la paginación del theme.

Por el momento no he podido hacer que funcione con 1BlogCacher o WP-Cache, pero solo es cuestión de tiempo 😀

El fichero my-hacks.php en WordPress

19 Feb

+ 23

Hace ya tiempo que quería comentar algo acerca del fichero my-hacks.php se encarga de contener los hacks que queremos que funcionen sobre nuestra configuración de WordPress. Para ver como funciona hagamos un pequeño ejemplo:

Ejemplo my-hacks.php

Imaginemos que queremos que todas las palabras «ajax» de nuestros posts apunten a la categoría del blog, para ello podemos optar por hacer 2 cosas:

1) Un plugin que nos ejecute la funcionalidad deseada.

2) Añadirlo al fichero my-hacks.php

Diferencia entre plugin y my-hacks.php

La diferencia principal es que el fichero my-hacks.php necesita menos procesos para ejecutarse ya que los plugins son tratados de una forma especial, almacenando en la base de datos los que están activos y los que no. De esta forma si tenemos que hacer una pequeña modificación nos es más rentable, en cuanto a consumo de recursos, añadirlo en el fichero my-hacks.php que usar un plugin el cual tendrá que comprobar cada vez que lo ejecute si está activo o no.

Este fichero además, se llama en la línea 231 del fichero wp-settings.php, lo que singnfica que se ejecuta antes de do_action('init'); que es el primer punto al que podemos asociar un plugin. Para entederlo pensemos en las acciones de WordPress, que son una funcionalidad que nos permite extender las funciones que se ejecutan en ciertos puntos desperdigados por WordPress, editar un post, publicar, comentar, modificar un theme,… podemos marcar esos puntos para que nuestras funciones sean ejecutadas en ellos mediante el uso de add_action();.

Con my-hacks.php, podemos adelantarnos algo más a la acción init, teniendo un poco más de control sobre nuestro WordPress.

La funcionalidad

La funcionalidad que deseamos podríamos formarla con una función de 1 línea de tamaño. Veamos el código:

function replaceAjax($content = '') {
	return str_replace('ajax', '<a href="'.get_category_link(AJAX_ID).'" title="Ajax">ajax</a>', $content);
}

Simplemente reemplazamos la palabra ajax por un enlace a la categoría Ajax, para ello necesitamos conocer el ID de dicha categoría. En el Panel de Administrador > Administrar > Categorías.

Añadimos la acción

Una vez establecida la funcionalidad, tenemos que decirle a WordPress que ha de ejecutar dicha funcionalidad en un momento determinado, en nuestro caso al hacer el the_content.

add_action("the_content", "replaceAjax");

El fichero my-hacks.php

Por lo cual nuestro fichero debería quedar de la siguiente forma.

<?php
/*
* replaceAjax
* Reemplaza las palabras ajax por el enlace a la categoría del blog
*/

function replaceAjax($content = '') {
		return str_replace('ajax', '<a href="'.get_category_link(AJAX_ID).'" title="Ajax">ajax</a>', $content);
}

add_action('the_content','replaceAjax');

?>

Ubicación del fichero

El fichero my-hacks.php está, a mi parecer, mal ubicado ya que WordPress lo va a buscar en el directorio raiz, y personalmente creo que todo lo relacionado con la personalización debería ir en wp-content/, pero bueno, podría ser peor… (wp-include/languages/…).

Activación de sistema my-hacks.php

Para evitar comprobaciones de existencia del fichero, WordPress dispone de un check en Opciones > Misceláneas que nos permite activar o desactivar esta propiedad de WordPress.

Resaltar el primer post de nuestro WordPress

24 Ene

+ 17

Hace unos días en el foro, GUAGUAU preguntaba como podíamos hacer que el primer post (el más reciente) quedara resaltado frente a los demás, como ya me lo han preguntado otras veces he pensado hacer un míni tutorial para tenerlo aqui guardado y accesible a todos. Quizas sería interesante que primero tuvieramos unas nociones básicas de como funciona un theme de WordPress.

El código

Para el ejemplo he usado el theme Kubrick, que es el theme por defecto que WordPress integra, está en la carpeta wp-content/themes/default/.

Primero hemos de encontrar el punto en el que insertar la marca que nos permita diferenciar un post del resto, para ello vamos a usar un sistema de dos lenguajes, PHP y CSS. Con PHP incorporaremos la funcionalidad necesaria para añadir una clase al post marcado y desde el CSS le daremos es aspecto que deseemos para diferenciarlo. Empezemos 😀

1) Encontrar el punto en el que se pinta el post.

Generalmente los themes de WordPress, disponen de un fichero index.php en el que se declara el Loop que se encarga de pintar los posts que componen a la petición realizada. Es aqui donde encontraremos la estructura de un post y donde meteremos mano al código para modificar el primer post.

<div class="post" id="post-<?php the_ID(); ?>">

Como podemos ver, la línea anterior nos dice que en este punto comienza el post, con id="post-X" (siendo X el ID de la noticia), y como class indicamos que se trata del típo post, que en nuestro CSS estará definido para otorgarle es aspecto que vemos en el blog. Ahora tenemos que conocer cual es el primero.

Para ello debemos encontrar el punto en el que se empiezan a repetir los posts.

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

Una vez encontrado el comienzo del Loop, empezamos a modificar nuestro código.

2) Añadir un contador de posts

Para añadir un contador, primero debemos definir una variable que, inicializada a 0, se incrementará con el paso de los posts.

<?php
   $contador = 0; 
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	++$contador; //Incrementamos en 1 por cada post
?>

3) Controlamos el primer post

Disponiendo del contado únicamente tendremos que controla que cuando este sea 1, aplique la nueva class al contenedor del post.

<?php
	$contador = 0;
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	$contador; //Incrementamos en 1 por cada post
	if ($contador == 1) $claseResaltado = " resaltado"; //Dejamos un espacio delante de la palabra
	
	<div class="post<?=$claseResaltado?>" id="post-<?php the_ID(); ?>">
?>

4) Versión más compacta

Una versión más compacta podría ser algo así.

<?php
	$contador = 0;
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	
	<div class="post<?=((++$contador == 1)?" resaltado":"")?>" id="post-<?php the_ID(); ?>">
?>

5) Un poco de estilo

Ahora que ya tenemos marcado el post, únicamente tendremos que aplicarle el estilo necesario en nuestro style.css.

.resaltado {
	background-color:#D1E2EF;
	padding:1em;
	margin:1em 0;
	-moz-border-radius: .8em; //Solo Firefox
}

.resaltado h2 {
	margin:0;
}

6) Bonus: Formato CSS exclusivo

Cuando decidí hacer el post, pensé en usar un sistema en el que implicara una modificación en el theme por que debido a la variedad de themes y formatos es imposible crear una forma estandarizada para hacerlo, así que indicando el post que se ha resaltar con una clase desde PHP conseguimos aligerar el problema, además de asegurarnos compatibilidad con los navegadores.

Podríamos hacer uso de selectores CSS para conseguir un efecto similiar. Pese a que el selector :first-child no está soportado por Internet Explorer 6, una solución sin tener que editar el fichero .php sería esta.

Esta solución no es compatible con Internet Explorer 6.0.

#content .post:first-child {
	background-color:#D1E2EF;
	padding:1em;
	margin:1em 0;
	-moz-border-radius: .8em; //Solo Firefox
}

#content .post:first-child h2 {
	margin:0;
}

En el código anterior, aplicamos el estilo al primer hijo con class="post" que se haye dentro del elemento padre con id="content". Consiguiendo el mismo efecto que el descrito anteriormente en los navegadores más modernos.

7) Bonus: Versión sin contador

Alex me da una ida para una versión más compacta aún.

<?php
	$resaltado = ' resaltado';
	if ( have_posts() ) : while ( have_posts() ) : the_post();
	
	<div class="post<?=$resaltado;$resaltado = null;?>" id="post-<?php the_ID(); ?>">
?>

WordPress 2.3.2, actualización urgente

30 Dic

+ 39

La gente de WordPress, nos recomienda que nos actualizemos a la versión 2.3.2 urgentemente para evitarnos problemas de seguridad, descubiertos por Alex Concha, en los que la privacidad de nuestros borradores se veía comprometida. Al parecer, la versión actual es sensible a que personas sin loguear puedan ver estos posts desde nuestro blog.

El problema radicaba en una comprobación de usuario en el fichero wp-includes/query.php, en el que daba por supuesto que eras administrador si encontraba wp-admin/ en la URL del navegador, siendo sensible a situaciones como estas:

?x=wp-admin/&paged=1

Si por algún motivo no puedes actualizar, pero quieres solventar el problema, bastaría con realizar los siguiente cambios:

1. Editamos el fichero  wp-include/query.php y cambiamos la función is_admin(); por la siguiente.

function is_admin () {
        if ( defined('WP_ADMIN') )
                return WP_ADMIN;
        return false;
}

2. Despues en la página wp-admin/admin.php insertamos en la primera línea el siguiente código detrás del tag de PHP <?php

define('WP_ADMIN',TRUE);

Ojo, siempre que puedas, recomiendo que te actualizes todo y evites tocar código. Y si estás tocando el código, asegurate de tener copias de seguridad de los ficheros que modificas.

Como extra en esta nueva versión, se ha añadido la posibilidad de que puedas personalizar el error de conexión a base de datos fácilmente.

Personalizar la página de error de nuestro WordPress 2.3.2

En los casos en los que WordPress tiene problemas de conexión con la base de datos, podemos evitar la página fea de «DATABASE ERROR» haciendo uso del nuevo sistema de WordPress mediante una página externa.

wordpress_database_error.png

Únicamente, tendremos que crear una página llamada db-error.php y alojarla dentro del directorio wp-content/. Veamoslo por pasos 😀

  1. Creamos una página PHP llamada db-error.php
  2. La úbicamos dentro de la carpeta wp-content/ de nuestro WordPress
  3. Cruzamos los dedos para no verla nueva 😀

Idea para página de error personalizada

Puesto que el usuario no tiene culpa de que está ocurriendo un error, me parece interesante hacerle invisible este problema usando la caché generada por algún plugin de los que conocemos para aliviar la carga de nuestros servidores. Uso 1BlogCacher y solo lo he probado con este plugin, aunque indagando un poco encontraremos el patrón para encontrar nuestro fichero.

Se trata de emular el index de nuestro blog y avisarnos por correo de que existe algún problema. Este script se me ha ocurrido ahora mismo y seguro que te acordarás de mi si lo usas y recibes 500 mails diciendo que está la base de datos caida, habrá que perfeccionarlo.

//wp-content/db-error.php
<?php
if (eregi("dberror.php", $_SERVER["REQUEST_URI"])) die("No accedas directamente");
mail("TU_EMAIL", "Error de Base de datos", "Tienes que revisarlo");
if (!defined("ABSPATH")) define('ABSPATH', '../');
die(file_get_contents(ABSPATH."wp-cache/index.php/d41d8cd98f00b204e9800998ecf8427e.html"));
?>

Un par de apuntes:

Donde pone TU_EMAIL, debes indicar el mail al que quieres que le llegue el aviso. Debes tener disponible la función file_get_contents(), en caso de no tenerla, puedes usar curl() u otras alternativas. El hash (d41d8cd98f00b204e9800998ecf8427e), lo usa 1BlogCacher, para el index, por lo tanto no debería dar error en ningún blog, pero por si acaso, comprueba que existan los ficheros en la ruta indicada arriba.

Actualización de WordPress a la versión nueva

Seguimos los mismos pasos que en versiones anteriores.

  • Descargamos la versión nueva
  • Desactivamos todos los plugins
  • Accedemos al FTP
  • Renombramos la carpeta wp-content a _wp-content.
  • Subimos todos los ficheros de dentro del ZIP, excepto la carpeta wp-content.
  • Una vez subidos todos, probamos a acceder al sitio y probablemente veamos un error.
  • Renombramos de nuevo la carpeta _wp-content a wp-content
  • Ya podemos acceder al blog sin errores.
  • Nos dirigimos al panel de administración y seguimos los pasos de la actualización que ellos mismos te sugieren.
  • Listo, ya tenemos nuestro blog en WordPress 2.3.2.
  • Activamos los plugins que deseemos.