Aggiungere estensione .html ai custom post type
Esiste un modo per aggiungere l'estensione .html
ai custom post type senza plugin?
Per i post posso usare /%postname.html
nelle impostazioni dei permalink
Per le pagine posso usare:
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';
}
Ma per i Custom post type???
Esiste un pezzo di codice simile a quello sopra che mi permetta di cambiare o aggiungere .html
all'URL del custom post type?

Sembra funzionare:
Crea le regole di riscrittura come post-type/nome-post.html
. Puoi utilizzare array per creare le regole solo per alcuni tipi di post invece di farlo per tutti.
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;
}
Formatta la nuova struttura di permalink per questi tipi di post.
add_filter( 'post_type_link', 'custom_post_permalink' ); // per cpt post_type_link (anziché 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 poi interrompi il reindirizzamento degli URL canonici per rimuovere la barra finale. Potrebbe essere necessario qualche lavoro aggiuntivo, dato che probabilmente vorrai mantenere il reindirizzamento per la maggior parte dei casi.
add_filter( 'redirect_canonical', '__return_false' );
Come altri hanno detto qui, dopo aver fatto quanto sopra dovrai svuotare le regole, e questo è possibile visitando la pagina admin options-permalink.php
in Dashboard -> Impostazioni -> Permalink
.

Ciao Vinicius, una buona pratica per rispondere è prefissare tutti i nomi delle funzioni con wpse_59024_
(ID della domanda) per evitare conflitti con il copia/incolla ;) . . . Inoltre ha il vantaggio aggiuntivo di sapere a quale risposta appartiene quel codice nella nostra libreria di snippet. . . . . +1 Perfetto!

Potresti aggiungere una regola di riscrittura che sovrascrive i permalink predefiniti, ad esempio per un custom post type "product"...
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');
}
(Non dimenticare di svuotare la cache delle regole salvando nuovamente i permalink o utilizzando flush_rules
come notato da @toscho sopra).
Avvertenze
- Non credo che funzioni come
the_permalink()
utilizzerebbero questo formato, quindi potresti dover aggiungere un filtro perpost_link
per intercettare questi collegamenti. Potresti anche aggiungere il filtroredirect_canonical
per reindirizzare i permalink predefiniti, in modo che /product/foo e /product/foo/ vengano reindirizzati a /product/foo.html. - Dovresti aggiungere ulteriori riscritture per altri URL utilizzati dal tuo sito, come feed, pagine successive, trackback, ecc. Il codice sopra funzionerebbe solo per la pagina principale del Custom Post Type.

Se preferisci utilizzare un plugin WordPress per gestire il lavoro, dai un'occhiata a Custom Post Type Permalinks nel repository dei plugin di WordPress. Testato su WordPress 3.4.1 e funziona perfettamente.
Dopo aver attivato il plugin, naviga semplicemente in Dashboard -> Impostazioni -> Permalink. Potrai aggiungere riscritture specifiche per ogni custom post type registrato.

quel codice non funziona, inoltre se copi e incolli semplicemente il codice da http://xplus3.net/2010/05/20/wp3-custom-post-type-permalinks/ assicurati che funzioni come previsto -1 per non aver testato

flush_rules()
dovrebbe essere chiamato solo durante l'attivazione/disattivazione perché è molto lento. Puoi controllare $GLOBALS['wp_rewrite']->rules
per vedere se le regole sono già note.

@Michael Ecklund Restituisce un errore 404 e non funziona. Hai testato quel codice?

@user983248 Errore da principiante quello di non aver testato il codice. Mi scuso. Comunque, penso che realizzare questa operazione a livello di codice sia piuttosto complesso. La soluzione con il plugin fornito funziona perfettamente su WordPress 3.4.1

@MichaelEcklund Solo per mantenere l'aspetto e il flusso, pagine e articoli sono già .html, e personalmente non mi piacciono gli URL che non terminano con un'estensione di file o almeno una barra finale. Il plugin che menzioni non funziona nel mio caso, non fa alcuna differenza, vedi qui -> http://wordpress.stackexchange.com/questions/59006/custom-post-types-and-permalinks Questo è il custom post type dove sto cercando di aggiungere l'estensione .html.
