✅ Notícias, temas e plug-ins da WEB e do WordPress. Aqui compartilhamos dicas e as melhores soluções para sites.

Regras de reescrita personalizadas e modelos de página no WordPress

21

A API do WordPress Rewrite é uma API sólida, supondo que você esteja confortável com expressões regulares.

E, honestamente, mesmo se você não for, ferramentas como PHP Live RegEx tornam muito fácil testar seu código antes de colocá-lo na add_rewrite_rulechamada da API.

Regras de reescrita personalizadas e modelos de página no WordPress

No entanto, há momentos em que você pode se encontrar em uma situação em que precisa trabalhar com regras de reescrita e modelos de página. E quando esse é o caso, nem sempre é tão simples quanto fazer uma simples chamada com uma única expressão regular.

A razão? Se você tiver várias páginas usando o mesmo modelo, nem sempre terá a página localizada no mesmo índice na consulta executada em cada página.

Para isso, temos que lidar com isso de uma maneira um pouco diferente de, digamos, simplesmente acessar um índice numérico de informações na consulta global.

Regras de reescrita e modelos de página

Primeiro, vamos supor que temos dois modelos (que não estão em ordem específica):

  1. template-alpha.php
  2. template-beta.php

E então digamos que queremos configurar um URL personalizado para páginas que usam um desses modelos.

Isso se dividiria nas seguintes etapas:

  1. Iterar pelas postagens na consulta,
  2. Armazene a postagem usando o modelo em sua respectiva matriz,
  3. Configure as regras de reescrita para cada postagem com uma determinada consulta.

Para este exemplo, manterei as regras de reescrita bem simples. Afinal, expressões regulares podem ser difíceis o suficiente para seguir, então tentar segui-las ao lidar com o objeto Query, vários arrays e manipular as regras pode ser um pouco demais.

Com isso dito, aqui está o código de exemplo que é dividido com base nas etapas acima. No final do post, vou compartilhar um trecho que junta tudo em algumas funções separadas para que você possa ver como tudo isso se encaixa.

Com isso dito, veja como lidar com todos os itens acima.

1 Adicionando Regras de Reescrita

Primeiro, precisamos ler algumas informações do objeto de consulta global do WordPress para encontrar todas as páginas que possuem modelos aplicados a elas.

Para fazer isso, podemos ler as informações do objeto de consulta global em uma variável local. Isso facilita a fuga do restante do código se não houver nada com o que trabalhar.

<?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 Armazenar informações relevantes em uma matriz

Assumindo que existem páginas com templates, então continuaremos armazenando cada uma das páginas em arrays para que possamos gerenciar facilmente suas respectivas regras de reescrita.

<?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;
    }
}

Observe que, acima, faço referência a uma matriz global. Suponha que isso seja simplesmente inicializado como uma matriz vazia no construtor da classe.

3 Configure as Regras de Reescrita

Agora que temos dois arrays – um para cada modelo e as páginas que o contêm – podemos iterar por eles e atribuir regras de reescrita para cada uma dessas páginas.

Por exemplo, digamos que para um modelo, digamos alfa, queremos configurar regras de reescrita para os EUA e estados.

Aqui está o 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'
    );
}

E aqui está o 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'
    );
}

Claro, as expressões regulares usadas no código acima são simplesmente para fins de demonstração. O seu será para o que for necessário para o seu projeto.

4 Todos Juntos Agora

É importante dividir toda essa funcionalidade em seus próprios métodos para que tudo possa ser facilmente encapsulado e testado, se necessário.

Para isso, veja como ficará o 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'
        );
    }
}

Lembre-se, porém; isso é apenas baseado no código de demonstração compartilhado neste post. Quando você está trabalhando em seu projeto, as expressões regulares, modelos e assim por diante variam.

Fonte de gravação: tommcfarlin.com

Este site usa cookies para melhorar sua experiência. Presumiremos que você está ok com isso, mas você pode cancelar, se desejar. Aceitar Consulte Mais informação