Aggiungi l'estensione .html (punto HTML) ai tipi di post personalizzati


10

Esiste un modo per aggiungere l' .htmlestensione ai tipi di post personalizzati senza plug-in ?

Per i post che posso usare /%postname.htmlnelle impostazioni del 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';
}

Per i tipi di post personalizzati ???

Esiste un codice simile a quello sopra che mi consente di modificare o aggiungere l' .htmlURL del tipo di post personalizzato?


5
Ti stai solo chiedendo per quale motivo desideri aggiungere .html?
Vince Pettit,

Bene, function post-type_permalinkgenererà un errore. Se non ricevi questo errore, hai qualcosa di dolorosamente sbagliato nelle tue impostazioni di debug. Inoltre, ti preghiamo di rielaborare la tua domanda con le intenzioni corrette sulle linee. Grazie.
Kaiser

@kaiser, è solo per sapere come posso usare le stesse impostazioni di permalink sui tipi di post personalizzati. Se imposto /$postname.htmlper i post, come posso utilizzare lo stesso per i tipi di post personalizzati.
user983248,

Non hai letto una sola riga che ho scritto nel mio commento, giusto? Si prega di correggere il codice. Inoltre -non funziona nei nomi delle funzioni ...
Kaiser

@kaiser Sì, l'ho fatto, ma non sono Flash e ho un problema con la mano, quindi non riesco a digitare come penso o parlo
user983248

Risposte:


8

Questo sembra funzionare:

Crea le regole di riscrittura come post-type/post-name.html. Puoi utilizzare le matrici per creare le regole solo per alcuni set di 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 permalink per questi tipi di post.

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 quindi smettere di reindirizzare gli URL canonici per rimuovere la barra finale. Questo potrebbe richiedere un po 'più di lavoro, poiché probabilmente vorrai mantenere il reindirizzamento nella maggior parte dei casi.

add_filter( 'redirect_canonical', '__return_false' );

Come altri hanno detto qui, dopo aver fatto quanto sopra dovrai svuotare le regole, ed è possibile visitando la options-permalink.phppagina di amministrazione in Dashboard -> Settings -> Permalinks.


6
Oi Vinicius, una buona pratica di risposta è quella di aggiungere un prefisso a tutti i nomi di funzione con wpse_59024_ (ID domanda) per evitare conflitti di copia / pasta;). . . E ha l'ulteriore vantaggio di sapere quale risposta fa quel codice appartiene alla nostra libreria di frammenti. . . . . +1 Spot on!
brasofilo,

Questo codice sovrascriverebbe qualsiasi altro filtro che utilizza il post_type_linkfiltro
Tom J Nowell

4

È possibile aggiungere una regola di riscrittura per questo che sostituisce i permalink incorporati, ad esempio per un tipo di post personalizzato "prodotto" ...

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 le regole salvando nuovamente i permalink o usando flush_rulesle note di @toscho sopra).

Avvertenze

  • Non credo che funzioni come the_permalink()questa userebbero, quindi potresti dover aggiungere un filtro per post_linkcatturare quei collegamenti. Puoi anche aggiungere al redirect_canonicalfiltro per reindirizzare i permalink predefiniti, in modo che / product / foo e / product / foo / redirect su /product/foo.html.
  • Dovresti aggiungere ulteriori riscritture per altri URL utilizzati dal tuo sito, come URL dei feed, pagine successive, trackback, ecc. Il codice sopra funzionerebbe solo per la pagina principale del tipo di post personalizzato.

2

Se preferisci che un plug-in WordPress gestisca il lavoro per te, dai un'occhiata ai permalink di tipo di posta personalizzati nel repository dei plug-in di WordPress. Testato su WordPress 3.4.1 e funziona perfettamente.

Dopo aver attivato il plug-in, vai su Dashboard -> Impostazioni -> Permalink. Puoi aggiungere riscritture specifiche per ogni tipo di post personalizzato registrato.


3
Non scaricare le regole di riscrittura ad ogni caricamento della pagina.
fuxia

quel codice non funziona, anche se copi e incolli il codice da xplus3.net/2010/05/20/wp3-custom-post-type-permalink assicurati che funzioni come previsto -1 per non eseguire test
user983248

@toscho come pensi di farlo o fermarlo?
user983248

1
flush_rules()dovrebbe essere chiamato su de / attivazione solo perché è molto lento. Puoi verificare $GLOBALS['wp_rewrite']->rulesse le regole sono già note.
fuxia

@Michael Ecklund Dà un 404 che non funziona. Hai provato quel codice?
user983248
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.