Contenido

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.

  • Muy bueno, me preguntaba para que servía =)

    Gracias

  • Muy bueno Andres… Eres un crack del WordPress.
    Una pregunta… si usas WP-Cache… se chachea todo en ficheros, no?, entonces se reducuiria la carga de base de datos a la hora de llamar a los plugins, no?
    Por que me parece más mantenible hacerlo todo con plugins antes que aplicar hacks.
    Que creeis?
    Muy buen articulo, si señor!
    Un saludo.

  • @David: Buenas David, exactamente WP-Cache lo que hace es generar ficheros HTML con el resultado de la ejecución de WordPress. Lo que significa que en el ejemplo de arriba, guardará los posts con la palabra ajax cambiada a enlace.

    La única ventaja real de usar my-hacks.php o usar un plugin es que los plugins requieren ciertas comprobaciones previas para funcionar, lo que lo hacen un poco más pesados. Pero por otro lado la facilidad de uso de los plugins lo hacen ideales para usuarios noveles.

    Yo usaría my-hacks.php para tareas concretas y simples. Y delegaría en plugins todo lo que el usuario necesite.

  • ¡Muy bueno!

    Pero fíjate que en la línea

    return str_replace(‘ajax’, ‘ajax‘);

    Te ha faltado el último parámetro de la función str_replace (mixed subjet); debería ser:

    return str_replace(‘ajax’, ‘ajax‘,$content);

    ¡Exitos!

  • Yo tenia entendido que no era recomendable utilizar el fichero my-hacks.php.

    ¿Estoy equivocado?

    Un saludo.

  • Ok Andres, entendido.
    Muchas gracias.

    Saludos.

  • @Albert: No es recomendarlo usar para reemplazar los plugins. Lo ideal es usarlo con cabeza y si administras unos cuantos blogs, te puede ayudar a gestionar tareas internas no desarrolladas como plugins.

    Más que nada es una utilidad que WordPress posee y que está bien conocer para salvarnos el cuello en un momento determinado.

  • Si no me falla la memoria, a partir de WP 2.2 (o era 2.3), ya puedes mover wp-includes/languages/ a wp-content/languages/

    Lo cual ya deja el sistema mas transparente para actualizaciones. (Aunque no deberías sufrir tanto si utilizas SVN para esto :D)

  • Hola, quería saber si puedo hacer que la palabra solo se sustituya una vez por post.
    La función me interesa mucho, pero si sustituye todas las palabras, las entradas quedarían muy cargadas de enlaces.

  • @David: Con la versión para PHP 5 de str_replace() puedes usar un parámetro que indica el número de reemplazos que quieres hacer.

    Saludos

  • Hola Andrés:
    Estoy implementando un sitio con WordPress mu y quise incluir esta función en el desarrollo, desafortunadamente no está considerada en la versión 1.5.1, ahora que salió la versión 2.6 de WP espero la correspondiente a WP mu.
    Lo probé en mi sitio, pero uso un tema con muchas variables y alguna de ellas entra en conflicto con el hack.
    Coincido contigo en que es mejor usar este sistema para algunas instrucciones precisas, en lugar de usar plugins que retardan la carga de las páginas.
    Saludos

  • Hola anieto! Me gutaría preguntarte una cosa. Bueno soy diseñador lo digo porque conocimientos de .php prácticamente nulos. El caso es que quiero hacer uso del archivo my-hacks.php para incrustar publicidad adsense al escribir una palabra en el post (modificación de linkAlicante sobre tu post si no voy mal). El caso es que activo el archivo en opciones -> miscelaneas. Yo pensaba que me crearia un archivo automaticamente y no (al menos no lo he visto) así que lo he creado yo manualmente y lo he metido en la carpeta raiz (donde están todos los archivos y las carpetas de content, includes y admin). Escribo el código que has peusto para ver si efctivamente al escribir la palabra ajax se cambia por el link y que ocurre? Pues que me desaparcen todos los textos (contenidos) de todos mis posts (excepto los titulares que se mantienen). No se si me habré explicado bien jeje. ¿Tienes idea de porque me ocurre esto? Gracias de antemano

  • @Miguel Ángel: Cierto Miguel Angel, me dejé algo en el código. Prueba con este:

    
    <?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');
    
    ?>
    

    Siento las molestias

  • Efectivamente, ahora funciona, si hubiese sido programador podría haberme dado cuenta jajaja. Molestias ninguna, gracias por ayudarme. Saludos y enhorabuena por tu trabajo en el blog

  • Por cierto, me olvidaba, sería muy difícil añadir un botón en el panel de edición de las entradas que al darle te ponga la palabra? Es una tontería lo sé porque escribir la palabra a mano son 3 segundos pero sería cómodo y quería saber si es factible

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.