En muchos de los artículos del blog de la Zona DPW indico trozos de código, funciones o snippets para conseguir la funcionalidad en nuestra web o la de los clientes a lo que necesitamos.
Siempre os comento que ese código podemos añadirlo en el archivo functions.php de nuestro child theme o en un archivo cómo Code Snippets, pero recientemente me han preguntado varias veces que opción es mejor y cómo lo hago yo, si utilizo el plugin y cuando, así que en este post quiero compartir unas cuantas indicaciones sobre cómo lo hago yo y cuando uso un método u otro.
Functions.php
El archivo functions.php de nuestro child theme o tema hijo contiene todas aquellas instrucciones necesarias para preparar la plantilla según lo que queramos mostrar. Es decir, podemos añadir o eliminar widget areas, recolocar contenido, y especificar que elementos queremos mostrar en nuestro theme y cómo queremos mostrarlos.
Todos los temas traen el archivo functions.php que no debemos modificar ya que se perderían los cambios con las actualizaciones, por eso es una buena práctica crear un tema hijo o child theme y usar su archivo functions.php para realizar todos esos ajustes o personalizaciones.
Todas las funciones que añadimos en este archivo deben ser relativas al theme que se está utilizando, ya que al cambiarlo se perderán.
Es decir, si estamos trabajando con Genesis Framework, por ejemplo, cualquier modificación que queramos hacer en el child theme que estamos utilizando podremos hacerla en su archivo functions.php
Ejemplos de snippets de código típicos para functions.php
- Añadir/eliminar widgets areas, sidebars o menús
- Recolocar u ocultar elementos cómo la información de un post, el título o la imagen.
- Ajustes en la cabecera o en el pie de página de la web
Sin embargo, existen muchas otras funciones que podemos necesitar que son independientes del tema. Todas estas son las que se aconsejan añadir en un plugin (ya sea un plugin propio creado expresamente para ello, o uno tipo Code Snippets, del que ya hemos hablado en muchas ocasiones)
Plugin para snippets de código
Cómo comentábamos, utilizaremos un plugin para añadir snippets de código siempre que éstos no esten relacionados directamente con el theme que estamos usando.
Yo utilizo Code Snippets o plugin propio, mientras estoy preparando y probando los sitios pero hay otros, y algunos ejemplos de para qué lo utilizo serían:
- Para crear Custom Post Types y el código necesario para mostrarlos, por ejemplo mediante shortcodes.
- Para ajustar el funcionamiento de algunos plugins, como WooCommerce en caso de tiendas online
- Para personalizar el escritorio de WordPress para otros usuarios (editores o autores), simplificando los menús y añadiendo paneles de ayuda.
- Para modificaciones temporales: mensajes de promociones temporales, avisos de campañas, vacaciones, etc..
Una de las ventajas de Code Snippets que ya habíamos comentado, es la posibilidad de importar/exportar códigos, y tener así una biblioteca propia para funcionalidades que nos piden con frecuencia, y también permite ajustar la prioridad del código e indicar si será necesario en toda la web o sólo en el front-end o back-end, evitando así que se carguen códigos innecesarios en partes de la web que no lo van a necesitar.
La desventaja, es que todos estos códigos se guardan en la base de datos, algo no recomendado por temas de seguridad, por lo que una vez son definitivos, la mejor opción es pasar éstos códigos a un plugin propio o incluso un must-use-plugin.
Espero que con estas indicaciones te haya podido ayudar a decidir dónde añadir los snippets de código que necesites para ajustar y personalizar WordPress. Si tienes cualquier duda, puedes utilizar los comentarios para consultarme y estaré encantada de poder ayudarte.
Comentarios
9 respuestas a «Cuando realizar las modificaciones en functions.php y cuando usar un plugin»
|
Hola Esther!
Agradecería me ayudaras con esto:
Estoy tratando de cambiar el número de widget del footer del child theme News Pro de 6 a 3.
He probado a colocar estas 2 lineas de código en el plugin Code Snippets (y también en Woody ad snippets):
remove_theme_support( ‘genesis-footer-widgets’, 6 );
add_theme_support( ‘genesis-footer-widgets’, 3 );
Pero con ninguno de los 2 plugin mencionados logró realizar el cambio.
Si modifico directamente el número de widget en el function.php , de una se aplica. Pero se que no es una buena practica porque en cualquier momento puede haber una actualización pare este child theme y todo se perdería
¿Que estoy realizando mal ?
Un saludo de un suscriptor desde Medellín, Colombia
|
Hola Eduardo!
Por lo que me explicas creo que el problema es el orden en el que se ejecutan las funciones, es decir, la que viene con el child theme sobreescribe la que estás poniendo mediante el plugin.
Para evitarlo, puedes probar añadiendo una prioridad, add_theme_support( ‘genesis-footer-widgets’, 3, 5 );
La prioridad por defecto suele ser 10, poniendo una inferior cambiaras el orden en que se ejecutan.
De todas formas, los child themes de Genesis pocas veces se actualizan y es bastante habitual realizar los cambios directamente en los archivos, yo suelo hacerlo así. Otra cosa es si son funcionalidades importantes que quiero que sean independientes del theme, y que se mantengan si algún dia lo cambio, en ese caso si lo añado en un plugin. En este artículo comento cuando utilizo una u otra opción: https://www.esthersola.com/modificar-functions-code-snippets/
Saludos!
|
Hola:
Me estoy dejando los cuernos con una función que no se por qué no me funciona. Lo que quiero es que solo pueda acceder a una categoría concreta y a unos productos concretos el rol «subscriber». Hasta la categoría funciona bien, pero cuando añado el tag «is_product», deja de mirar los productos que pongo y bloquea todos los de la tienda, como si hubiera puesto «is_product()».
Te agradecería muchiiisimo si me puedes echar una mano
Mil gracias!
function visible_segun_rol_de_usuario(){
$current_user = wp_get_current_user();
$allowed_user_role = ( ‘subscriber’);
if ( ( !in_array( $allowed_user_role, $current_user->roles ) ) &&
( is_product_category (‘categoria-privada’) || is_product( array(‘ejemplo1′,’ejemplo2’)) )) {
wp_redirect( get_permalink( get_option( ‘woocommerce_myaccount_page_id’ ) ) );
exit;
}
}
add_action( ‘template_redirect’, ‘visible_segun_rol_de_usuario’ );
|
Hola Roberto!
El condicional is_product() sólo comprueba si estás en una página de producto, no admite parámetros. Para detectar si estás en un producto en concreto debes utilizar is_single(array(17,18)) o con el nombre: is_single(array(‘ejemplo 1’, ‘ejemplo 2’)).
Aquí tienes más detalle de los condicionales de WooCommerce: https://docs.woocommerce.com/document/conditional-tags/#
Un saludo!
|
Genial, muchas gracias, era eso!
|
Perfecto! Me alegra haber podido ayudarte 🙂
|
Hola Esther!.
Leí tu post que trataba de agregar código mediante el plugin code snippets para la ocultación del carrito y eliminar el botón de ver el carrito en la página de finalizar compra de carrito de woocommerce.
Éste es el código para eliminar el botón de la página:
function ocultar_wc_add_to_cart_message( $message, $product_id ) {
if($product_id!=2567) return $message;
else
return »;
};
add_filter( ‘wc_add_to_cart_message’, ‘ocultar_wc_add_to_cart_message’, 10, 2 );
Introducí la id!=2567, que es la que corresponde a un producto y me funcionó, pero cuando le añado otro código igual cambiando la id del producto me da error la web.
¿Qué debo hacer para que oculte el botón en los demás productos?
Gracias anticipadas.
|
Está hecho!!!, he releído tu artículo. Gracias.
|
Perfecto!, la idea es añadir en el condicional los diferentes ids de producto, no crear una función para cada uno, porque entonces es cuando da error.
Saludos,
esther.