9 códigos más para WooCommerce: ajustes que te ahorran plugins

Después del éxito que tuvo en su día el artículo con los 9 primeros códigos para WooCommerce, toca subir la apuesta. Aquí tienes otros nueve snippets que llevan años circulando por foros y proyectos reales, pero que la mayoría de tutoriales explican mal o directamente sin contexto. Y eso, cuando hablamos de la pasarela de pago de tu tienda, no es un detalle menor.

WooCommerce es un plugin enorme, con cientos de hooks, y eso significa que casi todo se puede ajustar sin instalar otro plugin encima. Mover textos, cambiar el flujo del carrito, añadir un campo en checkout, forzar un pedido mínimo: todo eso son tres líneas en functions.php bien puestas. El problema no es que falten ejemplos en internet, es que muchos están copiados de copias y ya no funcionan en versiones recientes. Estos sí.

Antes de pegar nada en functions.php

Tres reglas mínimas y nos ponemos. La primera: no toques el functions.php del tema padre. Si actualizas el tema, te cargas el código. Usa un tema hijo o, mejor aún, el plugin Code Snippets para añadir cada fragmento como una entrada independiente que puedas activar y desactivar en un clic. La segunda: prueba siempre en un entorno de staging antes de tocar producción, sobre todo si la tienda factura. La tercera: ten una copia de seguridad reciente. Un error de sintaxis tira la web entera.

Si te falta una herramienta para revisar cómo está tu instalación antes de meterte en harina, échale un ojo a Site Audit Snapshot: te da un diagnóstico rápido del estado del WordPress en un solo clic. Útil sobre todo cuando heredas una tienda de otra agencia y no sabes muy bien con qué te has casado.

Códigos PHP para personalizar WooCommerce sin instalar plugins

1. Mostrar el método de pago en el correo del pedido

WooCommerce envía un correo al cliente con el resumen del pedido, pero por defecto no incluye el método de pago elegido. Si vendes con varias pasarelas (Bizum, transferencia, contra reembolso, Stripe), saberlo de un vistazo en el correo del administrador te ahorra abrir el pedido en el panel cada vez. Este snippet añade el método justo después de la tabla del pedido, solo en el correo que recibe el admin.

add_action( 'woocommerce_email_after_order_table', 'anadir_metodo_pago_correo', 15, 2 );

function anadir_metodo_pago_correo( $order, $is_admin_email ) {
    if ( $is_admin_email ) {
        echo '<p><strong>Método de pago:</strong> ' . $order->get_payment_method_title() . '</p>';
    }
}Lenguaje del código: PHP (php)

Detalle: usamos $order->get_payment_method_title() en lugar del antiguo $order->payment_method_title directo. Desde WooCommerce 3.0 el acceso a propiedades del objeto pedido se hace por getters, y la versión vieja lanza avisos en logs.

2. Redirigir al checkout cuando se añade un producto al carrito

Si vendes un único producto o tu objetivo es que el usuario pase por caja sin pasearse por la tienda, este snippet manda al checkout en cuanto pulsa «añadir al carrito». No siempre conviene: en una tienda con catálogo amplio, te cargas la venta cruzada. Pero en formaciones online, un servicio único o productos digitales, va de lujo.

add_filter( 'woocommerce_add_to_cart_redirect', 'redireccionar_al_checkout' );

function redireccionar_al_checkout() {
    return wc_get_checkout_url();
}Lenguaje del código: JavaScript (javascript)

Aquí también modernizamos: el filtro correcto es woocommerce_add_to_cart_redirect (con el prefijo) y para obtener la URL del checkout, wc_get_checkout_url(), una función helper que ya no depende de la variable global $woocommerce.

3. Traducir textos sueltos sin tocar archivos .po

Los archivos de traducción .po y .mo son la vía oficial, pero a veces solo necesitas cambiar un par de cadenas concretas: «Choose an option» por «Selecciona una variante», «Out of stock» por «Agotado, avísame». Para eso, este filtro hace el trabajo en caliente sin tocar nada del tema ni del plugin.

add_filter( 'gettext', 'traducir_textos_sueltos', 20, 3 );
add_filter( 'ngettext', 'traducir_textos_sueltos', 20, 3 );

function traducir_textos_sueltos( $translated, $text, $domain ) {
    if ( $domain === 'woocommerce' ) {
        $traducciones = array(
            'Choose an option' => 'Selecciona una opción',
            'Out of stock'     => 'Agotado',
        );
        if ( isset( $traducciones[ $text ] ) ) {
            return $traducciones[ $text ];
        }
    }
    return $translated;
}Lenguaje del código: PHP (php)

