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

5

Eu escrevi regras de reescrita para meus tipos de postagem personalizados. eles funcionam bem, exceto que o WP não atualiza o URL no agente do usuário quando o redirect_url não corresponde ao requested_url.

todo o resto funciona muito bem, incluindo minhas opções customizadas de permastructs ('post_type_link') e template customizadas ('template único').

minhas regras:

// 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' );
}

Eu queria saber quais eram as diferenças entre usar o add_rewrite_rule (), anexar regras diretamente às regras do $ wp_rewrite- > e conectar em rewrite_rules_array? Existem diferenças? uma das alternativas forçaria o WP a atualizar o URL no User Agent quando o link permanente do post direcionado diferia do URL solicitado?

um exemplo da URL que não está atualizando ... as postagens de álbuns e faixas são vinculadas por um termo de taxonomia mútua. o hook em 'post_type_link' para tracks encontra o álbum vinculado e insere seu slug no permalink. as regras de reconfiguração acima garantem que os novos e tradicionais permastructs funcionem, mas a solicitação desse url /album/serenity/track--beetle-attack/ localizará a postagem, mas não atualizará a URL para /album--serenity/track--beetle-attack/ .

é improvável que alguém use os permastructs tradicionais porque eu não os anuncio ou os utilizo em meu site, mas seria um bom extra ver o URL ser atualizado no User Agent, se possível.

felicidades,
Gregory

    
por Gregory 02.05.2012 / 19:02

1 resposta

4

Antes de tudo, use add_rewrite_rule() ao invés de mexer diretamente com $wp_rewrite->rules , se possível. O último é um pouco baixo nível.

Em relação ao 'url not updating' - este não é o trabalho das regras de reescrita. Eles simplesmente apontam URLs para seu conteúdo, mas não atualizam a barra de endereços do usuário.

O arquivo responsável por isso é /wp-includes/canonical.php . Em particular, a função redirect_canonical() conectada a template_redirect .

Este redirect_canonical() tem seu próprio 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;
}
    
por Stephen Harris 02.05.2012 / 19:22