Como cargar un JS solo en una plantilla específica con condicionales en WordPress

Contents

Introducción

En WordPress es buena práctica cargar archivos JavaScript únicamente cuando realmente se necesitan. Esto reduce el tamaño de las páginas, mejora la velocidad y evita conflictos. Este tutorial muestra, con todo detalle y ejemplos prácticos, cómo cargar un archivo JS solo en una plantilla específica usando condicionales de WordPress (is_page_template, is_singular, is_page, etc.). También incluye buenas prácticas: registro de scripts, versionado con filemtime, localización de variables y diferencias entre get_template_directory_uri() y get_stylesheet_directory_uri().

Requisitos y conceptos previos

  • Acceso al theme: editar functions.php o crear un pequeño plugin.
  • Hooks relevantes: wp_enqueue_scripts (front-end) y admin_enqueue_scripts (back-end).
  • Funciones clave: wp_register_script(), wp_enqueue_script(), wp_localize_script().
  • Condicionales: is_page_template(), is_page(), is_singular(), is_post_type_archive(), is_front_page(), is_home(), etc.
  • Rutas: get_template_directory_uri() / get_template_directory() para themes padre get_stylesheet_directory_uri() / get_stylesheet_directory() para child themes.

Buenas prácticas antes de empezar

  • Registrar antes de encolar si el script puede usarse en varios contextos.
  • Usar filemtime() para pasar como versión y forzar bust de caché al actualizar el archivo en desarrollo.
  • Colocar scripts en el footer (último parámetro true) salvo que sean críticos para el head.
  • Usar wp_localize_script() para pasar datos de PHP a JS de forma segura.
  • Evitar incluir scripts directamente en plantillas con etiquetas ltscriptgt — aprovechar el sistema de enqueued assets de WP.

Ejemplo 1 — Cargar JS solo en una plantilla de página concreta

Imagina que tienes una plantilla de página llamada template-contact.php ubicada en la carpeta raíz del tema. El siguiente fragmento, que va en functions.php del tema (o en tu plugin), encola contact.js únicamente cuando se cargue esa plantilla:

lt?php
function tema_enqueue_conditional_scripts() {
    // Ruta física para filemtime y URI para browser
    script_path = get_template_directory() . /js/contact.js
    script_uri  = get_template_directory_uri() . /js/contact.js

    if ( is_page_template( template-contact.php ) ) {
        // Registro opcional (permite encolar desde otros sitios si hace falta)
        wp_register_script(
            tema-contact-js,
            script_uri,
            array(jquery), // dependencias
            file_exists( script_path ) ? filemtime( script_path ) : false,
            true // cargar en footer
        )

        // Localizar datos para uso en JS (por ejemplo AJAX URL)
        wp_localize_script( tema-contact-js, temaContactData, array(
            ajax_url => admin_url( admin-ajax.php ),
            nonce    => wp_create_nonce( tema_contact_nonce ),
        ) )

        // Encolar el script
        wp_enqueue_script( tema-contact-js )
    }
}
add_action( wp_enqueue_scripts, tema_enqueue_conditional_scripts )
?gt

Notas sobre el ejemplo

  • Si tu tema hijo (child theme) aloja el archivo JS, sustituye get_template_directory_ por get_stylesheet_directory_.
  • filemtime fuerza el versionado si el fichero no existe se evita una advertencia con file_exists.
  • El condicional is_page_template() debe ejecutarse durante la petición front-end por eso es correcto usar wp_enqueue_scripts.

Ejemplo 2 — Registrar globalmente y encolar condicionalmente

Registrar primero puede ser útil si otros componentes podrían necesitar el mismo script:

lt?php
function tema_register_scripts() {
    script_path = get_template_directory() . /js/shared.js
    script_uri  = get_template_directory_uri() . /js/shared.js

    wp_register_script(
        tema-shared-js,
        script_uri,
        array(),
        file_exists( script_path ) ? filemtime( script_path ) : false,
        true
    )
}
add_action( wp_enqueue_scripts, tema_register_scripts )

function tema_conditional_enqueue_after_register() {
    // Encolamos el script solo en la plantilla template-special.php
    if ( is_page_template( template-special.php ) ) {
        wp_enqueue_script( tema-shared-js )
    }
}
add_action( wp_enqueue_scripts, tema_conditional_enqueue_after_register )
?gt

