Bicis ordenadas en Budapest, de Viktor Kern

Una de las claves del éxito de WordPress es la facilidad con la que lo podemos adaptar a nuestras necesidades. Y no, esta vez no estoy hablando del enorme ecosistema de temas y plugins que tienes a tu disposición (que también), sino de esos pequeños fragmentos de código que pegamos por ahí para conseguir aquella funcionalidad extra que tanto queremos. Ejemplos de estas personalizaciones son:

  1. Modificaciones en la pantalla de login de WordPress,
  2. Subir archivos con otras extensiones,
  3. Añadir el atributo alt a tus imágenes automáticamente y
  4. otros muchos ejemplos.
  5. No, en serio… ¡hay muchos más ejemplos! ?

Mola un montón, ¿verdad? Pues bien, veamos (algunos de) los problemas que entrañan estos pequeños fragmentos de código y cómo solucionarlos de una vez por todas.

El problema

Existen dos grandes problemas en el mundillo este de las personalizaciones de WordPress. Por un lado, muchos usuarios copian código sin saber o entender qué están copiando. Este problema es especialmente difícil de combatir, porque una persona que no sepa programar o no tenga ninguna noción de cómo funciona el código fuente difícilmente podrá evaluar si el fragmento de código que ha encontrado por la red es seguro y confiable. Mi recomendación es que únicamente copies y pegues código que encuentres en webs de confianza.

Por ejemplo, nuestro blog es una fuente fiable, ya que (casi) todos los fragmentos de código que publicamos han sido escritos por nosotros o como mínimo probados en nuestros entornos de desarrollo, así que no deberías tener problemas con ellos. Otra fuente con innumerables recursos que puedes usar es el blog de Fernando Tellado, Ayuda WordPress, o los recursos que ha recopilado y publicado en su último libro, WordPress 1001 trucos.

Perro en el espacio
Reconócelo: los usuarios muchas veces no tenemos ni idea de qué estamos haciendo.

El segundo gran problema es que muchos usuarios no entienden dónde están pegando el código de personalización. En general, la mayoría de fuentes donde encontrarás estos recursos te recomiendan que los pegues en el fichero functions.php de tu tema (incluso nosotros en entradas anteriores hemos hecho esta recomendación). El motivo de proponer ese sitio es sencillo: todos los blogs de WordPress tienen un tema instalado como mínimo y, como todo tema, disponen del fichero en cuestión. Así que la forma más sencilla de volcar un fragmento de código PHP en nuestra instalación de WordPress y asegurarnos de que funcione es hacerlo en el functions.php.

Si bien es cierto que no se trata de un problema demasiado grave, mi experiencia me ha enseñado que puede tener consecuencias indeseadas. La más obvia de todas se da en el momento en que tu tema se actualiza. Cuando instalas una nueva versión de tu tema, lo que hace WordPress es eliminar la versión antigua y sustituirla completamente por la nueva. En otras palabras, WordPress se acaba de cargar el fichero functions.php con todas tus personalizaciones y lo ha sustituido por uno nuevo y limpito. Créeme cuando te digo que no te hará ninguna gracia descubrir que has perdido todas las adaptaciones que hiciste…

Esto se puede solucionar, obviamente, con una copia de seguridad. Pero esto es más un apaño que una solución de verdad; después de cada actualización tendrías que acordarte de volver a aplicar los cambios que hiciste. Y tener que depender de «acordarse de las cosas» es la fórmula perfecta para meter la pata.

¡Uy! Alguien se ha olvidado de algo.
¡Uy! Me olvidé de actualizar el fichero otra vez…

La solución

Para evitar que una actualización del tema se cargue todas las personalizaciones que le has metido a tu WordPress basta con que… ¡no las metas en el tema! Obvio, ¿no? Pero, claro, si no puedes editar el fichero functions.php, ¿dónde pones el código? Pues bastará con que crees un pequeño plugin para ello. En una entrada anterior ya te expliqué cómo crear plugins en WordPress, pero vamos a recordar los pasos básicos.

En primer lugar, deberás crear un fichero PHP (llamémosle nelio-customizations.php) con la cabecera típica de un plugin de WordPress:

A continuación, añade todo el código que quieras, tal y como puedes ver aquí:

Finalmente, súbelo al directorio /wp-content/plugins/ de tu instalación y actívalo desde el Escritorio de WordPress » Plugins (se llama Customizations):

Lista de plugins
Plugin con nuestras personalizaciones, listo para ser activado.

Consejo Extra

Si quieres que tus personalizaciones estén disponibles y que ningún usuario administrador pueda desactivar el plugin sin querer, no subas el plugin a /wp-content/plugins/. En lugar de eso, súbelo al directorio /wp-content/mu-plugins/ (¡fíjate en el fragmento mu-!). Tal y como puedes leer en el Codex, los plugins que estén en ese directorio no se pueden desactivar desde el escritorio de WordPress, basta con que estén en ese directorio para que estén activos y se ejecuten antes que cualquier otro plugin. ¡Genial!

Imagen destacada de Viktor Kern.

