Veo, veo y reveo preguntas en WPSE del tipo ¿Cómo hacer tal cosa sin utilizar un plugin?. Y respuestas que, aunque sea de forma implícita, son del tipo Puedes hacer tal cosa sin un plugin de tal o cual modo. Sin embargo hay una respuesta más corta. Elimina las cabeceras que convierten un archivo .php en un plugin para WordPress y listo, el script dejará de ser un plugin.

Y digo yo. ¿Qué problema tienes con los plugins? Ahhhh, que has escuchado que tener muchos plugins hará tu sitio lento y por eso quieres pasar la funcionalidad de un plugin al tema. Pues tienes que saber que cada plugin instalado y activado en WordPress implica un include extra para su carga. Si eres capaz de detectar una diferencia de velocidad entre 1 o 20 include, enhorabuena, eres una persona con una capacidad de percepción excepcional. Lo que puede hacer lento a tu sitio es lo que hace cada plugin y no el hecho de tener 1 o 100.

Si hacer algo a través de un plugin, por el hecho de ser un plugin, tiene un impacto insignificante en la performance, ¿por qué pasarlo al tema?. Para mí hay varios e importantes inconvenientes de llevar características de plugins a los temas:

  1. si cambias de tema, pierdes la funcionalidad que te daba ese código
  2. tienes que duplicar el código en cada tema en el que quieras esa característica
  3. si cargas tus temas con numerosos scripts, te será más difícil organizar el trabajo de mantenimiento y desarrollo
  4. si mejoras o añades algo al código no puedes hacer un roll-out general, habrá que actualizar cada tema
  5. ….. ¿algún inconveniente más que se te ocurra? Dímelo por favor que lo añada a la lista.

Y ventajas …. a ver ….. no se me ocurre ninguna. Los inconvenientes anteriores y la ausencia de ventajas me ha llevado a que prefiera organizar diferentes funcionalidades fuera de los temas y en plugins separados que puedo mantener más fácilmente, que hacen posible reutilizar el mismo código para múltiples webs, hacer actualizaciones para todas a la vez y prevenir la pérdida de funciones si se cambia de tema, todo ello sin un efecto en la performance mínimamente perceptible.

Entiendo, sin embargo, que este tipo de preguntas se puedan referir en realidad a como hacer algo sin ir a buscar un plugin de terceros. Bien porque ningún plugin existente se adapte a las necesidades concretas que tengamos o bien porque se quiera aprender a hacerlo uno mismo. Así que la pregunta real sería simplemente como hacer algo, sin más.

Esta pregunta ya tiene mucho más sentido y yo mismo voy por este camino muchas veces. Por ejemplo, quiero una determinada característica y el plugin del directorio “oficial” que la tiene viene con 100 características más que no voy a necesitar; si instalo varios de estos plugins puedo terminar con cientos o miles de líneas de código que nunca voy a utilizar y que efectivamente pueden hacer mi sitio más lento o, en el mejor de los casos, igual de rápido pero consumiendo más recursos de mi servidor. Así que, me puedo preguntar como hacer tal cosa en WordPress.

Pongamos un ejemplo que me parece muy ilustrativo. Supongamos que necesitas un custom field (quien dice uno, dice 10) y te instalas el plugin ACF. Este plugin es genial pero desde luego no es apropiado si necesitas un sólo custom field. El código para tres custom fields, con su meta box y todo listo para su uso ocupó en este ejemplo unas pocas líneas y apenas 4 KB; ACF es un plugin que, sólo el código PHP, ocupa casi 500 KB (más de 1 MB incluyendo js, css e imágenes) y algunas veces puede afectar a la velocidad de respuesta.

En este caso la pregunta correcta como desarrollador sería ¿Cómo añadir meta fields personalizados a un post?. Si esos custom fields tienen que ver específicamente con el diseño y maquetación visual, ponlos en el functions.php de tu theme, si no, crea un plugin para añadir esta funcionalidad independientemente del aspecto de tu web.

Pongamos otro ejemplo sencillo. Quieres que la sesión de los usuarios dure un año. Se podría hacer con este código en functions.php del tema:

add_action( 'auth_cookie_expiration', 'cyb_remember_user_for_one_year' );
function cyb_remember_user_for_one_year( $expire ) {
  return 31536000;
}

O, muchísimo mejor desde todas las perspectivas, en este sencillo plugin:

/**
 * Plugin Name: Login por 1 año
 * Plugin URI:  http://ejemplo.com
 * Description: Aumenta la validez de la cookie de autentificación hasta un año.
 * Author:      Tu Nombre Aquí
 * Author URI:  http://ejemplo.com
 * Version:     0.1.0
 */
add_action( 'auth_cookie_expiration', 'cyb_remember_user_for_one_year' );
function cyb_remember_user_for_one_year( $expire ) {
  return 31536000;
}

Te ahorrarás todos los inconvenientes de ponerlo en un theme y tendrás todas las ventajas de tener las funcionalidades separadas. ¿Impacto en performance? CERO.

No digo que utilices plugins o que no los utilices, digo que evalúes cuándo es necesario y cuándo no, y que la pregunta ¿Cómo crear “tal cosa” sin un plugin? debería ser en realidad un simple ¿Cómo crear “tal cosa”? y que, además, no pienses que hacer “tal cosa” en un plugin o en el tema va a suponer diferencia perceptible en cuánto a velocidad de ejecución.

Y si un plugin tiene exactamente lo que necesitas, utilízalo, no te lo pienses. Por ejemplo, entre los plugins que utilizo en cybmeta.com está CodePen oEmbed, ¿por qué pondría yo el código de ese plugin en mi tema o en otro plugin si no me ofrece absolutamente ninguna ventaja?.

  • Oscar Ballesteros

    :O es verdad, siempre pensé que entre mas plugin tenia activos, mas lento seria mi sitio, de hecho esa es una respuesta frecuente que dan en el soporte de varios hosting… Gracias por la aclaracion. Una pregunta Juan, ¿en que lugar especificamente deberia poner el archivo del plugin en mi instalacion de wordpress?

  • elfaleito

    Muy interesante el artículo CybMeta!!! Gracias 😉