Traducir Author, Search y Page en las URL de WordPress

WordPress es muy configurable, te permite personalizar casi todo… y digo casi, porque hay algunas cosillas que no puedes cambiar usando las opciones disponibles. Pero no te preocupes, porque lo que no puedas cambiar desde la administración, seguro que lo puedes cambiar con programación y plugins. Te voy a enseñar ahora mismo cómo traducir las palabras «Author»«Search»«Page«, que aparecen en las URLs de WordPress y que no pueden cambiarse desde «Enlaces permanentes».

Nota: si te quieres saltar todas las explicaciones y descargarte el plugin de WordPress directamente, puedes ir al final del artículo.

Si entras en la sección de «Ajustes > Enlaces permanentes» verás que puedes configurar varias cosas relativas a las URLs, entre ellas las palabras que se usan de base en las direcciones de categorías y etiquetas. Estas palabras base sirven para que WordPress sepa diferenciar que lo que quieres ver es una categoría o una etiqueta: (la parte de la URL que hace de base es la que aparece abajo en azul, y el nombre de la categoría o etiqueta en naranja)

http://ejemplo.org/category/productos
http://ejemplo.org/categoria/terror
http://ejemplo.org/tema/electronica

http://ejemplo.org/tag/verano
http://ejemplo.org/etiqueta/sin-mangas
http://ejemplo.org/tipo/descapotable

Pues lo dicho, estas palabras base para categorías y etiquetas, las puedes cambiar desde ahí. Pero hay otras, como por ejemplo la que se usa para la paginación «page«, la que se usa para los autores «author» o la de las búsquedas «search«, que no aparecen en el formulario. Para cambiarlas tenemos que recurrir a una variable global de WordPress llamada $wp_rewrite, y que tiene toda la información para manejar las redirecciones que sirven para tener URLs «bonitas».

Dado que las redirecciones deben resolverse rápidamente, WordPress utiliza una caché donde tiene almacenadas todas las reglas que tiene que aplicar antes de estar seguro de qué debe mostrar. Así que si cambiamos algo en esta variable global, después tendremos que eliminar y volver a crear esa caché (flush) para actualizarla. Esto es algo que ocurre de manera automática cuando editamos y guardamos los datos en la página de «Enlaces permanentes» que he comentado antes.

Nota informativa: en WordPress hay dos formas de hacer redirecciones la «hard» y la «soft», la primera utiliza el archivo .htaccess (cosa que yo intentaría evitar en la medida de lo posible) y la segunda es la de la caché.

Dicho esto, vamos a ver cómo cambiar esta variable global y actualizar la información.

¿Cómo cambio las reglas de redirección? esto es fácil, tendrías que ejecutar estas líneas:

$wp_rewrite->author_base = 'autor';
$wp_rewrite->search_base = 'buscar';
$wp_rewrite->pagination_base = 'pagina';
flush_rewrite_rules();

Con este código, cambiamos ciertas propiedades del objeto $wp_rewrite, la primera cambia la palabra base de autor, la segunda la de búsqueda y la tercera la de página. Justo después ejecutamos «flush_rewrite_rules();» que es lo que sirve para refrescar la caché de redirecciones. Si conseguimos que WordPress ejecute esas líneas, se actualizará la caché y ya no tendremos que ejecutarlas más veces. Bastaría con una vez.

¿Dónde pongo esas líneas de código? podrías meterlas en el archivo functions.php de tu theme y después cargar cualquier página de tu web para que se ejecuten. En cuanto se haya ejecutado una vez, ya se habrán guardado los cambios en la caché de redirecciones, y podrás borrar las líneas del archivo functions.php para dejarlo como estaba antes.

Parece fácil, pero en realidad no lo es tanto. Tenemos 2 problemas:

  • Primero: el objeto $wp_rewrite se crea cada vez que se inicia WordPress y al crearse tiene los valores por defecto de WordPress, es decir, «Author», «Search» y «Page». Si cambiamos los valores y hacemos un «flush», se guardará la nueva información en la caché, pero la siguiente vez que carguemos una página, $wp_rewrite volverá a tener esos valores por defecto. Esto debería darnos igual porque lo que nos importa es la caché, pero en realidad WordPress usa los valores de $wp_rewrite en algunos sitios (algo que no me gusta), así que, aunque basta con hacer el «flush» de la caché una sóla vez, los valores de $wp_rewrite sí deberíamos cambiarlos siempre para que todo funcione perfectamente.
  • Segundo: si en algún momento hicieras un «flush» sin haber cambiado antes los valores de $wp_rewrite, se perderían los cambios en la caché, y sabemos que editar los «Enlaces permanentes» hace que se actualice la caché. Así que si no tenemos cuidado y editamos algo de dicha página de configuración volveremos a tener el «author», «search» y «page».

