El permalink de la página está en conflicto con la Fecha

4

Necesito acceder a una página que tiene el nombre 2011. El problema es que WP piensa que estoy intentando leer las publicaciones de 2011 de mi blog.

La única forma en que puedo hacer que funcione por el momento, es cambiando el enlace permanente de mi página 2011 para que sea mypage-2011.

De todos modos, puedo hacer / forzar que WP use 2011 como enlace permanente para la página 2011, por lo que puede verse en www.site.com/2011

gracias s

    
pregunta salocin 25.06.2012 - 11:57

1 respuesta

4

En primer lugar, el manejo de la reescritura puede ser muy complicado muy rápidamente, especialmente cuando la estructura deseada entra en conflicto con el comportamiento predeterminado de WordPress. El mejor consejo es probablemente evitar tales conflictos en lugar de tratar de resolverlos. Con eso como un premable ...

WordPress genera reglas de reescritura a partir de varias fuentes: a partir de tipos de publicaciones registradas, reglas que los complementos agregan manualmente y también "etiquetas" (predeterminado / complemento agregado). Las etiquetas son el %year% , %author% etc. que puede usar en su estructura personalizada de enlace permanente. También tiene reglas de reescritura que genera automáticamente: incluyen estructuras de fecha (consulte fuente ). p.ej.

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

Estas reglas son más específicas que las reglas de página, ya que solo se aplican a (en regex) ([0-9]{4}) , es decir, números de 4 dígitos como 2012. (La segunda regla solo se aplica a ([0-9]{4})/([0-9]{2}) , por ejemplo, 2012/05.

Hay dos soluciones para esto:

  • Cambie la regla para la etiqueta %year%
  • Cambiar las reglas de reescritura de fecha

Regla de cambio para la etiqueta% year%

Como se mencionó anteriormente, la etiqueta %year% espera un número de 4 dígitos, y la regla correspondiente solo aparece cuando se cumple. Puede cambiar esta regla para que solo coincida con date/([0-9]{4}) , es decir, coincida con date/[four-digit-number] . Para hacer eso:

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

Advertencia: Esto significa que siempre que se use la etiqueta %year% (por ejemplo, en su estructura personalizada de enlace permanente): el año en el enlace permanente debe ir precedido por date/ . Los cambios notables incluyen

  www.example.com/2012/05

ya no apunta a los archivos de mayo de 2012. En su lugar, debe utilizar:

  www.example.com/date/2012/05

(de manera similar para el archivo de fecha).

Por este motivo, es posible que prefieras usar el método 2.

Cambiar las reglas de reescritura de fecha

Cuando las reglas de reescritura de la fecha se generan, se filtran (consulte fuente ) utilizando los filtros date_rewrite_rules .

Más específicamente se filtra una matriz de la forma regex=>query . Una matriz donde la clave es una expresión regular, y el valor es cómo se interpreta como una consulta). Por ejemplo:

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]
)

Es esta última regla la que está causando el problema. Así que puede eliminarlo y luego agregar un reemplazo (si lo desea):

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

Ahora

  www.example.com/2012

va a tu página. Y

  www.example.com/year/2012

apunta a los archivos del año. Mientras que los archivos del mes se mantienen sin cambios. por ejemplo:

  www.example.com/date/2012/05

todavía apunta al archivo de mayo de 2012

Advertencia: Es evidente que puede ver otro conflicto que surge si su página de 2012 tiene una subpágina llamada '05'. Problemas similares ocurrirán si usa 'page', 'feed', 'atom', etc. (vea las reglas de reescritura arriba). Este método requiere que usted elimine / reemplace manualmente cada una de las reglas que deben modificarse. Esto puede ensuciarse rápidamente, por lo que es mejor evitar usar estos como nombres de página.

Resumen

En primer lugar: cualquier cambio no tendrá efecto hasta que elimines las reglas de reescritura. Haga esto (solo) yendo a Configuración > Permalinks y haciendo clic en guardar.

El método 2 es probablemente preferible, dado que el método 1 puede hacer "demasiado". Sin embargo, el método 2 es un poco más "sucio": está "ajustando" la estructura de la fecha y es posible que tenga que ajustarlo más.

Por ejemplo, utilizando el método 2, si su página de 2012 tuviera una subpágina 05, su enlace permanente se interpretaría como el archivo de mayo de 2012. A continuación, deberá modificar las reglas de reescritura para los archivos de meses. Profundizando en tres niveles, con una página llamada '01' obtendrá el archivo del 1 de mayo de 2012. En cada nivel también tiene problemas si tiene páginas llamadas 'página' o 'feed' y similares. Como se mencionó, probablemente es mejor tratar de evitar tales nombres.

    
respondido por el Stephen Harris 25.06.2012 - 14:49

Lea otras preguntas en las etiquetas