Reglas de reescritura personalizadas y plantillas de página en WordPress
La API de reescritura de WordPress es una API sólida, suponiendo que se sienta cómodo con las expresiones regulares.
Y, sinceramente, incluso si no lo eres, herramientas como PHP Live RegEx hacen que sea realmente fácil probar tu código antes de colocarlo en la add_rewrite_rulellamada API.
Sin embargo, hay momentos en los que puede encontrarse en una situación en la que necesita trabajar con reglas de reescritura y plantillas de página. Y cuando ese es el caso, no siempre es tan sencillo como hacer una simple llamada con una sola expresión regular.
¿La razón? Si tiene varias páginas que usan la misma plantilla, no siempre tendrá la página ubicada en el mismo índice en la consulta que se ejecuta en cada página.
Con ese fin, tenemos que manejarlo de una manera ligeramente diferente a, digamos, simplemente accediendo a un índice numérico de información en la consulta global.
Reglas de reescritura y plantillas de página
Primero, supongamos que tenemos dos plantillas (que no están en ningún orden en particular):
- plantilla-alfa.php
- plantilla-beta.php
Y luego digamos que queremos configurar una URL personalizada para las páginas, cada una de las cuales usa una de estas plantillas.
Esto se dividiría en los siguientes pasos:
- Iterar a través de las publicaciones en la consulta,
- Guarde la publicación usando la plantilla en su matriz respectiva,
- Configure las reglas de reescritura para cada publicación que tenga una consulta determinada.
Para este ejemplo, mantendré las reglas de reescritura bastante simples. Después de todo, las expresiones regulares pueden ser lo suficientemente difíciles de seguir, por lo que tratar de seguirlas mientras se trata con el objeto Query, varias matrices y el manejo de las reglas puede ser un poco demasiado.
Dicho esto, aquí hay un código de muestra que se desglosa según los pasos anteriores. Al final de la publicación, compartiré un fragmento que reúne todo en algunas funciones separadas para que pueda ver cómo encaja todo esto.
Dicho esto, aquí le mostramos cómo manejar todo lo anterior.
1 Adición de reglas de reescritura
Primero, necesitamos leer alguna información del objeto de consulta global de WordPress para encontrar todas las páginas que tienen plantillas aplicadas.
Para hacer esto, podemos leer la información del objeto de consulta global en una variable local. Esto facilita eludir el resto del código si no hay nada con lo que trabajar.
<?php
$query = $this->query->query([
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);
if (!$query) {
return;
}
// More to come...
2 Almacenar información relevante en una matriz
Suponiendo que hay páginas que tienen plantillas, procederemos a almacenar cada una de las páginas en matrices para que podamos administrar fácilmente sus respectivas reglas de reescritura.
<?php
foreach ($query as $post) {
$slug = get_page_template_slug($post->ID);
if ('template-alpha.php' === $slug) {
$this->alphaPages[] = $post;
}
if ('template-find-a-camp.php' === $slug) {
$this->betaPages[] = $post;
}
}
Tenga en cuenta que en lo anterior, hago referencia a una matriz global. Suponga que esto simplemente se inicializa como una matriz vacía en el constructor de la clase.
3 Configurar las reglas de reescritura
Ahora que tenemos dos matrices, una para cada plantilla y las páginas que la contienen, podemos iterar a través de ellas y asignar reglas de reescritura para cada una de esas páginas.
Por ejemplo, digamos que para una plantilla, digamos alfa, queremos configurar reglas de reescritura para los EE. UU. y los estados.
Aquí está el código paratemplate-alpha.php:
<?php
add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');
foreach ($this->alphaPages as $post) {
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
'top'
);
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]',
'top'
);
}
Y aquí está el código para template-beta.php:
<?php
add_rewrite_tag('%acme-id%', '([^&]+)');
foreach ($this->betaPages as $post) {
add_rewrite_rule(
'^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
'top'
);
}
Por supuesto, las expresiones regulares utilizadas en el código anterior son simplemente para fines de demostración. El tuyo será para lo que sea necesario para tu proyecto.
4 Todos juntos ahora
Es importante dividir toda esta funcionalidad en sus propios métodos para que todo pueda encapsularse y probarse fácilmente, si es necesario.
Con ese fin, así es como se verá el código completo :
<?php
public function addRewriteRules()
{
$query = $this->query->query([
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);
if (!$query) {
return;
}
$this->setPageTypes($query);
$this->setAlphaRewriteRules();
$this->setBetaRewriteRules();
}
private function setPageTypes($query)
{
foreach ($query as $post) {
$slug = get_page_template_slug($post->ID);
if ('template-alpha.php' === $slug) {
$this->alphaPages[] = $post;
}
if ('template-find-a-camp.php' === $slug) {
$this->betaPages[] = $post;
}
}
}
private function setAlphaRewriteRules()
{
add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');
foreach ($this->alphaRules as $post) {
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
'top'
);
add_rewrite_rule(
'^'.$post->post_name.'/([^/]*)/?',
'index.php?page_id='.$post->ID.'&country=$matches[1]',
'top'
);
}
}
private function setBetaRewriteRules()
{
add_rewrite_tag('%acme-id%', '([^&]+)');
foreach ($this->betaPages as $post) {
add_rewrite_rule(
'^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
'top'
);
}
}
Recuerde, sin embargo; esto solo se basa en el código de demostración compartido en esta publicación. Cuando esté trabajando en su proyecto, las expresiones regulares, las plantillas, etc. variarán.