Bueno, entonces, ¿por qué no dejamos estas líneas de código en el archivo functions.php para siempre y así no se desconfigura nunca? Ni hablar, esto está totalmente desaconsejado. El motivo, tal y como se explica en el Códex de WordPress, es que la función flush_rewrite_rules() es «extremadamente costosa en términos de rendimiento«, y no es buena idea que se ejecute cada vez que se cargue una página. Habrá que encontrar una solución intermedia.

Bueno, sabemos que el «flush» no podemos ejecutarlo todas las veces, pero cambiar los valores de la variable global $wp_rewrite no supone ningún problema, ¿qué te parece si metemos algo así en el archivo functions.php?:

function autor_buscar_pagina() {
  global $wp_rewrite, $pagenow;

  $wp_rewrite->author_base = 'autor';
  $wp_rewrite->search_base = 'buscar';
  $wp_rewrite->pagination_base = 'pagina';

  if ( $pagenow == "options-permalink.php" ) { flush_rewrite_rules(); }
}
add_action('init', 'autor_buscar_pagina');

Nota: tenemos que usar «global $wp_rewrite, $pagenow;» para poder usar las variables globales dentro de una función.

Aquí la idea es declarar una función y programarla para que se ejecute siempre al iniciar WordPress, esto está más recomendado que la forma de antes de poner las líneas directamente. La línea azul es la que programa dicha ejecución. Las líneas verdes se ejecutarán todas las veces y actualizarán los valores de la variable global $wp_rewrite (problema 1 resuelto). Sin embargo, solamente haremos el flush si estamos en la página de configuración de «Enlaces permanentes» (el condicional naranja se encarga de esto). Así, cuando cambiemos alguna cosa de la configuración y se haga el «flush» automático que nos preocupaba, también se volverá a ejecutar nuestra configuración y no la perderemos (problema 2 resuelto). Todo controlado.

Con esta solución podemos darnos por satisfechos. Si la usas, recuerda que tienes que cargar la página de «Enlaces permanentes» al menos una vez para que se active el flush_rewrite_rules(). Pero quiero dar una alternativa más cómoda.

¿Se podrían editar las palabras base para Autor, Buscar y Página igual de fácil que las de Categoría y Etiqueta? bien, con WordPress hay pocas cosas que no puedas hacer, así que sí, se puede. Vamos a hacer un plugin para incluir estas opciones en la página de «Enlaces permanentes»:

Plugin Autor, Buscar y Página

Vista de cómo quedará el plugin Autor-Buscar-Pagina

Además de Categoría y Etiqueta, que son las básicas, meteremos las configuraciones para Autor, Buscar y Página, así que llamaremos a nuestro plugin: Autor-Buscar-Pagina. Venga, manos a la obra que tenemos trabajo por delante.

Nuestro plugin hará lo siguiente. Va a crear y añadir 3 nuevos campos (Autor, Buscar y Página) al formulario de configuración de «Enlaces permanentes«, de manera que cuando se cambie cualquier cosa en esta página y se actualice la caché, también se actualicen estos nuevos. Los valores de estos campos los guardaremos en la base de datos como options (opciones), usando las funciones básicas que WordPress nos ofrece para esto: get_option() y update_option().

Vamos a usar una clase para manejar nuestro plugin, que es la forma más limpia, elegante y, por supuesto, recomendada para hacerlo. Este será el esqueleto:

new AutorBuscarPagina;

class AutorBuscarPagina {

  public function __construct() {
    ...
  }

  ...

}

Primero instanciaremos la clase y luego la definiremos, sí, al revés, pero seguro que ya sabes que el orden no importa. Al instanciar la clase se ejecutará la función __contruct(), así que lo que pongamos ahí dentro se ejecutará inmediatamente.  Voy a ir comentando todas las funciones que habrá dentro de la clase (métodos) una por una, empezando por el propio __contruct():

public function __construct() {
  add_action( 'init' , array( &$this , 'setAutorBuscarPagina' ) );
  add_action( 'admin_init' , array( &$this , 'adminAutorBuscarPagina' ) );
}

Lo que hacemos es establecer dos acciones, una que se ejecutará siempre (init) y otra que solamente se ejecutará cuando estemos en la administración (admin_init). La que se ejecuta siempre se encargará de actualizar los valores de la variable global $wp_rewrite, mientras que la otra acción se encargará de mostrar los nuevos campos de configuración, actualizar los valores de la base de datos y hacer el «flush» cuando sea necesario. Veamos primero la función que se ejecuta siempre, setAutorBuscarPagina():