Importante: aplicar el filtro a todos los textos del sitio sin filtrar por dominio ($domain === 'woocommerce') penaliza el rendimiento, porque gettext se dispara cientos de veces por carga. Acota siempre.

4. Excluir categorías del widget de categorías de producto

Hay categorías que usas internamente (regalos, descontinuados, ofertas privadas) y que no quieres ver listadas en el widget público. Esto las saca del listado sin tener que ocultarlas en la base de datos.

add_filter( 'woocommerce_product_categories_widget_args', 'woo_product_cat_widget_args' );

function woo_product_cat_widget_args( $cat_args ) {
    $cat_args['exclude'] = array( 16, 42 ); // IDs de las categorías a excluir
    return $cat_args;
}Lenguaje del código: PHP (php)

Sustituye los IDs por los de tus categorías. Los encuentras en Productos > Categorías, pasando el ratón sobre el nombre: en la URL del enlace de edición aparece tag_ID=XX.

5. Añadir un campo personalizado a las variaciones de producto

Las variaciones de WooCommerce traen los campos típicos (precio, SKU, stock, peso), pero a veces necesitas algo extra: un código de proveedor, una nota interna, un identificador de almacén. Este bloque añade un campo de texto a cada variación, lo guarda y lo deja disponible en el meta del producto.

// 1) Mostrar el campo en cada variación
add_action( 'woocommerce_variation_options_pricing', 'campo_extra_variacion', 10, 3 );
function campo_extra_variacion( $loop, $variation_data, $variation ) {
    woocommerce_wp_text_input( array(
        'id'          => 'codigo_proveedor[' . $loop . ']',
        'label'       => 'Código de proveedor',
        'value'       => get_post_meta( $variation->ID, '_codigo_proveedor', true ),
        'wrapper_class' => 'form-row form-row-full',
    ) );
}

// 2) Guardar el campo al actualizar el producto
add_action( 'woocommerce_save_product_variation', 'guardar_campo_variacion', 10, 2 );
function guardar_campo_variacion( $variation_id, $i ) {
    $valor = isset( $_POST['codigo_proveedor'][ $i ] ) ? sanitize_text_field( $_POST['codigo_proveedor'][ $i ] ) : '';
    update_post_meta( $variation_id, '_codigo_proveedor', $valor );
}Lenguaje del código: PHP (php)

Esta versión está actualizada respecto a la original: usa woocommerce_variation_options_pricing y woocommerce_save_product_variation, que son los hooks vigentes desde hace ya varias versiones. Y sanitiza el input con sanitize_text_field(), que es lo mínimo que se le pide a cualquier dato que llega por $_POST.

6. Cambiar «Añadir al carrito» a «Producto ya en el carrito»

Pequeño detalle de UX que la mayoría de tiendas pasa por alto: si el cliente ya tiene un producto en el carrito, mostrarle de nuevo el botón «Añadir al carrito» es confuso. Con este snippet, el botón cambia el texto cuando detecta que ese producto concreto ya está añadido.

// En la ficha del producto
add_filter( 'woocommerce_product_single_add_to_cart_text', 'texto_boton_carrito_single' );
function texto_boton_carrito_single( $default ) {
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( get_the_ID() === $item['product_id'] ) {
            return __( '¿Añadir otra vez?', 'woocommerce' );
        }
    }
    return $default;
}

// En el archivo de productos (catálogo)
add_filter( 'woocommerce_product_add_to_cart_text', 'texto_boton_carrito_loop', 10, 2 );
function texto_boton_carrito_loop( $default, $product ) {
    foreach ( WC()->cart->get_cart() as $item ) {
        if ( $product->get_id() === $item['product_id'] ) {
            return __( 'Ya en el carrito', 'woocommerce' );
        }
    }
    return $default;
}Lenguaje del código: PHP (php)

El cambio respecto al original es que add_to_cart_text sin prefijo está deprecado: el filtro vigente es woocommerce_product_add_to_cart_text y recibe el objeto producto como segundo argumento, lo que evita tener que recurrir a globals.

7. Hacer obligatorios campos del checkout

WooCommerce trae un set de campos obligatorios razonable, pero si necesitas forzar otros (NIF/CIF para facturas, teléfono, segunda dirección), este filtro te deja marcarlos como required sin pasar por plugins de campos extra.