Ejemplo 3 — Cargar JS para un post type concreto

Si quieres cargar un script solo para los single pages de un custom post type (por ejemplo book):

lt?php
function tema_books_scripts() {
    if ( is_singular( book ) ) {
        path = get_template_directory() . /js/book-single.js
        wp_enqueue_script(
            tema-book-js,
            get_template_directory_uri() . /js/book-single.js,
            array(),
            file_exists( path ) ? filemtime( path ) : false,
            true
        )
    }
}
add_action( wp_enqueue_scripts, tema_books_scripts )
?gt

Ejemplo 4 — Cargar JS por ID o slug de página

En ocasiones necesitas cargar un archivo en una página específica identificada por ID o slug:

lt?php
function tema_page_id_or_slug_script() {
    // Por ID
    if ( is_page( 42 ) ) {
        wp_enqueue_script( tema-page-42, get_template_directory_uri() . /js/page-42.js, array(), null, true )
    }

    // Por slug
    if ( is_page( acerca-de ) ) {
        wp_enqueue_script( tema-acerca, get_template_directory_uri() . /js/acerca.js, array(), null, true )
    }
}
add_action( wp_enqueue_scripts, tema_page_id_or_slug_script )
?gt

Ejemplo 5 — Pasar datos desde PHP a JS

Una vez encolado el script, usa wp_localize_script para pasar variables. Ejemplo sencillo del archivo JS que usará esos datos:

// /js/contact.js
document.addEventListener(DOMContentLoaded, function() {
    if ( typeof temaContactData !== undefined ) {
        console.log(AJAX URL:, temaContactData.ajax_url)
        // Usar el nonce: temaContactData.nonce
    }
})

Consideraciones especiales y errores comunes

  • is_page_template no funciona en admin: esos condicionales son para la parte pública. Para el admin usa admin_enqueue_scripts y condicionales como get_current_screen().
  • Orden de hooks: wp_enqueue_scripts es el hook correcto para front-end. No uses init para encolar assets (aunque podrías registrar ahí y encolar después).
  • Rutas en child themes: usa get_stylesheet_directory_uri() en lugar de get_template_directory_uri() para garantizar compatibilidad con child themes.
  • Dependencias: declara correctamente dependencias (ej. jquery) para evitar errores de ejecución.
  • Caché y versionado: filemtime es muy útil en desarrollo en producción puedes usar un número fijo o una estrategia de versionado basada en release.

Checklist rápido antes de desplegar

  1. ¿Registraste o encolaste el script con un handle único y descriptivo?
  2. ¿Usaste get_template_/get_stylesheet_ según corresponda?
  3. ¿Declaraste dependencias y colocaste en footer si es posible?
  4. ¿Comprobaste que el condicional elegido (is_page_template, is_singular, is_page…) cubre exactamente las páginas que quieres?
  5. ¿Localizaste datos sensibles (nonces) con wp_localize_script en vez de imprimirlos en el DOM?

Resumen final

Cargar un JS solo en una plantilla específica en WordPress implica:

  • Elegir el hook correcto (wp_enqueue_scripts).
  • Usar condicionales como is_page_template(), is_singular() o is_page() para detectar el contexto.
  • Registrar/enqueue con get_template/get_stylesheet y versionado (filemtime).
  • Localizar datos con wp_localize_script cuando sea necesario.

Ejemplo compacto de uso habitual

lt?php
function tema_compact_conditional() {
    file = /js/special.js
    abs  = get_template_directory() . file
    uri  = get_template_directory_uri() . file

    if ( is_page_template( template-special.php )  is_singular( book ) ) {
        wp_enqueue_script( tema-special-js, uri, array(jquery), file_exists( abs ) ? filemtime( abs ) : null, true )
    }
}
add_action( wp_enqueue_scripts, tema_compact_conditional )
?gt

Aplica estos ejemplos y adaptaciones para mantener tu sitio ligero y organizado. Con las prácticas descritas podrás cargar scripts únicamente cuando sean necesarios, mejorar tiempos de carga y reducir la posibilidad de conflictos entre assets.



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

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