add_rewrite_rule () vs $ wp_rewrite-rules vs 'rewrite_rules_array'?

5

He escrito reglas de Reescritura para mis tipos de publicaciones personalizadas. funcionan bien, excepto que WP no actualiza la url en el Agente de usuario cuando el redirect_url no coincide con el required_url.

todo lo demás funciona muy bien, incluyendo mis permastructs personalizados ('post_type_link') y las opciones de plantillas personalizadas ('single-template').

mis reglas:

// custom URL rewrite for Album posts
add_action( 'init', 'gregory_rewrite_album_link' );
function gregory_rewrite_album_link()
{
    // album--%album_slug%/ OR album/%album_slug%/
    // preferred permastruct: album--%album_slug%/
    add_rewrite_rule(
        '^album(/|--)([^/]+)/?$',
        'index.php?post_type=gregory-cpt-album&name=$matches[2]',
        'top' );
}

// custom URL rewrite for Track posts
add_action( 'init', 'gregory_rewrite_track_link' );
function gregory_rewrite_track_link()
{
    // accepts and rewrites the following permutations:
    // where album would be: album--%album_slug% OR album/%album_slug%
    // where track would be: track--%track_slug% OR track/%track_slug%
    // preferred permastruct: album--%album_slug%/track--%track_slug%/
    add_rewrite_rule(
        '^(album(/|--)[^/]+/)?track(/|--)([^/]+)/?$',
        'index.php?post_type=gregory-cpt-track&name=$matches[4]',
        'top' );
}

Me preguntaba cuáles eran las diferencias entre usar add_rewrite_rule (), agregar reglas directamente a $ wp_rewrite- > rules, y enganchar a rewrite_rules_array? ¿hay diferencias? ¿Una de las alternativas obligaría a WP a actualizar la url en el Agente de usuario cuando el enlace permanente de la publicación de destino difería de la url solicitada?

un ejemplo de la url que no se actualiza ... las publicaciones del álbum y de la pista están vinculadas por un término de taxonomía mutua. el enlace en 'post_type_link' para pistas encuentra el álbum vinculado e inserta su barra en el enlace permanente. las reglas de Reescritura anteriores aseguran que funcionen tanto los permastructs nuevos como los tradicionales, pero al solicitar esta url /album/serenity/track--beetle-attack/ encontrará la publicación pero no actualizará la url a /album--serenity/track--beetle-attack/ .

es poco probable que alguien use los permastructs tradicionales porque no los anunciaré ni los usaré en mi sitio, pero sería un buen extra ver que las URL se actualicen en el Agente de Usuario, si es posible.

saludos,
Gregory

    
pregunta Gregory 02.05.2012 - 19:02

1 respuesta

4

En primer lugar, use add_rewrite_rule() durante el envío de mensajes directamente con $wp_rewrite->rules si es posible. Este último es un poco bajo nivel.

Respecto a la 'url no actualizada' - este no es el trabajo de las reglas de reescritura. Simplemente apuntan las URL a su contenido, pero no actualizan la barra de direcciones del usuario.

El archivo responsable de esto es /wp-includes/canonical.php . En particular, la función redirect_canonical() enganchada en template_redirect .

Este redirect_canonical() tiene su propio filtro:

add_filter('redirect_canonical', 'wpse50912_redirect_canonical',10,2)
function wpse50912_redirect_canonical($redirect_url, $requested_url){

     //Do stuff - determine if url is requesting album/track and check
     //If it is, check it is using the new structure. 
     //Return the url you want in the address bar.

     return $redirect_url;
}
    
respondido por el Stephen Harris 02.05.2012 - 19:22

Lea otras preguntas en las etiquetas