add_filter( 'woocommerce_checkout_fields', 'campos_obligatorios_checkout' );

function campos_obligatorios_checkout( $fields ) {
    $fields['billing']['billing_phone']['required']   = true;
    $fields['billing']['billing_company']['required'] = true;
    return $fields;
}Lenguaje del código: PHP (php)

Antes de marcarlos como obligatorios, asegúrate de que tiene sentido para tu cliente: cada campo extra en el checkout es fricción y se nota en la tasa de conversión. Si vendes B2B, claro que pides CIF; si vendes camisetas a particulares, no añadas «empresa» porque sí.

8. Cambiar el remitente de los correos de WooCommerce

Por defecto, WordPress envía los correos desde [email protected]. Eso es exactamente lo que más penaliza la entregabilidad: dirección genérica, sin reputación, y muchos servidores la mandan a spam directamente. Cámbialo por una dirección real de tu dominio y, si puedes, configura SPF, DKIM y DMARC.

add_filter( 'wp_mail_from', 'mail_from_personalizado', 99 );
function mail_from_personalizado( $email ) {
    return '[email protected]';
}

add_filter( 'wp_mail_from_name', 'mail_from_name_personalizado', 99 );
function mail_from_name_personalizado( $nombre ) {
    return 'Tu Tienda Online';
}Lenguaje del código: PHP (php)

Hemos añadido el filtro wp_mail_from_name, que el snippet original no incluía, porque sin él el correo se ve como «WordPress <[email protected]>» y queda raro. Y para entregabilidad de verdad, plantéate WP Mail SMTP con un servicio externo tipo Brevo, Mailgun o Amazon SES.

9. Establecer un pedido mínimo

Para tiendas con productos de bajo importe o donde el coste de envío se come el margen, fijar un pedido mínimo evita ventas que cuestan dinero. Este snippet bloquea el checkout si el carrito no llega al importe que decidas.

add_action( 'woocommerce_checkout_process', 'pedido_minimo_obligatorio' );
add_action( 'woocommerce_before_cart', 'pedido_minimo_obligatorio' );

function pedido_minimo_obligatorio() {
    $minimo = 30; // importe mínimo en €
    $total  = WC()->cart->get_subtotal();

    if ( $total < $minimo ) {
        $mensaje = sprintf(
            'Tu pedido es de %s €, pero el mínimo para comprar es %s €. Añade más productos al carrito.',
            wc_price( $total ),
            wc_price( $minimo )
        );
        if ( is_cart() ) {
            wc_print_notice( $mensaje, 'error' );
        } else {
            wc_add_notice( $mensaje, 'error' );
        }
    }
}Lenguaje del código: PHP (php)

Mejoras sobre el original: ahora el aviso aparece tanto en el carrito como al intentar pagar (no solo en checkout, donde ya es tarde para que el cliente reaccione bien), y el importe se formatea con wc_price() para respetar la moneda y los separadores configurados en la tienda.

Bonus: añadir un campo personalizado a la página de direcciones

Cuando el cliente edita sus direcciones de facturación o envío desde «Mi cuenta», los campos disponibles son los típicos. Si necesitas pedir, por ejemplo, una fecha de nacimiento (porque vendes vino, productos para adultos o productos personalizados con edad), este snippet añade el campo a esa pantalla.

add_filter( 'woocommerce_default_address_fields', 'anadir_campo_direcciones' );
function anadir_campo_direcciones( $fields ) {
    $fields['date_of_birth'] = array(
        'label'        => 'Fecha de nacimiento',
        'required'     => false,
        'class'        => array( 'form-row-wide' ),
        'priority'     => 100,
        'type'         => 'date',
    );
    return $fields;
}Lenguaje del código: PHP (php)

Pequeño detalle: especificar 'type' => 'date' hace que el navegador muestre un selector de fecha nativo, lo que es mucho más cómodo para el usuario que un campo de texto libre donde cada cliente escribe el formato que le da la gana.

Cómo decidir si meter código o instalar un plugin

Cada uno de estos snippets sustituye, parcial o totalmente, a un plugin que hace lo mismo. ¿Cuándo merece la pena el código y cuándo el plugin? La respuesta corta: si el ajuste es estable, lo controlas tú y no piensas tocarlo más, código. Si es una funcionalidad compleja con interfaz, opciones, actualizaciones y soporte (un campo personalizado por producto con cien variantes, por ejemplo), plugin.

