Cómo integrar SmoothState.js en un tema WordPress
() translation by (you can also view the original English article)
En nuestro anterior tutorial, utilizamos la History Web API en un sitio estático para producir suaves transiciones de página. En este tutorial vamos a pasar al siguiente nivel, aplicando lo que aprendimos en un sitio web creado con WordPress. Habrá una diferencia crucial; voy aprovechar SmoothState.js en lugar de construir el nuestro desde cero.
Lo que hará SmoothState.js:
- Solicitará páginas de forma asincrónica (AJAX) y sustituirá el actual contenido debidamente.
- Actualizará las URLs y el historial de navegación mediante la History Web API.
Elegimos SmoothState.js por varias razones:
- Facilidad de uso: es un plugin jQuery extremadamente fácil de usar, que apenas requiere configuración para ponerlo en funcionamiento.
- APIs: SmoothState.js viene con métodos, propiedades y ganchos que nos permiten moldearlo para adaptarlo a muchas posibles situaciones.
- Extrae y almacena en caché: estas dos características permiten que nuestras transiciones de página sean mucho más suaves y rápidas que lo que habíamos creado en el anterior tutorial.
- No condiciona: SmoothState.js no dicta cómo tenemos que aplicar la animación: podemos apoyarnos en CSS, en jQuery, en Vanilla JavaScript o en una librería de animación como Velocity.js.
- Probado y testeado: Teniendo en cuenta que se han cerrado más de un centenar de problemas durante su desarrollo, podemos suponer que ya han sido abordados y resueltos numerosos errores.
Requisitos previos
Hay un par de cosas que necesitarás tener preparadas para seguir este tutorial:
- WordPress: debes tener un sitio WordPress en ejecución, ya sea de forma local en tu ordenador, o en vivo en un servidor online. Si necesitas ayuda en este paso, consulta Cómo empezar con WordPress de Tom McFarlin para ponerte en marcha e iniciar un sitio WordPress básico.
- Un tema: Durante este tutorial vamos a utilizar el último tema predeterminado de WordPress: TwentySixteen. Puedes elegir cualquier otro tema, pero asegúrate de que cumple con los estándares de WordPress.
1. Crear un tema hijo
Usar un "tema hijo" en WordPress (en lugar de trabajar directamente con los archivos originales del tema) nos permite introducir nueva funcionalidad, o anular la predeterminada de forma segura.
Esta es la práctica recomendada siempre que se personaliza un tema, ya que en caso de actualizar el tema principal, cualquier cambio que hayas realizado se conservaría.
En nuestro caso, el tema principal es TwentySixteen. El tema hijo está ubicado en una nueva carpeta "twentysixteen-child" que contiene un archivo "functions.php" y una hoja de estilo "style.css", como puedes ver a continuación.
1 |
.
|
2 |
├── twentysixteen |
3 |
└── twentysixteen-child |
La parte más importante de un tema hijo es la notación Template
en el encabezado de la hoja de estilos que señala su relación con el tema padre. Especifica en Template
el nombre del directorio del tema padre, en nuestro caso twentysixteen
1 |
/**
|
2 |
Theme Name: Twenty Sixteen Child
|
3 |
Theme URI: https://webdesign.tutsplus.com
|
4 |
Author: Thoriq Firdaus
|
5 |
Author URI: https://tutsplus.com/authors/tfirdaus
|
6 |
Description: A child theme that adds an extra layer of glam to TwentySixteen
|
7 |
Version: 1.0.0
|
8 |
License: GNU General Public License v2 or later
|
9 |
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
10 |
Text Domain: twentysixteen
|
11 |
|
12 |
Template: twentysixteen
|
13 |
*/
|
Una vez hecho esto, activa el tema hijo a través del escritorio de administración de WordPress:



