Cum să adaugi extensia .html la tipurile personalizate de postări în WordPress
Există vreo metodă de a adăuga extensia .html
la tipurile personalizate de postări fără plugin?
Pentru postări obișnuite pot folosi /%postname.html
în setările de legături permanente
Pentru pagini pot folosi:
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';
}
Dar pentru tipurile personalizate de postări (Custom Post Types)???
Există vreun fragment de cod similar cu cel de mai sus care să îmi permită să modific sau să adaug extensia .html
la URL-ul tipurilor de postări personalizate?

Acest lucru pare să funcționeze:
Creați regulile de rescriere precum tip-post/nume-post.html
. Puteți folosi array-uri pentru a crea reguli doar pentru anumite tipuri de postări, în loc să le faceți pentru toate.
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;
}
Formatați noua structură de permalink pentru aceste tipuri de postări.
add_filter( 'post_type_link', 'custom_post_permalink' ); // pentru cpt post_type_link (mai degrabă decât post_link)
function custom_post_permalink ( $post_link ) {
global $post;
$type = get_post_type( $post->ID );
return home_url( $type . '/' . $post->post_name . '.html' );
}
Și apoi opriți redirecționarea URL-urilor canonice pentru a elimina slash-ul de la final. Acest lucru ar putea necesita mai multă muncă, deoarece probabil veți dori să păstrați redirecționarea pentru majoritatea cazurilor.
add_filter( 'redirect_canonical', '__return_false' );
După cum au spus și alții, după ce faceți toate acestea, va trebui să reîmprospătați regulile, iar acest lucru se poate face prin vizitarea paginii de administrare options-permalink.php
în Panou de control -> Setări -> Legături permanente
.

Oi Vinicius, o practică bună de răspuns este să prefixezi toate numele de funcții cu wpse_59024_
(ID-ul întrebării) pentru a evita conflictele de copy/pasta ;) . . . Și are beneficiul suplimentar de a ști cărui Răspuns îi aparține acel cod în biblioteca noastră de fragmente. . . . . +1 Exact așa!

Puteți adăuga o regulă de rescriere pentru aceasta care să înlocuiască legăturile permanente predefinite, de exemplu pentru un tip personalizat de postare "produs"...
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');
}
(Nu uitați să reîmprospătați regulile fie prin salvarea din nou a legăturilor permanente, fie folosind flush_rules
așa cum menționează @toscho mai sus).
Avertismente
- Nu cred că funcții precum
the_permalink()
ar folosi această regulă, așa că poate fi necesar să adăugați un filtru pentrupost_link
pentru a intercepta aceste legături. De asemenea, puteți adăuga la filtrulredirect_canonical
pentru a redirecționa legăturile permanente implicite, astfel încât /product/foo și /product/foo/ să fie redirecționate către /product/foo.html. - Ar fi necesar să adăugați reguli de rescriere suplimentare pentru alte URL-uri folosite de site-ul dvs., precum URL-uri pentru fluxuri, pagini următoare, trackback-uri etc. Codul de mai sus ar funcționa doar pentru pagina principală a Tipului de Postare Personalizat.

Dacă preferați un plugin WordPress care să se ocupe de această sarcină pentru dumneavoastră, verificați Custom Post Type Permalinks în depozitul de plugin-uri WordPress. Testat pe WordPress 3.4.1 și funcționează perfect.
După activarea plugin-ului, navigați la Tablou de bord -> Setări -> Legături permanente. Puteți adăuga reguli specifice de rescriere pentru fiecare tip de postare personalizată înregistrată.

codul acela nu funcționează, iar dacă doar copiați și lipiți codul de pe http://xplus3.net/2010/05/20/wp3-custom-post-type-permalinks/ asigurați-vă că funcționează conform așteptărilor -1 pentru ne-testare

flush_rules()
ar trebui apelată doar la activare/dezactivare deoarece este foarte lentă. Poți verifica $GLOBALS['wp_rewrite']->rules
pentru a vedea dacă regulile sunt deja cunoscute.

@Michael Ecklund Dă eroare 404 și nu funcționează. Ai testat acel cod?

@user983248 Greșeală de începător să nu testez codul. Îmi cer scuze. Totuși, cred că realizarea acestei sarcini programatic este destul de dificilă. Soluția cu pluginul oferită funcționează perfect pe WordPress 3.4.1

@MichaelEcklund Doar pentru a păstra aspectul și fluxul, paginile și articolele sunt deja .html, și personal nu-mi plac URL-urile care nu se termină cu o extensie de fișier sau măcar cu o bară oblică la final. Plugin-ul pe care îl menționezi nu funcționează în cazul meu, nu face nicio diferență deloc, vezi aici -> http://wordpress.stackexchange.com/questions/59006/custom-post-types-and-permalinks Acesta este tipul de postare personalizată unde încerc să adaug extensia .html.
