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.