¿En qué podemos ayudarte?
Con relativa frecuencia me veo en la necesidad de crear páginas virtuales en WordPress. La solución estándar (consultar en Google) funciona, pero termino empleando demasiado tiempo revisando y probando código hasta encontrar el que se adapte a mis necesidades. Por esta razón he decidido tener a mano un pequeño resumen de algunas opciones para enfrentar esta tarea.
¿Cuando necesitamos crear páginas virtuales en WordPress
Las páginas virtuales utilizan URL personalizadas que no se gestionan desde el área de administración de WordPress. Por ejemplo en una tienda online se utilizan para visualizar o imprimir facturas. Otros casos posible serían exportar una lista de propiedades de un sitio inmobiliario en un formato específico o generar un informe a partir de determinadas condiciones. Si creamos páginas normales corremos el riesgo de borrarlas o modificarlas por accidente.
Una solución empleada con frecuencis es crear un archivo php y llamarlo directamente. Funcionará, pero no tendremos acceso a las funcionalidades nativas de WordPress. Tendremos que implementarlas por nuestra cuenta, y esto supone un esfuerzo innecesario que puede hacer inviable seguir por este camino.
¿Y por qué no utilizar la REST API de WordPress? Está diseñada para dar respuesta a esta necesidad y está incorporada en el núcleo desde 2015. Yo veo varios inconvenientes:
- El formato de intercambio de datos es JSON y no siempre podremos convencer a la otra parte para que lo hable
- Las URL siguen un formato estricto: http://dominio.com/wp-json/wp/v2/punto-de-entrada y podemos necesitar modificarla
- La REST API necesita Javascript. Aunque es poco frecuente podemos encontrarnos con que esté desactivado en el dispositivo de destino.
Partiendo de esta base, veremos como crear páginas virtuales en WordPress con URLs totalmente personalizadas. Usaremos unas pocas líneas de código que podemos añadir al functions.php de nuestro tema hijo o en un plugin nuestro si preferimos no depender del tema activo
Páginas con URL simples
Este es la variante más sencilla. La URL genera tendrá una estructura similar a: https://dominio.com/?variable=xxx: El único requisito a tener en cuenta es que nuestra variable no coincida con las variables de consulta de WordPress.
Usaremos una función similar a la siguiente:
add_action( 'init', 'mi_codigo');
function mi_codigo( ) {
if ( isset( $_GET['variable'] ) ) {
include '/ruta/a/pagina-virtual.php';
die; //finalizamos la ejecución una vez generada la página
}
Seleccionamos el gancho init porque en ese momento la mayoría de las funciones están disponibles y nos ahorramos ,algunas consultas a consultas a la base de datos. Otro buen candidato es wp_loaded. Como su nombre indica el entorno de WordPress estará totalmente cargado en este punto, pero todavía no se ha enviado nada al navegador. Dependiendo de nuestras necesidades, podemos escoger otro punto de enganche. Aquí tenemos una lista de posibles candidatos.
Este es un método rápido y efectivo, pero su principal inconveniente es que generamos URL no amigables, lo cual es una desventaja de cara al SEO.
Páginas incorporadas en la estructura de nuestro sitio
Para integrar las URL de nuestras páginas virtuales en la estructura de nuestro sitio usaremos la API de reescritura. Esto nos permitirá tener una estructura similar a la siguiente: https://dominio.com/pagina-normal/pagina-virtual.
Primero definimos el nuevo tipo de entrada
add_action( 'init', function() {
add_rewrite_endpoint( 'pagina-virtual', EP_PERMALINK );
} );
Y a continuación establecemos para como mostraremos información ampliada:
add_action( 'template_redirect', function() {
global $wp_query;
if ( ! is_page( 'pagina-normal' ) || ! isset( $wp_query->query_vars['pagina-virtual'] ) ) {return;}
include '/ruta/a/pagina-virtual.php';
die;
} );
A grandes rasgos hemos definido una nueva variable de consulta y luego aplicamos los condicionales de WordPress para mostrar el contenido apropiado en cada ocasión.
Con este método podemos crear enlaces adicionales para cualquier contenido de nuestra web, pero estamos obligados a mantener la estructura de URL existente. Si queremos crear enlaces totalmente personalizados, debemos dar un paso más.
Páginas virtuales con URL personalizadas
Veamos como generar una estructura del tipo: https://dominio.com/pagina-virtual/xxx. En este ejemplo xxx es el parámetro que utilizaremos para generar el contenido.
Paso 1: Creamos la nueva regla de reescritura
Para ello usamos un código similar al siguiente:
add_action( 'init', 'crea_urls_personalizadas');
function crea_urls_personalizadas(){
global $wp;
add_rewrite_rule('pagina-virtual/(\d+)?$', 'index.php?param1=$matches[1]', 'top' );
$wp->add_query_var( 'param1' );
}
La función add_rewrite_rule es la encargada de transformar la expresión regular de nuestra url: pagina-virtual/(\d+)?$ en una llamada que WordPress que es capaz de interpretar: index.php?param1=$matches[1]. La función add_query_var registra nuestro parámetro con WordPress
Si no necesitamos parámetros (por ejemplo para https://dominio.com/pagina-virtual) nuestra regla tendría el siguiente aspecto:
add_action( 'init', 'crea_urls_personalizadas');
function crea_urls_personalizadas(){
global $wp;
add_rewrite_rule('pagina-virtual?$', 'index.php?param1=$matches[1]', 'top' );
$wp->add_query_var( 'param1' );
}
Paso 2: Generamos los contenidos
El código para generar los contenidos será similar a:
add_action( 'template_redirect', function(){
$param1 = get_query_var( 'param1' );
if ( $param1 ) {
include '/ruta/a/pagina-virtual.php';
die;
}
} );
Paso 3: Actualizamos los permalinks
Cada vez que modificamos los las "Rewrite Rules", debemos asegurarnos de guardar los permalinks en Ajustes -> Enlaces Permanentes desde el menú de administración de WordPress. Así nos aseguramos que las nuevas reglas están activadas.
Este proceso también puede realizarse programáticamente mediante la función flush_rewrite_rules. Hay que tener en cuenta que este proceso es un devorador de recursos y por tanto debemos ejecutarlo solo cuando sea estrictamente necesario
Este caso es el más complejo, pero nos permite generar cualquier url que necesitemos.
Conclusión
Crear páginas virtuales es una tarea que se nos presentará con relativa frecuencia cuando desarrollamos en WordPress. Por suerte enemos a nuestro alcance los métodos para hacerle frente sin demasiadas complicaciones.
Si utilizas otros métodos, cuéntanos como lo haces.