Page permalink conflict com Date

4

Eu preciso acessar uma página que é o nome 2011. O problema é que WP acha que estou tentando ler as postagens de 2011 do meu blog.

A única maneira de fazer com que funcione no momento é alterar o permalink da minha página de 2011 para mypage-2011.

Existe alguma maneira que eu possa fazer / forçar o WP a usar o 2011 como link permanente para a página 2011, para que possa ser visto em www.site.com/2011

thx s

    
por salocin 25.06.2012 / 11:57

1 resposta

4

Antes de mais nada, o tratamento de reescrita pode se tornar muito complicado muito rapidamente - particularmente quando a estrutura desejada entra em conflito com o comportamento padrão do WordPress. O melhor conselho é provavelmente evitar esses conflitos, em vez de tentar resolvê-los. Com isso como um pré-ajustável ...

O WordPress gera regras de reescrita de várias fontes: de tipos de postagem registrados, regras que os plug-ins adicionam manualmente e também 'tags' (padrão / plug-in adicionado). Tags são o %year% , %author% etc que você pode usar em sua estrutura permalink customizada. Ele também reescreve as regras que ele gera automaticamente: Elas incluem estruturas de datas (consulte source ). por exemplo.

  www.example.com/2012 => www.example.com?year=2012
  www.example.com/2012/05 => www.example.com?year=2012&monthnum=05

Estas regras são mais específicas do que as regras da página, pois só se aplicam a (na regex) ([0-9]{4}) - ou seja, 4 dígitos como 2012. (A segunda regra aplica-se apenas a ([0-9]{4})/([0-9]{2}) por exemplo 2012/05.

Existem duas soluções para isso:

  • Alterar a regra para a tag %year%
  • Alterar as regras de regravação de data

Alterar regra para a tag% year%

Como mencionado acima, a tag %year% espera um número de 4 dígitos - e a regra correspondente só aparece quando isso é atendido. Você pode alterar essa regra para que corresponda apenas a date/([0-9]{4}) , ou seja, corresponde a date/[four-digit-number] . Para fazer isso:

add_action('init','wpse56448_change_year_tag');
function wpse56448_change_year_tag(){
     add_rewrite_tag('%date%','(date/[0-9]{4})');
}

Aviso: Isso significa que sempre que a tag %year% for usada (digamos, em sua estrutura personalizada de permalink) - o ano no link permanente deve ser precedido por date/ . Alterações notáveis incluem

  www.example.com/2012/05

não aponta mais para arquivos de maio de 2012. Em vez disso você deve usar:

  www.example.com/date/2012/05

(de forma semelhante para o arquivo de datas).

Por esse motivo, você pode preferir usar o método 2.

Altere as regras de regravação de data

Quando as regras de reescrita da data estão sendo geradas, elas são filtradas (consulte source ) usando os filtros date_rewrite_rules .

Mais especificamente, uma matriz da forma regex=>query é filtrada. Uma matriz em que a chave é uma expressão regular e o valor é como ela é interpretada como uma consulta). Por exemplo:

Array
(
    [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
    [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
    [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]
    [([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]
    [([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
    [([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
    [([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]
    [([0-9]{4})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]
    [([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
    [([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
    [([0-9]{4})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&paged=$matches[2]
    [([0-9]{4})/?$] => index.php?year=$matches[1]
)

Esta é a última regra que está causando o problema. Então você pode removê-lo e adicionar um substituto (se desejado):

add_filter('date_rewrite_rules','wpse56448_date_rewrite_rules');
function wpse56448_date_rewrite_rules( $rules ){
    //Remove year rewrite rule:
    unset($rules['([0-9]{4})/?$']);

    //Replace it with something else
    $rules['year/([0-9]{4})/?$'] = 'index.php?year=$matches[1]';
    return $rules;
}

Agora

  www.example.com/2012

vai para sua página. E

  www.example.com/year/2012

aponta para os arquivos do ano. Enquanto os arquivos do mês permanecem inalterados. por exemplo:

  www.example.com/date/2012/05

ainda aponta para o arquivo de maio de 2012.

Aviso: está claro que você poderá ver outro conflito se sua página de 2012 tiver uma subpágina chamada '05'. Problemas semelhantes ocorrerão se você usar 'page', 'feed', 'atom' etc (consulte as regras de reconfiguração acima). Esse método exige que você remova / substitua manualmente cada uma das regras que precisam ser alteradas. Isso pode ficar confuso rapidamente - e é por isso que é melhor evitar usá-los como nomes de páginas.

Resumo

Primeiro, todas as alterações não serão efetivadas até você liberar as regras de reconfiguração. Faça isso (apenas) indo para Configurações > Permalinks e clicando em salvar.

O método 2 é provavelmente preferível - dado que o método 1 pode fazer "demais". No entanto, o método 2 é um pouco "mais sujo" - você está "afinando" a permastrutura da data e talvez descubra que precisa ajustá-lo ainda mais.

Por exemplo, usando o método 2, se sua página de 2012 tiver uma subpágina 05 - seu link permanente será interpretado como o arquivo de maio de 2012. Você precisaria então alterar as regras de reescrita dos arquivos do mês. Com três níveis de profundidade, com uma página chamada '01', você receberá o arquivo de 1º de maio de 2012. Em cada nível, você também terá problemas se você tiver páginas chamadas "página" ou "feed". Como mencionado, é provavelmente melhor tentar evitar esses nomes.

    
por Stephen Harris 25.06.2012 / 14:49