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?


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.


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.

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.