Para los snippets sueltos, mi recomendación: instala Code Snippets. Cada fragmento queda como una entrada independiente, con su título y descripción, que puedes activar y desactivar sin tocar archivos. Si algún día algo deja de funcionar tras una actualización, lo identificas en treinta segundos.

Si tu tienda usa además un page builder potente para las páginas de venta o landings, y todavía estás dudando entre opciones, te interesa la comparativa de Breakdance vs Divi 5 vs Elementor 5 que publicamos hace poco: el constructor que elijas afecta a cómo se renderizan las páginas de producto y al rendimiento general.

Preguntas frecuentes sobre snippets de WooCommerce

¿Estos códigos funcionan en la última versión de WooCommerce?

Sí. Hemos actualizado los snippets para usar las funciones helper de WooCommerce 3.x en adelante (WC(), wc_get_checkout_url(), get_payment_method_title(), woocommerce_save_product_variation) y para adaptarlos a Gutenberg y al checkout en bloques cuando aplica. Eso sí: prueba siempre en staging antes de pasar a producción, sobre todo si tu tema tiene personalizaciones o usas el checkout en bloques de WooCommerce, que tiene su propio sistema de campos.

¿Dónde pego estos códigos exactamente?

Tres opciones, en orden de menos a más limpio. La peor: directamente en el functions.php del tema activo, perderás los cambios al actualizar. Mejor: en el functions.php de un tema hijo. Aún mejor: cada snippet como entrada independiente en el plugin Code Snippets. Esta última te permite activar y desactivar fragmentos sin tocar FTP cuando algo falla.

Si el código rompe la web, ¿cómo lo arreglo?

Si pegaste en functions.php y aparece un error fatal, entra por FTP o por el gestor de archivos del hosting, abre el archivo y borra el bloque que añadiste. Si usabas Code Snippets, el plugin desactiva automáticamente el fragmento que da error la próxima vez que cargas el panel, así que no te tira la web entera.

¿Qué diferencia hay con el checkout en bloques de WooCommerce?

El checkout clásico (shortcode) usa los hooks que ves en estos snippets. El checkout en bloques, que WooCommerce empuja desde 2023, usa una API diferente basada en filtros JavaScript y bloques de Gutenberg, y muchos de estos filtros PHP no aplican igual. Si has migrado al checkout en bloques, hay snippets aquí que tendrás que adaptar (sobre todo los del paso 7 sobre campos obligatorios). Para el resto (correos, pedidos mínimos, redirección al carrito), siguen siendo válidos.

¿Hay riesgo de seguridad al añadir código personalizado?

El riesgo está en el código, no en el hecho de añadirlo. Sanitiza siempre los datos que vengan del usuario (sanitize_text_field(), absint(), wp_kses() según el caso), escapa las salidas (esc_html(), esc_attr()) y no copies y pegues snippets de webs aleatorias sin entender qué hacen. Estos están comentados precisamente para eso.

¿Puedo combinar varios snippets a la vez?

Sí, son independientes entre sí. El único cuidado es no usar dos veces el mismo nombre de función (PHP da error fatal), así que si vas a copiar varios, cambia el nombre de la función en cada uno o usa el plugin Code Snippets, que cada fragmento queda en su propio scope.

Y hasta aquí los nueve snippets más el bonus. Si te has quedado con ganas de más, en su día también publicamos los 9 primeros códigos para mejorar WooCommerce, que cubren ajustes diferentes (precios, mostrar el SKU, ocultar pestañas) y se pueden combinar con estos sin problema. Si te ha sido útil, comparte el artículo en tus redes sociales.

Jorge López

Soy programador web y me gusta mucho el diseño gráfico, la fotografía y todo lo relacionado con las nuevas tecnologías. En mis ratos libres me encanta dibujar y escuchar música. ¡No podría vivir sin ella! Aparte soy un friki de las series...las devoro

Te puede interesar...

    Comments are closed

    WordPress Directo
    WPDirecto.com es una revista especializada en WordPress y WooCommerce que ofrece una amplia gama de recursos, incluyendo tutoriales, análisis de plugins y plantillas, consejos de optimización y estrategias de SEO, para ayudar a los usuarios a mejorar y personalizar sus sitios web, manteniéndolos informados sobre las últimas novedades y tendencias en el mundo de WordPress.

    © 1995-2025 Color Vivo Internet, SLU (Medios y Redes Online).. Otros contenidos se cita fuente. Infraestructura cloud servidores dedicados de Stackscale.