Aggiungere estensione .html ai custom post type

19 lug 2012, 16:47:21
Visualizzazioni: 16.2K
Voti: 12

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?

5
Commenti

Mi chiedo solo per quale motivo vuoi aggiungere .html?

Vince P Vince P
19 lug 2012 18:29:47

Beh, function post-type_permalink genererà un errore. Se non ricevi questo errore, allora c'è qualcosa di gravemente sbagliato nelle tue impostazioni di debug. Inoltre, per favore riformula la tua domanda con i rientri corretti sulle righe. Grazie.

kaiser kaiser
25 lug 2012 18:11:00

@kaiser, È solo per sapere come posso usare le stesse impostazioni dei permalink per i custom post type. Se imposto /$postname.html per i post, come posso usare lo stesso per i custom post type.

user983248 user983248
25 lug 2012 18:21:46

Non hai letto nemmeno una riga di quello che ho scritto nel mio commento, vero? Per favore, sistema il tuo codice. Inoltre - non funziona nei nomi delle funzioni...

kaiser kaiser
25 lug 2012 18:23:01

@kaiser Sì, l'ho fatto, ma non sono Flash e ho un problema alla mano, quindi non riesco a digitare alla velocità con cui penso o parlo

user983248 user983248
25 lug 2012 18:29:58
Tutte le risposte alla domanda 3
2

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.

28 lug 2012 07:41:09
Commenti

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!

brasofilo brasofilo
28 lug 2012 16:13:13

Questo codice sovrascriverebbe qualsiasi altro filtro che utilizza il filtro post_type_link

Tom J Nowell Tom J Nowell
1 apr 2017 18:34:49
0

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 per post_link per intercettare questi collegamenti. Potresti anche aggiungere il filtro redirect_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.
27 lug 2012 18:45:03
7

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.

19 lug 2012 17:03:44
Commenti

Non ricaricare le regole di riscrittura ad ogni caricamento di pagina.

fuxia fuxia
19 lug 2012 17:07:50

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

user983248 user983248
19 lug 2012 17:11:58

@toscho come pensi di farlo o di fermarlo ?

user983248 user983248
19 lug 2012 17:15:28

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.

fuxia fuxia
19 lug 2012 17:19:39

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

user983248 user983248
19 lug 2012 17:20:03

@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

Michael Ecklund Michael Ecklund
19 lug 2012 18:16:44

@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.

user983248 user983248
19 lug 2012 18:34:52
Mostra i restanti 2 commenti