En esta ocasión veremos como crear tus propias rutas en WordPress sin la necesidad de crear páginas y subpáginas para generar permalinks. Si no más bien, usaremos el poder de los virtual pages.
Pero primero debemos entender ¿que es un virtual page?:
Una página virtual es una página que será llamado por un link que nosotros definimos pero que no necesitemos crearle una página, post, etc. en nuestra base de datos. Esto se logra escribiendo un poco de código en el functions.php.
Les dejo un ejemplo de un page virtual:
<?php // Agregamos las rutas personalizadas add_action( 'init', 'add_virtual_page_template' ); function add_virtual_page_template() { global $wp, $wp_rewrite; $wp->add_query_var( 'template' ); // nuestro link sería: link.com/login add_rewrite_endpoint( 'panel/login', EP_ROOT ); add_rewrite_rule( 'panel/login/?', 'index.php?template=panel-login', 'top' ); $wp_rewrite->flush_rules(); } // Indicamos que archivo abrirá las rutas personalizadas add_action( 'template_redirect', 'add_virtual_page_redirect' ); function add_virtual_page_redirect() { global $wp; $link = $_SERVER['REQUEST_URI']; $link = explode( '/', $link ); $link = array_slice($link, 1, -1); if ($link[0]=='panel' && $link[1] == 'login') { // Mi archivo estará dentro de una carpeta virtuales include get_stylesheet_directory() . '/virtuales/panel-login.php'; exit; } } ?>
Como ven. Primero deben definir la url que tendrá y luego el archivo de tu tema que se va a abrir. Lo que más me gusta de todo esto es que no necesito usar de subpáginas para poder tener urls más específicas. Ej. cesar.pe/page/virtual/nueva.
Hasta ahora todo suena bien, pero y si quiero mandar una variable por la url sin tener que usar el clásico «?id=X» que hace que se vea horrible la url y además no es tan bueno para nuestro amigo google. Entonces, lo podremos hacer en nuestro WordPress? Pues claro! Si no, como crees que plugins como wp_pagenavi genera paginaciones geniales.
Lo que necesitamos para crear estas variables en nuestras rutas es agregar un poco de código donde definimos nuestra url y luego mediante el filter «query_vars» grabar esa variable para que WordPress lo tenga presente.
<?php add_filter('query_vars', 'add_variable_permalink'); function add_variable_permalink($vars) { $vars[] = 'custom_var'; return $vars; } ?>
Si por ejemplo, queremos crear una ruta que me muestre los datos de un cliente, pero este es un user, podríamos poner el siguiente código:
<?php // Agregamos las rutas personalizadas add_action( 'init', 'add_virtual_page_template' ); function add_virtual_page_template() { global $wp, $wp_rewrite; $wp->add_query_var( 'template' ); add_rewrite_endpoint( 'panel/clientes', EP_ROOT ); // La variable será idcliente add_rewrite_rule( 'panel/clientes/?([^/]*)', 'index.php?template=panel-clientes&idcliente=$matches[1]', 'top' ); $wp_rewrite->flush_rules(); } // Indicamos que archivo abrirá las rutas personalizadas add_action( 'template_redirect', 'add_virtual_page_redirect' ); function add_virtual_page_redirect() { global $wp; $link = $_SERVER['REQUEST_URI']; $link = explode( '/', $link ); $link = array_slice($link, 1, -1); if ($link[0]=='panel' && $link[1] == 'clientes') { include get_stylesheet_directory() . '/virtuales/panel-clientes.php'; exit; } } // Registramos la variable add_filter('query_vars', 'add_variable_permalink'); function add_variable_permalink($vars) { $vars[] = 'idcliente'; return $vars; } ?>
Ahora solo deben poner en su archivo panel-cliente.php lo siguiente:
<?php $idcliente = get_query_var('idcliente'); $cliente = get_userdata($idcliente); echo $cliente->first_name.' '.$cliente->last_name; ?>
Esto les mostrará el nombre del cliente cuando entre a una ruta como estatupagina.com/panel/clientes/{iduser}. Claro que pueden usar el parámetro para lo que deseen. Si tienen alguna duda, no duden en dejarlo en los comentarios o mandándome un tweet.
PD: Voy a hablar de esto y otros temas en el WordCamp Lima 2016 que se realizará el 16 del presente año en la Camara de Comercio de Lima.