9 respuestas a «TruquiTrucos Dev – Personaliza tu WordPress con un plugin (y olvídate del functions.php)»

  1. Avatar de WPFacil

    Hola. muy buen articulo. Me ha servido mucho.

    Solo me queda una duda. ¿Que pasa con los child themes? es otra forma de modificar functions.php , cierto?

    Cual es la forma recomendada?
    Pugin personalizado o child theme?

    Gracias
    Saludos

    1. Avatar de David Aguilera

      Sí, efectivamente crear un child theme es otra forma de realizar personalizaciones. El tema está en que todas aquellas personalizaciones que no formen parte de la apariencia de tu web no deberían estar expresadas en el tema. Es decir, cosas como tipos de contenido personalizados, opciones en el panel de administración, etc. están mejor en un plugin que en el tema.

      Otra cosa más: a veces el child theme es algo que no hemos hecho nosotros, sino que nos viene ya dado (estoy pensando en frameworks tipo genesis, donde el tema padre es el framework y el tema hijo es «el tema» que te vende el diseñador). En estos casos, de nuevo es mejor usar un plugin; de esta forma, cuando el diseñador/desarrollador saque una nueva versión del tema, podrás actualizar sin miedo a perder ningún cambio que hubieras puesto en el functions.php.

      Así que mi recomendación es: ¿afecta al tema? Ponlo en un child theme (si lo hiciste tú). ¿No es del tema o tienes un child theme que ha diseñado otra persona? Ponlo en un plugin.

  2. Avatar de Noelia Pérez
    Noelia Pérez

    Hola, tengo una duda respecto a la prioridad de ejecución del código.

    Dicen que si quieres modificar alguna acción de los archivos del tema Genesis, lo mejor es modificarlo en ‘functions.php’ de tu child theme, puesto que se ejecuta después de que esas acciones hayan sido creadas.

    Pero si al actualizar tu child theme se borran, dónde deberíamos colocarlo?

    Gracias y un saludo

    1. Avatar de David Aguilera

      Tal y como comento en la entrada, la solución está en meter tus personalizaciones en un plugin.

      Como imagino que ya sabes, WordPress puede extenderse mediante hooks. Básicamente, los plugins o temas usan las funciones add_action y add_filter para especificar que, cuando WordPress esté a punto de hacer una cierta acción o haya hecho una cierta acción (por ejemplo, cuando pinte lo scripts en head, o cuando recupere una entrada de la base de datos, o cuando muestre sus comentarios, etc), ceda un momento el control al plugin o tema para que haga sus cosas o adapte los resultados.

      En el caso de los child themes, lo más habitual es querer modificar las cosas que hace el padre. Por ejemplo, lo mismo el padre ha añadido una acción x para hacer algo en algún momento, y el tema hijo lo que quiere es quitar esa acción x y que no la haga. Lógicamente, el hijo tiene que quitar la acción después de que el padre la haya metido. Normalmente, todo el código que metes en un child theme se ejecuta después del código del padre, así que es por eso que te dicen que «metas tus personalizaciones en el functions.php del hijo».

      Si optas por añadir tus personalizaciones en un tema, lo único que tienes que tener en cuenta es que los remove_action y remove_filter que apliques para «deshacer» cosas del padre se tienen que realizar una vez el tema ya esté cargado. Es decir, tienes que meterlos en una función propia de tu plugin que esté vinculada (es decir, que sea el «callback») de la acción after_setup_theme. Aquí puedes ver una lista con todas las acciones relevantes de WordPress y el orden en que se ejecutan.

  3. Avatar de curro rodriguez
    curro rodriguez

    Por favor ayuda, es una idea buenísima pero me falla:

    Fatal error: Cannot redeclare mg_desactivar_editor_gb_pantalla_completa_por_default() (previously declared in /var/www/vhosts/tincan.es/noticiasit/wp-content/themes/ionMag/functions.php:125) in /var/www/vhosts/tincan.es/noticiasit/wp-content/plugins/customizations.php on line 39

    1. Avatar de David Aguilera

      Hola, Curro. El mensaje de error es bastante claro: te está diciendo que no puedes declarar una segunda vez algo (una función en tu plugin de personalizaciones) que ya existe en otro lado (esa misma función definida en el tema).

      En otras palabras: una vez has metido la función en el plugin, debes eliminarla de tu tema para que no esté duplicada.

  4. Avatar de curro rodriguez
    curro rodriguez

    Toma ya, solucionado¡¡¡¡
    Muchísimas gracias, me quitas un montón de trabajo.
    Buen finde
    Curro

  5. Avatar de Neuro
    Neuro

    A mi no me funciona brother, activo el plugin pero no aplica los cambios de las funciones nuevas. Que crees que pueda ser?

    1. Avatar de David Aguilera

      Si has probado el ejemplo que pongo en la entrada (el que se supone que añade un texto en el footer), es posible que solo funcione si tienes instalada la última versión de WordPess. Si no recuerdo mal, cuando hay actualizaciones pendientes, creo que el texto luego lo sobrescribe WordPress con el aviso de que hay una actualización por instalar.

      Si el problema que tienes es diferente, sube tu plugin a un gist de github o a alguna web con la que compartirlo con nosotros y le echo un vistazo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad de Nelio Software

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.