Regole di riscrittura personalizzate e modelli di pagina in WordPress
L’ API di riscrittura di WordPress è una solida API presupponendo che tu abbia dimestichezza con le espressioni regolari.
E, onestamente, anche se non lo sei, strumenti come PHP Live RegEx rendono davvero facile testare il tuo codice prima di inserirlo nella add_rewrite_rulechiamata API.
Tuttavia, ci sono momenti in cui potresti trovarti in una situazione in cui devi lavorare con regole di riscrittura e modelli di pagina. E quando questo è il caso, non è sempre così semplice come effettuare una semplice chiamata con una singola espressione regolare.
La ragione? Se hai più pagine che utilizzano lo stesso modello, non avrai sempre la pagina situata nello stesso indice nella query eseguita su ciascuna pagina.
A tal fine, dobbiamo gestirlo in un modo leggermente diverso rispetto, ad esempio, al semplice accesso a un indice numerico di informazioni nella query globale.
Riscrivi regole e modelli di pagina
Per prima cosa, supponiamo di avere due modelli (che non sono in un ordine particolare):
- template-alpha.php
- template-beta.php
E poi supponiamo di voler impostare un URL personalizzato per le pagine ciascuna delle quali utilizza uno di questi modelli.
Questo sarebbe suddiviso nei seguenti passaggi:
- Scorri i post nella query,
- Archivia il post utilizzando il modello nel rispettivo array,
- Imposta le regole di riscrittura per ogni post con una determinata query.
Per questo esempio, manterrò le regole di riscrittura piuttosto semplici. Dopotutto, le espressioni regolari possono essere abbastanza difficili da seguire, quindi provare a seguirle mentre si ha a che fare con l’oggetto Query, più array e gestire le regole può essere un po’ troppo.
Detto questo, ecco un codice di esempio suddiviso in base ai passaggi precedenti. Alla fine del post, condividerò uno snippet che riunisce tutto in alcune funzioni separate in modo da poter vedere come tutto ciò si adatta insieme.
Detto questo, ecco come gestire tutto quanto sopra.
1 Aggiunta di regole di riscrittura
Innanzitutto, dobbiamo leggere alcune informazioni dall’oggetto query globale di WordPress per trovare tutte le pagine a cui sono applicati dei modelli.
Per fare ciò, possiamo leggere le informazioni dall’oggetto query globale in una variabile locale. Questo rende facile uscire dal resto del codice se non c’è niente con cui lavorare.
<?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 Memorizzare le informazioni rilevanti in un array
Supponendo che ci siano pagine con modelli, procederemo con l’archiviazione di ciascuna pagina in array in modo da poter gestire facilmente le rispettive regole di riscrittura.
<?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;
}
}
Si noti che in quanto sopra, faccio riferimento a un array globale. Supponiamo che questo sia semplicemente inizializzato come un array vuoto nel costruttore della classe.
3 Impostare le regole di riscrittura
Ora che abbiamo due array, uno per ogni modello e le pagine che lo contengono, possiamo scorrere attraverso di essi e assegnare regole di riscrittura per ciascuna di quelle pagine.
Ad esempio, supponiamo che per un modello, ad esempio alfa, vogliamo impostare regole di riscrittura per gli Stati Uniti e gli stati.
Ecco il codice pertemplate-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'
);
}
Ed ecco il codice per 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'
);
}
Naturalmente, le espressioni regolari utilizzate nel codice sopra sono semplicemente a scopo dimostrativo. Il tuo sarà per tutto ciò che è necessario per il tuo progetto.
4 Tutti insieme adesso
È importante suddividere tutte queste funzionalità nei propri metodi in modo che possano essere facilmente incapsulate e testate, se necessario.
A tal fine, ecco come apparirà il codice 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'
);
}
}
Ricorda, però; questo è solo basato sul codice demo condiviso in questo post. Quando stai lavorando al tuo progetto, le espressioni regolari, i modelli e così via varieranno.
