Adicione a extensão .html (ponto HTML) aos tipos de postagem personalizados

10

Existe alguma maneira de adicionar a .htmlextensão a tipos de postagem personalizados sem plug-in ?

Para postagens que posso usar /%postname.htmlnas configurações do link permanente

Para páginas que posso usar:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

Para tipos de postagem personalizados ???

Existe algum código semelhante ao acima que me permita alterar ou adicionar o .htmlURL personalizado do tipo de postagem?

user983248
fonte
5
Basta saber por que motivo você deseja adicionar .html?
Vince Pettit
Bem, function post-type_permalinkvai lançar um erro. Se você não receber esse erro, terá algo dolorosamente errado com suas configurações de depuração. Também refaça sua pergunta com as intenções corretas nas linhas. Obrigado.
Kaiser
@ Kaiser, é apenas para saber como posso usar as mesmas configurações de link permanente nos tipos de postagem personalizados. Se eu definir /$postname.htmlpara as postagens, como posso usar o mesmo para os tipos de postagens personalizadas.
user983248
Você não leu uma única linha que escrevi no meu comentário, certo? Corrija seu código. Também -não funciona em nomes de função ...
kaiser
@kaiser Sim, eu fiz, mas eu não sou Flash, e eu tenho um problema lado, então eu não posso escrever como eu pensar ou falar
user983248

Respostas:

8

Isso parece funcionar:

Crie as regras de reescrita como post-type/post-name.html. Você pode usar matrizes para criar as regras para apenas um conjunto de tipos de postagem, em vez de fazê-lo para todos eles.

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

Formate a nova estrutura de link permanente para esses tipos de postagem.

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

E pare de redirecionar os URLs canônicos para remover a barra final. Isso pode exigir mais trabalho, pois você provavelmente desejará manter o redirecionamento na maioria dos casos.

add_filter( 'redirect_canonical', '__return_false' );

Como outros disseram por aqui, depois de fazer o acima, você precisará executar as regras, e isso é possível visitando a options-permalink.phppágina de administração em Dashboard -> Settings -> Permalinks.

vmassuchetto
fonte
6
Oi Vinicius, uma boa prática de resposta é prefixar todos os nomes de funções com wpse_59024_ (ID da pergunta) para evitar conflitos de cópia / pasta;). . . E tem o benefício extra de saber a qual resposta esse código pertence à nossa biblioteca de trechos. . . . . +1 Spot on!
brasofilo 28/07/12
Este código iria substituir quaisquer outros filtros que usam o post_type_linkfiltro
Tom J Nowell
4

Você pode adicionar uma regra de reescrita para isso que substitua os links permanentes incorporados, por exemplo, para um tipo de postagem personalizado "produto" ...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(Não esqueça de liberar suas regras, salvando novamente os links permanentes ou usando flush_rulesda maneira @toscho notes acima).

Ressalvas

  • Eu não acho que funções como the_permalink()usariam isso, então você pode precisar adicionar um filtro para post_linkcapturar esses links. Você também pode adicionar ao redirect_canonicalfiltro para redirecionar os links permanentes padrão, para que / product / foo e / product / foo / redirecionem para /product/foo.html.
  • Você precisaria adicionar reescritas adicionais para outros URLs usados ​​pelo site, como URLs de feed, páginas subseqüentes, trackbacks etc. O código acima funcionaria apenas na página principal Tipo de postagem personalizada.
Matthew Boynes
fonte
2

Se você preferir um plugin do WordPress para lidar com o trabalho, confira Permalinks personalizados de tipo de postagem no repositório de plugins do WordPress. Testado no WordPress 3.4.1 e funciona perfeitamente.

Após ativar o plug-in, basta navegar para Painel -> Configurações -> Links permanentes. Você pode adicionar regravações específicas para cada tipo de postagem personalizada registrada.

Michael Ecklund
fonte
3
Não libere as regras de reescrita a cada carregamento da página.
fuxia
esse código não está funcionando, também se você apenas copiar e colar o código de xplus3.net/2010/05/05/20/wp3-custom-post-type-permalinks, verifique se ele funciona como esperado -1 para não testar
user983248
@toscho como você supõe fazer isso ou parar com isso?
user983248
11
flush_rules()deve ser chamado na desativação / ativação apenas porque é muito lento. Você pode verificar $GLOBALS['wp_rewrite']->rulesse as regras já são conhecidas.
fuxia
@ Michael Ecklund Dá um 404 Eu não trabalho. Você testou esse código?
user983248