2. Pon en cola los archivos JavaScript
Necesitamos cargar una serie de archivos JavaScript en nuestro tema WordPress. En principio podríamos hacerlo agregando estos JavaScript directamente en la etiqueta head
del archivo "header.php" del tema. Sin embargo, siguiendo el estándar de WordPress, es recomendable utilizar la función wp_enqueue_script()
, y añadirla en functions.php
, para evitar conflictos:
1 |
wp_enqueue_script( 'smoothstate-js', 'assets/js/smoothstate.js', array( 'jquery' ), '0.5.2' ); |
2 |
wp_enqueue_script( 'script-js', 'assets/js/script.js', array( 'jquery', 'smoothstate-js' ), '1.0.0' ); |
La función también nos permite establecer las dependencias del script. En nuestro caso, "smoothstate.js" depende de jQuery, por lo tanto WordPress cargará jQuery antes de cargar "smoothstate.js".
Nuestro archivo "script.js" depende de ambos scripts, por lo que la secuencia de carga de todos nuestros scripts es la siguiente:
1 |
<script type='text/javascript' src='wp-includes/js/jquery/jquery.js'></script> |
2 |
<script type='text/javascript' src='assets/js/smoothstate.js'></script> |
3 |
<script type='text/javascript' src='assets/js/script.js'></script> |
Echa un vistazo a los siguientes tutoriales para obtener más información sobre cómo poner en cola archivos en WordPress:
- PluginsLos entresijos de la inclusión de scripts en temas y plugins de WordPressJason Witt
- Hojas de comprobaciónLa guía completa sobre el uso correcto de JavaScript en WordPressBarış Ünver
3. Implementar SmoothState.js
Vamos a añadir el siguiente código a nuestro "script.js", para poner SmoothState.js en funcionamiento:
1 |
( function( $ ) { |
2 |
|
3 |
$( function() { // Ready |
4 |
|
5 |
var settings = { |
6 |
anchors: 'a' |
7 |
};
|
8 |
|
9 |
$( '#page' ).smoothState( settings ); |
10 |
} ); |
11 |
|
12 |
})( jQuery ); |
En el código anterior, seleccionamos #page
(el elemento que envolverá el contenido de página del sitio) e implementamos SmoothState.js con su configuración más básica.
Nuestras páginas deben ser servidas sin actualizar por completo la ventana del navegador conforme navegamos a través de nuestro sitio WordPress. Ahora nuestras páginas se sirven de forma asincrónica.



Básicamente, ¡ya lo tenemos listo! Sin embargo, todavía quedan algunos detalles dignos de nuestra atención:
- Hay algunas URLs que no deberían cargarse de forma asincrónica, como el enlace dentro de
#page
que apunta al administrador de WordPress,wp-admin
owp-login.php
. - Los vínculos con una almohadilla, por ejemplo
#respond
, no saltan a las secciones correspondientes de la página. - La carga de nuestra página es muy rápida. Pero todavía no da la sensación de suavidad porque no hemos aplicado ninguna animación para vehicular la transición.
4. Enlaces del escritorio de WordPress
Hay algunos enlaces en la página que apuntan al área de administración de WordPress, como el enlace Editar en cada publicación, el enlace Conectado como administrador y el enlace ¿quieres salir? situados antes del formulario de comentario.



Uno de los problemas cuando SmoothState.js solicita el escritorio es que no podremos volver a la página anterior cuando hagamos clic en el botón Retroceder del navegador. Este problema se produce porque el script SmoothState.js no está presente en el área de administración para poder solicitar y servir la página anterior.



Tendremos que evitar que SmoothState.js solicite cualquier URL que apunte a wp-admin
o wp-login
. Para ello podemos utilizar el parámetro blacklist
, de la siguiente manera:
1 |
( function( $ ) { |
2 |
$( function() { // Ready |
3 |
var settings = { |
4 |
anchors: 'a' |
5 |
blacklist: '.wp-link' |
6 |
};
|
7 |
$( '#page' ).smoothState( settings ); |
8 |
} ); |
9 |
})( jQuery ); |
El parámetro blacklist
le indica a SmoothState.js que ignore los vínculos con el selector de clase especificado; y dado el fragmento de código anterior, ignorará los enlaces con la clase wp-link
. Este nombre de clase actualmente no existe, así que crearemos una nueva clase y la agregaremos dinámicamente a los vínculos necesarios:
1 |
function addBlacklistClass() { |
2 |
$( 'a' ).each( function() { |
3 |
if ( this.href.indexOf('/wp-admin/') !== -1 || |
4 |
this.href.indexOf('/wp-login.php') !== -1 ) { |
5 |
$( this ).addClass( 'wp-link' ); |
6 |
}
|
7 |
});
|
8 |
}
|
Esta función evalúa cada etiqueta de ancla en la página y, a continuación, añade la clase wp-link
si la URL del enlace incluye /wp-admin/
o /wp-login.php
.
Ejecutamos esta función dos veces para añadir eficazmente la clase a la página. En primer lugar, en la carga inicial de la página. La segunda tiene lugar después de que SmoothState.js haya servido la nueva página a través de onAfter
; un método que se ejecutará cada vez que el nuevo contenido y la animación hayan sido servidos por completo.
1 |
function addBlacklistClass() { |
2 |
$( 'a' ).each( function() { |
3 |
if ( this.href.indexOf('/wp-admin/') !== -1 || |
4 |
this.href.indexOf('/wp-login.php') !== -1 ) { |
5 |
$( this ).addClass( 'wp-link' ); |
6 |
}
|
7 |
});
|
8 |
}
|
9 |
|
10 |
$( function() { |
11 |
|
12 |
addBlacklistClass(); |
13 |
|
14 |
var settings = { |
15 |
anchors: 'a', |
16 |
blacklist: '.wp-link', |
17 |
onAfter: function() { |
18 |
addBlacklistClass(); |
19 |
}
|
20 |
};
|
21 |
|
22 |
$( '#page' ).smoothState( settings ); |
23 |
} ); |
5. Gestionar la almohadilla de enlace
A continuación, tenemos que gestionar los enlaces con una almohadilla al final. En un tema de WordPress, normalmente encontraremos un enlace que nos dirija a la sección de comentarios de una entrada o página.



