Dodaj rozszerzenie .html (kropka HTML) do niestandardowych typów postów

10

Czy jest jakiś sposób, aby dodać .htmlrozszerzenie do niestandardowych typów postów bez wtyczki ?

W przypadku postów mogę używać /%postname.htmlustawień permalink

Do stron mogę użyć:

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';
}

Dla niestandardowych typów postów?

Czy jest jakiś kod podobny do powyższego, który pozwala mi zmienić lub dodać .htmladres URL niestandardowego typu postu?

użytkownik983248
źródło
5
Zastanawiasz się tylko, z jakiego powodu chcesz dodać plik .html?
Vince Pettit,
Zgłasza function post-type_permalinkbłąd. Jeśli nie otrzymasz tego błędu, oznacza to, że masz coś boleśnie nie tak z ustawieniami debugowania. Również proszę przerób swoje pytanie z poprawnymi zamiarami na liniach. Dzięki.
kaiser
@kaiser, Czy tylko wiedzieć, jak mogę korzystać z tych samych ustawień łącza bezpośredniego na niestandardowych typach postów. Jeśli ustawię /$postname.htmldla postów, jak mogę użyć tego samego dla niestandardowych typów postów.
user983248,
Nie przeczytałeś ani jednego wiersza, który napisałem w moim komentarzu, prawda? Popraw swój kod. Również -nie działa w nazwach funkcji ...
Kaiser
@kaiser Tak, zrobiłem, ale nie jestem Flashem i mam problem z ręką, więc nie mogę pisać, jak myślę lub mówię
użytkownik983248

Odpowiedzi:

8

To wydaje się działać:

Utwórz reguły przepisywania, takie jak post-type/post-name.html. Możesz użyć tablic, aby utworzyć reguły tylko dla niektórych zestawów typów postów zamiast robić to dla wszystkich.

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;
}

Sformatuj nową strukturę łącza bezpośredniego dla tych typów postów.

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' );
}

A następnie przestań przekierowywać kanoniczne adresy URL, aby usunąć końcowy ukośnik. Może to wymagać nieco więcej pracy, ponieważ prawdopodobnie będziesz chciał zachować przekierowanie w większości przypadków.

add_filter( 'redirect_canonical', '__return_false' );

Jak powiedzieli inni tutaj, po wykonaniu powyższych czynności musisz opróżnić reguły, a jest to możliwe, odwiedzając options-permalink.phpstronę administratora w Dashboard -> Settings -> Permalinks.

vmassuchetto
źródło
6
Oi Vinicius, dobrą praktyką odpowiadania jest poprzedzanie wszystkich nazw funkcji znakiem wpse_59024_ (ID pytania), aby uniknąć konfliktu kopii / makaronu;). . . I ma tę dodatkową zaletę, że wie, która odpowiedź odpowiada, że ​​ten kod należy do naszej biblioteki fragmentów. . . . . +1 miejsce na!
brasofilo
Ten kod nadpisze wszystkie inne filtry, które używają post_type_linkfiltru
Tom J Nowell
4

Możesz dodać regułę przepisywania w tym celu, która zastępuje wbudowane łącza bezpośrednie, np. Dla niestandardowego typu postu „produkt” ...

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');
}

(Nie zapomnij opróżnić swoich reguł poprzez ponowne zapisanie flush_ruleslinków bezpośrednich lub użycie powyższych wskazówek @toscho).

Ostrzeżenia

  • Nie sądzę, żeby takie funkcje the_permalink()wykorzystywały to, więc może być konieczne dodanie filtra, post_linkaby złapać te linki. Możesz również dodać do redirect_canonicalfiltra, aby przekierować domyślne łącza bezpośrednie, tak aby / product / foo i / product / foo / przekierowały do ​​/product/foo.html.
  • Trzeba dodać dodatkowe przepisywanie innych adresów URL używanych w witrynie, takich jak adresy URL kanałów, kolejne strony, trackbacki itp. Powyższy kod działałby tylko dla głównej strony niestandardowego typu postu.
Matthew Boynes
źródło
2

Jeśli wolisz, aby wtyczka WordPress poradziła sobie z twoją pracą, sprawdź Niestandardowe stałe typy wpisów w repozytorium wtyczek WordPress. Testowany na WordPress 3.4.1 i działa idealnie.

Po aktywacji wtyczki przejdź do Dashboard -> Ustawienia -> Permalinks. Możesz dodać konkretne przepisania dla każdego zarejestrowanego niestandardowego typu postu.

Michael Ecklund
źródło
3
Nie opróżniaj reguł przepisywania przy każdym ładowaniu strony.
fuxia
ten kod nie działa, także jeśli po prostu skopiujesz i wkleisz kod z xplus3.net/2010/05/20/wp3-custom-post-type-permalinks upewnij się, że działa zgodnie z oczekiwaniami -1 do nie testowania
user983248
@toscho, jak masz to zrobić lub zatrzymać?
user983248,
1
flush_rules()powinien być wywoływany przy de / aktywacji tylko dlatego, że jest on bardzo wolny. Możesz sprawdzić, $GLOBALS['wp_rewrite']->rulesczy reguły są już znane.
fuxia
@Michael Ecklund Daje 404 I nie działa. Czy przetestowałeś ten kod?
user983248,