Una de las ventajas que tiene WordPress es su enorme (y cada día mayor) comunidad de usuarios. Y no hablo sólo del número de personas, sino también del espíritu. Supongo que es porque se trata de un software de código abierto, pero lo cierto es que el espíritu de la comunidad WordPress es ayudar desinteresadamente.
Por eso es habitual que, si tienes algún problema o duda con WordPress, ésta se encuentre ya resuelta en alguno de los innumerables foros o blogs que hay en internet. Y a menudo la solución pasa por algún pequeño trozo de código o alguna función personalizada que hay que añadir.
Es común en estos casos que se aconseje añadir este código personalizado en el archivo functions.php. De hecho, es lo habitual, y cuando ves algún mensaje de ese tipo suele decir Añade este código al final de tu archivo functions.php.
Sin embargo, añadir ahí el código personalizado no es la mejor opción. Voy a intentar explicarte por qué y dónde debería añadirse este código para no tener problemas en el futuro.
Tabla de contenidos
El archivo functions.php
Como digo, lo habitual es que se recomiende utilizar este archivo, que está en /wp-content/themes/tu-theme-activo/functions.php.
Hay que decir que, aunque no es uno de los archivos que es obligatorio incluir en un theme de WordPress, prácticamente todos lo incluyen. De hecho, yo aún no he llegado a ver ninguno que no lo tenga, debido a su gran utilidad.
Funciones en el archivo functions.php
Esto es debido a que, como este archivo es (en caso de que exista) lo primero que revisa WordPress, el código que se incluya en él se cargará de inmediato. Por eso suelen ponerse ahí las funciones que los temas necesitan para su correcto funcionamiento.
Y es por eso también por lo que se recomienda colocar ahí el código personalizado: está a mano (se puede indicar de forma rápida a un usuario con pocos conocimientos dónde encontrarlo), está en todas las instalaciones y precisamente su función es albergar código personalizado. En apariencia perfecto.
Actualizaciones y cambios de plantilla
Sin embargo es una solución fácil y rápida, pero no demasiado aconsejable a largo plazo, principalmente por dos motivos: primero que los themes se actualizan, y segundo que antes o después querrás cambiar la plantilla de tu página.
Cuando una plantilla se actualiza lo que ocurre básicamente es que se descarga de nuevo y los archivos antiguos se sustituyen completamente por los nuevos. Sí, efectivamente, eso incluye el archivo functions.php. Eso significa que si tu theme se actualiza, perderás todo el código que hayas introducido en ese archivo.
Esto se puede evitar gracias a la buena práctica de hacer todas las modificaciones en un child theme o tema hijo, aunque desgraciadamente no todo el mundo lo hace.
Sin embargo el uso de un tema hijo no evita el problema en el segundo de los casos, y es que cuando quieras cambiar la plantilla de tu web (y querrás hacerlo antes o después por mucho que ahora creas que la que estás usando te encanta y te va perfecta) te encontrarás el mismo problema:
El archivo functions.php va unido a tu plantilla, y si cambias ésta pierdes su contenido.
Crear tu propio plugin de funciones personalizadas
¿Dónde debería entonces poner mi código personalizado para que esté siempre disponible, aún cuando el theme se actualice o decida cambiarlo? La respuesta es simple: en un plugin.
Los plugins están, de hecho, pensados para eso: incluyen su propio código, son independientes de las plantillas y también de las actualizaciones de WordPress.
Ése es el sitio ideal para tu código: haz tu propio plugin de funciones personalizadas; mientras tengas el plugin activado, tu código estará ahí, cumpliendo su función. Independientemente de todo lo demás.
Crear tu plugin personal
Ya sé lo que estás pensando: crear un plugin suena demasiado técnico, y seguramente te cueste tiempo y esfuerzo (que no tienes) en aprender a hacer algo que no necesitas aprender. Error, hacer un plugin para tu propio código es lo más sencillo del mundo.
¿Qué necesitas? Bueno, pues básicamente un archivo de texto que se llame mi-plugin.php (es un ejemplo, le pones el nombre que te dé la gana) y con el siguiente contenido:
Ya está hecho. Así de fácil. Es más, de todas esas líneas sólo la de Plugin Name es obligatoria, las demás no hace falta ponerlas si no quieres (las que contienen los símbolos «<?php», «/*» y «*/» sí, son absolutamente necesarias).
Ahí, a continuación de */, puedes añadir todo el código que necesites y nunca, se actualice lo que se actualice en tu web, perderá su funcionalidad. Siempre que mantengas ese plugin activado, claro está.
Para instalarlo, simplemente súbelo por FTP al directorio /wp-content/plugins/ o comprímelo a ZIP y utiliza la opción Plugins > Añadir nuevo > Subir plugin. Activar y listo.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Pluginception
Todavía tienes una alternativa más fácil. ¿Qué tal si te dan todo ese trabajo hecho? Pues es posible gracias a un plugin: Pluginception.
Pluginception es un plugin gratuito que sirve únicamente para crear un nuevo plugin vacío dentro de tu WordPress. Un plugin que luego tú podrás usar para poner tus funciones personalizadas.
Crear un plugin con Pluginception
Ya has visto que crear un plugin vacío donde poner tu código es muy fácil, pero es que con esta utilidad es más sencillo todavía. Sólo tienes que activarlo y te aparecerá una nueva opción en el menú de plugins: Plugins > Create a New Plugin.
Ahí encontrarás una pantalla donde te pide los datos necesarios para la creación del plugin: su nombre, descripción, autor, versión, licencia… Como antes, el único imprescindible es el primero (Plugin Name), y los demás son opcionales.
Cuando hayas rellenado los datos sólo tienes que pulsar el botón Create a blank plugin and activate it! y listo, tu plugin se ha creado y activado, y además te lo deja abierto en edición a la espera de que le pongas tu código. No puedes decir que te ponga las cosas difíciles, ¿verdad?
Una vez creado tu plugin, puedes desactivar e incluso borrar Pluginception. Ya ha hecho su trabajo y no es necesario mantenerlo instalado si no quieres.
Conclusiones
Pues ya lo has visto. Sí, es cierto que el archivo functions.php es muy cómodo y está muy a la mano, pero también es cierto que no es la mejor opción para poner tu código a medio o largo plazo.
Además, también has podido ver que crear tu propio plugin para ello es igual de cómodo y que es una solución infinitamente mejor.
Así que ya no tienes excusa: la próxima vez que leas Añade este código en tu functions.php asiente despacito y sonríe con cara de estar de vuelta de todo.
buenas despues de instalar el snipetts me dice esto y no me deja acceder al escritorio
Parse error: syntax error, unexpected ‘id’ (T_STRING), expecting ‘]’ in /homepages/16/d554502350/htdocs/clickandbuilds/EvrMotorSport/wp-content/plugins/code-snippets/php/snippet-ops.php(384) : eval()’d code on line 1
me puedes ayudar
Hola Carlos
Tendrás que acceder por FTP y eliminar la carpeta del plugin para poder tener acceso de nuevo al escritorio.
Un saludo.
Hola Enrique,
Entiendo por tanto que al incluir el código personalizado en un plugin, es el mismo concepto que el fichero FUNCTIONS.PHP pero con la ventaja de que no se perderá en futuras actualizaciones.
El orden de ejecución de las diferentes funciones es igual que el fichero FUNCTIONS.PHP ¿Correcto?
Como siempre muchas gracias
Hola Jose
Sí, básicamente un plugin es totalmente independiente del theme, así que tus funciones seguirán ahí aunque el theme se actualice o cambies a otra plantilla.
En cuanto al orden de ejecución, es siempre MU-PLUGINS > PLUGINS > THEME, con lo que las funciones en un plugin se ejecutan antes que las funciones en functions.php.
Eso puede dar lugar a algún pequeño quebradero de cabeza cuando estás ejecutando una función mediante plugin y luego el theme la sobreescribe (algunos desarrolladores de themes tienen malas costumbres en cuanto a eso), como hacer uso del hook woocommerce_product_add_to_cart_text para cambiar el texto del botón Añadir al carrito y que luego venga el theme y ponga el suyo propio, porque el desarrollador pensó que con su diseño quedaba mejor un texto determinado ¬¬
Pero en fin, eso es hilar fino (ahí entraría también el tema de las prioridades) y algo que importa más a desarrolladores que al usuario medio, que es a quien está dirigido el artículo 🙂
Un saludo.
Wow! Gracias Enrique por el truco de crear nuestros propios plugins ¡Súper valioso!
Me alegra que te haya sido útil 🙂
Un saludo.
Hola, Enrique!
Estoy pegando una buena repasada a tu web, hay contenido útil no, lo siguiente.
Fíjate que mi duda proviene de una de tus repuestas en los comentarios.
Por qué debe ser esta ruta: MU-PLUGINS > PLUGINS > THEME yo hice un plugin siguiendo tus recomendaciones, pero hasta después me di cuenta del comentario donde mencionas esa ruta, así que la ruta mía fue Content > plugins.
Para finalizar, entonces en el plugin creado es donde debo incluir el código para Eliminar el JavaScript que bloquea la visualización en WordPress (sin plugins)
Aquí me salta otra duda, dices sin plugins.
jajaajjajajajajjaja, es lo malo cuando uno se pega un atracón con una web.
Gracias anticipadas por la respuesta.
Jacobo.
Hola Jacobo
Me alegra que los contenidos del blog te sean útiles 🙂
MU-PLUGINS > PLUGINS > THEME no es una ruta, sino el orden de ejecución de las funciones. WordPress ejecuta primero las contenidas en los mu-plugins, después las de los plugins y por último las del theme.
En cuanto a lo de «sin plugins» (jajaja, hilas fino) quiere decir en realidad «sin plugins comerciales» (ya sean de pago o gratuitos). Estos plugins han de adaptarse al mayor número de situaciones y configuraciones posibles, lo que implica una gran carga de código extra, opciones (con las consiguientes consultas a la base de datos), etc. En el caso de un plugin personalizado o de un código que tú implementes a través de tu propio plugin el impacto sobre la web es mínimo, ya que precisamente está hecho a medida para esa web.
Un saludo
Buenas noches, por favor aclarame una duda, hice mi plugin asi:
get_results($q);
foreach ( $res as $page )
{
$idfreq = $page->idfrecuencia;
$freq = $page->frecuencia;
}
$freq = $freq + 1;
$tabla = «frecuencias»;
$datosACambiar = array(‘frecuencia’=>$freq);
$condicion = array(‘idfrecuencia’=>$idfreq); //where idfrecuencia=$idfreq
$wpdb->update($tabla, $datosAcambiar, $condicion);
}
?>
el cual funciona, es decir, incrustado en mi codigo principal hace lo que quiero que haga..
pero al llamar la funcion de esta manera:
add_action(‘wp’, actualizarFreq($lot,4,$num));
No me hace nada… que puede estar pasando?…gracias
¿Os pasa a alguno que el plugin creado con Pluginception está inactivo y no hay forma de activarlo?
excelente me alegro haber conocido tu pagina gracias por esa explicación demasiado GENIAL.
Hola Enrique
Repaso éste post que leí hace tiempo y tenía guardado buscando algo que no encuentro.
Me queda la duda de dónde debo insertar las líneas de código que en algunos post nos recomiendan insertar en el archivo config.php.
No sé si debo copiar el archivo config.php (con contenido o en blanco) en mi tema hijo e insertarlas ahí.
No sé si aunque al autor recomienda insertarlas en el archivo config.php se pueden insertar en el functions.php del tema hijo y es ahí donde deben ir.
No sé si deben insertarse necesariamente en el config.php del tema padre.
Espero que se entienda mi duda. Un saludo y gracias por generar contenido tan valioso.
Hola Joaquín
No, lo que va en el archivo wp-config sólo puede ir ahí, en ningún otro sitio, y no puedes copiarlo en el tema hijo (bueno, puedes, pero no serviría de nada) 🙂
Asegúrate de guardarte una copia de seguridad antes de modificarlo, que hombre prevenido vale por dos.
Un saludo.
Gracias por responder, maestro¡¡¡ Con éste asunto tenía un esguince mental que me has aclarado.. Un saludo
Excelente posteo!
Di muchas vueltas y la verdad que acá está todo solucionado, con Pluginception + ese pedacito de código quedó todo perfecto.
Gracias
Muchas gracias Enrique¡¡
Siendo yo el más torpe de los torpes en estos asuntos de códigos, etc he entendido muy bien la explicación y con el plugin lo he conseguido.
Enhorabuena:)