Tal como están las cosas, descubrirás que el enlace no nos llevará a la sección de comentarios porque la página ni se carga ni se actualiza realmente. Por lo tanto, necesitamos replicar el comportamiento habitual esperado.
1 |
( function( $ ) { |
2 |
...
|
3 |
$( function() { |
4 |
...
|
5 |
onAfter: function() { |
6 |
...
|
7 |
var $hash = $( window.location.hash ); |
8 |
|
9 |
if ( $hash.length !== 0 ) { |
10 |
|
11 |
var offsetTop = $hash.offset().top; |
12 |
|
13 |
$( 'body, html' ).animate( { |
14 |
scrollTop: ( offsetTop - 60 ), |
15 |
}, { |
16 |
duration: 280 |
17 |
} ); |
18 |
}
|
19 |
}
|
20 |
};
|
21 |
} ); |
22 |
})( jQuery ); |
Como puedes ver en el fragmento de código anterior, hemos añadido algunas líneas de código bajo el método onAfter
. El código recupera la almohadilla de la URL y, a continuación, se desplaza a la sección correspondiente (si está presente en la página) mediante jQuery Animation.



6. Aplicar la animación de página
Necesitamos hacer que la transición de la página se perciba de forma más vívida. En primer lugar, añadiremos los estilos CSS para animar la página en el archivo "style.css" de nuestro tema hijo de la siguiente manera.
1 |
.site-content { |
2 |
-webkit-transition: -webkit-transform .28s, opacity .28s; |
3 |
-ms-transition: -o-transform .28s, opacity .28s; |
4 |
-o-transition: -o-transform .28s, opacity .28s; |
5 |
transition: transform .28s, opacity .28s; |
6 |
}
|
7 |
.slide-out .site-content { |
8 |
-webkit-transform: translate3d( 0, 100px, 0 ); |
9 |
-ms-transform: translate3d( 0, 100px, 0 ); |
10 |
-o-transform: translate3d( 0, 100px, 0 ); |
11 |
transform: translate3d( 0, 100px, 0 ); |
12 |
opacity: 0; |
13 |
}
|
.site-content
es el nombre de clase que envuelve la entrada principal o el contenido de la página, mientras que .slide-out
es una clase adicional que hemos creado para deslizar el contenido.
1 |
( function( $ ) { |
2 |
...
|
3 |
$( function() { |
4 |
...
|
5 |
var settings = { |
6 |
...
|
7 |
onStart: { |
8 |
duration: 280, // ms |
9 |
render: function ( $container ) { |
10 |
$container.addClass( 'slide-out' ); |
11 |
}
|
12 |
},
|
13 |
onAfter: function( $container ) { |
14 |
...
|
15 |
$container.removeClass( 'slide-out' ); |
16 |
}
|
17 |
};
|
18 |
|
19 |
$( '#page' ).smoothState( settings ); |
20 |
} ); |
21 |
|
22 |
})( jQuery ); |
Dado el código anterior, utilizamos el método onStart
para añadir la clase cuando SmoothState.js comience a extraer nuevo contenido. A continuación, a través de onAfter
, quitamos la clase después de que el nuevo contenido haya sido entregado.



¡Y eso es todo! Aún así, hay algo a tener en cuenta con respecto a la compatibilidad con algunos plugins de WordPress.
¿Qué viene después?
Hay disponibles más de 40.000 plugins de WordPress, y eso sin incluir los plugins alojados fuera del repositorio oficial, como CodeCanyon por ejemplo. Hay muchos plugins por ahí que podrían no ser compatibles, e incluso romper, nuestra carga asincrónica, particularmente los que dependen de scripting en cualquier medida.
La siguiente lista es mi estimación aproximada de algunos plugins que posiblemente debas examinar si los utilizas junto a SmoothState.js:
- WordPress.com Stat (un módulo Jetpack)
- Carousel (un módulo de Jetpack)
- Infinite Scroll (un módulo de Jetpack)
- Google Analytics for WordPress
- Disqus
- Lazy Load
Además, JavaScript se utiliza en gran medida en el Personalizador dentro del escritorio de WordPress. Por lo tanto, podrías plantearte no cargar SmoothState.js en el personalizador, en caso de que algo se rompa.
Conclusión
Hemos aprendido a integrar SmoothState.js en WordPress, así como a utilizar un tema hijo como estrategia de desarrollo. ¡Y esto es sólo un comienzo! Podríamos, por ejemplo, extender lo que hemos hecho por medio de un plugin que cuente con opciones de configuración en donde el usuario medio pueda personalizar fácilmente la salida.
Inspiración
Si estás buscando inspiración, echa un vistazo a estos temas multipropósito de WordPress disponibles en Envato Market que utilizan técnicas AJAX similares para la carga de página:








