Cum să adaugi extensia .html la tipurile personalizate de postări în WordPress

19 iul. 2012, 16:47:21
Vizualizări: 16.2K
Voturi: 12

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?

5
Comentarii

Doar mă întrebam din ce motiv dorești să adaugi .html?

Vince P Vince P
19 iul. 2012 18:29:47

Păi, function post-type_permalink va genera o eroare. Dacă nu primești această eroare, atunci ai ceva profund greșit în setările tale de depanare. De asemenea, te rog să reformulezi întrebarea cu indentările corecte pe linii. Mulțumesc.

kaiser kaiser
25 iul. 2012 18:11:00

@kaiser, Doar ca să știu cum pot folosi aceleași setări pentru permalink-uri pe tipurile personalizate de postări. Dacă setez /$postname.html pentru postări, cum pot folosi același lucru pentru tipurile personalizate de postări.

user983248 user983248
25 iul. 2012 18:21:46

Nu ai citit nici măcar o singură linie din ce am scris în comentariul meu, nu-i așa? Te rog să-ți repari codul. De asemenea, - nu funcționează în numele funcțiilor...

kaiser kaiser
25 iul. 2012 18:23:01

@kaiser Da, am citit, dar nu sunt Flash și am o problemă la mână, așa că nu pot tasta așa cum gândesc sau vorbesc

user983248 user983248
25 iul. 2012 18:29:58
Toate răspunsurile la întrebare 3
2

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.

28 iul. 2012 07:41:09
Comentarii

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!

brasofilo brasofilo
28 iul. 2012 16:13:13

Acest cod ar suprascrie orice alte filtre care folosesc filtrul post_type_link

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

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 pentru post_link pentru a intercepta aceste legături. De asemenea, puteți adăuga la filtrul redirect_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.
27 iul. 2012 18:45:03
7

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

19 iul. 2012 17:03:44
Comentarii

Nu regenera regulile de rescriere la fiecare încărcare de pagină.

fuxia fuxia
19 iul. 2012 17:07:50

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

user983248 user983248
19 iul. 2012 17:11:58

@toscho cum propui să faci asta sau să oprești acest lucru?

user983248 user983248
19 iul. 2012 17:15:28

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.

fuxia fuxia
19 iul. 2012 17:19:39

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

user983248 user983248
19 iul. 2012 17:20:03

@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

Michael Ecklund Michael Ecklund
19 iul. 2012 18:16:44

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

user983248 user983248
19 iul. 2012 18:34:52
Arată celelalte 2 comentarii