public function setAutorBuscarPagina(){
  global $wp_rewrite;

  $abp_autor  = get_option( 'abp_autor',  '' );
  $abp_buscar = get_option( 'abp_buscar', '' );
  $abp_pagina = get_option( 'abp_pagina', '' );

  $wp_rewrite->author_base     = ($abp_autor!='')?  $abp_autor  : 'author'; 
  $wp_rewrite->search_base     = ($abp_buscar!='')? $abp_buscar : 'search'; 
  $wp_rewrite->pagination_base = ($abp_pagina!='')? $abp_pagina : 'page';
}

Las líneas naranja cogen los valores de configuración guardados como options, y las líneas azules se encargan de cambiar los valores de $wp_rewrite. Si no hay valor guardado o el valor es una cadena vacía, se pondrá el valor por defecto. Las options que guardarán nuestros valores, se llamarán «abp_autor«, «abp_buscar» y «abp_pagina» (abp es de AutorBuscarPágina).

Ahora vamos a ver la otra acción, la que se ejecuta solamente en la administración, adminAutorBuscarPagina():

public function adminAutorBuscarPagina() {
  global $pagenow;

  if ( $pagenow == "options-permalink.php" ) {
 
    if ( isset($_POST['abp_autor'])  ) { update_option("abp_autor",  $_POST['abp_autor']);  }
    if ( isset($_POST['abp_buscar']) ) { update_option("abp_buscar", $_POST['abp_buscar']); }
    if ( isset($_POST['abp_pagina']) ) { update_option("abp_pagina", $_POST['abp_pagina']); }

    add_settings_field('abp_autor',  '<label for="abp_autor">Autor base</label>',   array(&$this, 'abp_autor_output'),  'permalink', 'optional');
    add_settings_field('abp_buscar', '<label for="abp_buscar">Buscar base</label>', array(&$this, 'abp_buscar_output'), 'permalink', 'optional');
    add_settings_field('abp_pagina', '<label for="abp_pagina">Página base</label>', array(&$this, 'abp_pagina_output'), 'permalink', 'optional');

    flush_rewrite_rules();
  }
}

Aquí ves que usamos la variable global $pagenow para saber en qué sección de la administración estamos, y solamente haremos algo si estamos en la sección «options-permalink.php» que es la que nos interesa de «Enlaces permanentes». He diferenciado con colores. Las líneas naranja sirven para añadir los campos nuevos al formulario que hay en la página «permalink» sección «optional«. Las líneas en azul sirven para recoger los datos POST, cuando los haya, y usarlos para actualizar los valores de las options. Por último hay una línea más en color verde que sirve para actualizar la caché.

En las líneas naranja anteriores, puedes ver que cada uno de los campos que hemos añadido, necesita una función propia adicional (callback) para controlar la salida (render), estas funciones tendrán esta pinta:

 public function abp_autor_render() {
 ?><input id='abp_autor' name='abp_autor' type='text' class="regular-text" value='<?php echo get_option( 'abp_autor' ); ?>'><?php
 }

 public function abp_buscar_render() {
 ?><input id='abp_buscar' name='abp_buscar' type='text' class="regular-text" value='<?php echo get_option( 'abp_buscar' ); ?>'><?php
 }

 public function abp_pagina_render() {
 ?><input id='abp_pagina' name='abp_pagina' type='text' class="regular-text" value='<?php echo get_option( 'abp_pagina' ); ?>'><?php
 }

Tres campos, tres funciones. He usado los tags de PHP (naranja) para poder escribir en la página. En azul está lo que se renderizará en cada caso. Puedes comprobar que hemos usado el mismo nombre para la option, el name e incluso para el id, así no nos liamos.

Eso es todo lo necesario para que funcione, pero además de que funcione queremos que sea limpio y para eso necesitamos un archivo más que se ejecutará cuando desinstalemos el plugin. Esto es obligatorio para eliminar las options de la base de datos cuando ya no nos hagan falta.

El archivo de desinstalación se llamará uninstall.php y contendrá lo siguiente:

if ( !defined('WP_UNINSTALL_PLUGIN') ) { exit; }

delete_option('abp_autor');
delete_option('abp_buscar');
delete_option('abp_pagina');

La línea en azul sirve para que no se pueda ejecutar el archivo a menos que nuestra intención sea la de desinstalar el plugin. Las otras sirven para eliminar todo rastro de nuestro plugin de la base de datos.

Si quieres la versión final del plugin, puedes descargarla de aquí abajo, y si tienes dudas comenta.

Descargar ZIP: Plugin de WordPress autor-buscar-pagina

También puedes instalarlo directamente de la sección de plugins de WordPress:

Plugin Autor Buscar Página

Nota importante: si te importa el SEO de tu página, ten en cuenta que al cambiar las palabras base, las URLs antiguas ahora llevan a una página que ya no existe. Si estas URLs han podido ser indexadas o enlazadas desde otras webs, ahora darán como respuesta un error 404. Para que todo siga funcionando bien tendrías que usar redirecciones 301 de las antiguas direcciones a las nuevas.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn