Algo más sobre etiquetas en WordPress
diciembre 7, 2009 Publicado en Software y HardwareEtiquetas: WordPress
Desde Polonia preguntaron si había alguna forma de hacer que Indizar funcionara en los reportes categorizados como páginas una vez se activaran los permalinks. Los requerimientos del plugin tan solo llegaban hasta los reportes asignados como posts, así que nunca fui más allá en cuanto a la declaración de las reglas para páginas, pero ahora tenía un reto para encontrar una solución. Buscando una respuesta a esa pregunta nació este artículo y la nueva versión de Indizar con soporte para permalinks en páginas.
Las versiones anteriores a 0.5.1 hacían uso del filtro ‘generate_rewrite_rules’, que como su nombre lo indica sería llamado al momento de generar las reglas, pero como lo general no siempre soluciona cuestiones particulares, no conseguí definir con este filtro las reglas para etiquetas en páginas y posts.
Ante la pregunta hecha desde la patria de Lech Wałęsa, volví a mirar la clase constructora de reglas y encontré dos filtros con los que podría separar los procesos de creación, así que retomé el anterior algoritmo y lo dediqué exclusivamente al generador de etiquetas para posts, luego hice un poco de ingeniería inversa buscando los métodos y funciones con los que se crean las reglas de las páginas; copié el algoritmo implementado en la clase de reescritura de reglas de WordPress, lo corrí con las modificaciones de las nuevas etiquetas, y por primera vez en la historia de Indizar podía definir capítulos en páginas y posts al mismo tiempo. Luego fue sencillo encontrar el método para alterar la estructura permanente de las páginas y modificar las reglas usando los métodos de la clase de WordPress.
A continuación, el algoritmo documentado para generar etiquetas en páginas y posts.
// Filtro que agrega la variable 'chapter' a las variables del entorno
add_filter('query_vars', 'ind_query_var');
// Filtro para generar las reglas del permalink en posts
add_filter('post_rewrite_rules','ind_postRewriteRules');
// Filtro para generar las reglas del permalink en páginas
add_filter('page_rewrite_rules','ind_pageRewriteRules');
function ind_postRewriteRules($rules){
// Iniciar el entorno de reescritura de reglas
global $wp_rewrite;
// Definir el nombre de la variable, el tipo de valor (numérico en este caso)
// y la forma en que será transformada en una URL real desde el permalink.
// La regla del tipo de valor emplea expresiones regulares (RegExp).
$keytag = '%chapter%';
$wp_rewrite->add_rewrite_tag($keytag, '([0-9]+)', 'chapter=');
// La regla de capítulos la definimos así:
// '/%estructura_de_permalink%/chapter/%capítulo%/'
$post_structure = $wp_rewrite->permalink_structure . "/chapter/$keytag";
// Como la estructura de permalink puede o no terminar en '/' es posible que
// se cree una cadena que contenga la expresión '//' en la regla, y deberá
// ser eliminada.
$post_structure = str_replace('//', '/', $post_structure);
// Crear el arreglo de reglas con el nuevo token y la nueva estructura
// de datos.
$post_rewrite = $wp_rewrite->
generate_rewrite_rules($post_structure, EP_PERMALINK);
// Concatenar las antiguas reglas con las nuevas reglas
// Las nuevas reglas DEBEN ir primero.
$rules = array_merge($post_rewrite,$rules);
// Fin de la función llamada desde el filtro.
return $rules;
}
function ind_pageRewriteRules($rules){
// Iniciar el entorno de reescritura de reglas
global $wp_rewrite;
// Definir el nombre de la variable, el tipo de valor (numérico en este caso)
// y la forma en que será transformada en una URL real desde el permalink.
// La regla del tipo de valor emplea expresiones regulares (RegExp).
$keytag = '%chapter%';
$wp_rewrite->add_rewrite_tag($keytag, '([0-9]+)', 'chapter=');
// La regla de capítulos la definimos así:
// '/%estructura_páginas%/chapter/%capítulo%/'
$page_structure = $wp_rewrite->page_structure . "/chapter/$keytag";
// Como la estructura de permalink puede o no terminar en '/' es posible que
// se cree una cadena que contenga la expresión '//' en la regla, y deberá
// ser eliminada.
$page_structure = str_replace('//', '/', $page_structure);
// Definimos la nueva estructura de los permalinks de página en el entorno
// del generador de reglas.
$wp_rewrite->page_structure = $page_structure;
// Crear el arreglo de reglas con el nuevo token y la nueva estructura
// de datos.
$page_rewrite = $wp_rewrite->page_rewrite_rules();
// Fin de la función llamada desde el filtro.
return $page_rewrite;
}
function ind_query_var($vars) {
// Para agregar la variable de entorno solo hay que añadirla al arreglo de
// variables de WP. De esta forma WordPress sabrá que deberá consultar por
// dicha variable en la URL y almacenarla.
array_push($vars, 'chapter');
return $vars;
}
Para crear los enlaces a estos ‘capítulos’ se emplea el siguiente código
// Si no hay estructura de permalink o se está consultando un borrador, crear un
// enlace con las variables en la URL para ser leidos con $_GET
if (
'' == get_option('permalink_structure') ||
in_array($post->post_status, array('draft', 'pending'))
) {
// Enlace con la variable que hemos definido en ind_query_var
$link=get_permalink() . '&chapter=' . $chapter_index;
} else {
// Enlace con la etiqueta 'chapter/#' al final.
$link = trailingslashit(get_permalink()) .
user_trailingslashit( "chapter/".$page_index, 'ch');
}
Supongo que debe haber un mecanismo más sencillo en WP para crear enlaces, pero por el momento este es el que estoy empleando, y hasta ahora ha funcionado sin contratiempos.
Para leer los valores de las etiquetas empleé el siguiente código
// Este código se debe aplicar en las secciones donde se requiere conocer
// la variable.
if ($wp_rewrite->using_permalinks()) { // ¿Usa Permalinks?
$chapter = $wp_query->query_vars['chapter'];
} else { // No usa Permalinks
$chapter = $_GET['chapter'];
}
Una vez implementado este código en el plugin se deben regenerar las reglas de las etiquetas, de lo contrario seguirá empleando las reglas que tiene asignadas en cache. Para recrear el arreglo de reglas hay que ir al módulo de Permalinks en la configuración de WordPress y presionar el botón de ‘Guardar Cambios’; eso es todo, no se necesita más. Con esto WordPress hace un repaso por todos los filtros de asignación y creará las nuevas reglas.
El resultado de este proceso lo pueden ver en los reportes y páginas divididos en capítulos, por ejemplo en el informe sobre el viaje a la Laguna Verde en el Parque de los Nevados (Colombia), y en la página de fotografías.
El plugin para manejo de capítulos lo pueden encontrar en su respectiva página.