Fügen Sie benutzerdefinierten Beitragstypen die Erweiterung .html (Punkt-HTML) hinzu

10

Gibt es eine Möglichkeit, die .htmlErweiterung benutzerdefinierten Beitragstypen ohne Plugin hinzuzufügen ?

Für Beiträge kann ich /%postname.htmldie Permalink-Einstellungen verwenden

Für Seiten kann ich verwenden:

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

Für benutzerdefinierte Beitragstypen ???

Gibt es einen ähnlichen Code wie oben, der es mir ermöglicht, die .htmlURL des benutzerdefinierten Beitragstyps zu ändern oder hinzuzufügen ?

user983248
quelle
5
Sie fragen sich nur, aus welchem ​​Grund Sie .html hinzufügen möchten?
Vince Pettit
Nun, function post-type_permalinkwird einen Fehler werfen. Wenn Sie diesen Fehler nicht erhalten, ist bei Ihren Debug-Einstellungen ein schmerzlicher Fehler aufgetreten. Bitte überarbeiten Sie auch Ihre Frage mit den richtigen Absichten in den Zeilen. Vielen Dank.
Kaiser
@kaiser, soll nur wissen, wie ich die gleichen Permalink-Einstellungen für die benutzerdefinierten Beitragstypen verwenden kann. Wenn ich /$postname.htmlfür die Beiträge festgelegt habe, wie kann ich dasselbe für die benutzerdefinierten Beitragstypen verwenden.
user983248
Du hast keine einzige Zeile gelesen, die ich in meinem Kommentar geschrieben habe, oder? Bitte korrigieren Sie Ihren Code. Funktioniert auch -nicht in Funktionsnamen ...
Kaiser
@kaiser Ja, ich habe, aber ich bin nicht Flash, und ich habe ein
Handproblem

Antworten:

8

Das scheint zu funktionieren:

Erstellen Sie die Umschreiberegeln wie post-type/post-name.html. Sie können Arrays verwenden, um die Regeln für nur einige Post-Typen zu erstellen, anstatt dies für alle zu tun.

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

Formatieren Sie die neue Permalink-Struktur für diese Beitragstypen.

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

Beenden Sie dann die Umleitung der kanonischen URLs, um den abschließenden Schrägstrich zu entfernen. Dies erfordert möglicherweise etwas mehr Arbeit, da Sie die Umleitung wahrscheinlich in den meisten Fällen beibehalten möchten.

add_filter( 'redirect_canonical', '__return_false' );

Wie andere hier bereits sagten, müssen Sie nach dem oben beschriebenen Vorgehen die Regeln options-permalink.phplöschen Dashboard -> Settings -> Permalinks. Dies ist möglich, indem Sie die Administrationsseite in besuchen .

vmassuchetto
quelle
6
Oi Vinicius, eine gute Antwortpraxis besteht darin, allen Funktionsnamen wpse_59024_ (Frage-ID) voranzustellen , um Konflikte zwischen Kopie / Pasta zu vermeiden;). . . Und hat den zusätzlichen Vorteil zu wissen, zu welcher Antwort dieser Code in unserer Snippets-Bibliothek gehört. . . . . +1 genau richtig!
Brasofilo
Dieser Code würde alle anderen Filter überschreiben, die den post_type_linkFilter verwenden
Tom J Nowell
4

Sie können hierfür eine Umschreiberegel hinzufügen, die die integrierten Permalinks ersetzt, z. B. für einen benutzerdefinierten Beitragstyp "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');
}

(Vergessen Sie nicht, Ihre Regeln zu flush_rulesleeren, indem Sie Ihre Permalinks erneut speichern oder wie oben beschrieben @toscho verwenden).

Vorsichtsmaßnahmen

  • Ich glaube nicht, dass Funktionen wie diese the_permalink()dies verwenden würden, daher müssen Sie möglicherweise einen Filter hinzufügen post_link, um diese Links abzufangen. Sie können dem redirect_canonicalFilter auch hinzufügen, um die Standardpermalinks umzuleiten, sodass / product / foo und / product / foo / zu /product/foo.html umleiten.
  • Sie müssten zusätzliche Umschreibungen für andere von Ihrer Website verwendete URLs hinzufügen, z. B. Feed-URLs, nachfolgende Seiten, Trackbacks usw. Der obige Code funktioniert nur für die Hauptseite des benutzerdefinierten Beitragstyps.
Matthew Boynes
quelle
2

Wenn Sie ein WordPress-Plugin bevorzugen, um die Arbeit für Sie zu erledigen, lesen Sie Benutzerdefinierte Permalinks vom Typ Post im WordPress-Plugin-Repository. Getestet auf WordPress 3.4.1 und es funktioniert perfekt.

Navigieren Sie nach dem Aktivieren des Plugins einfach zu Dashboard -> Einstellungen -> Permalinks. Sie können für jeden registrierten benutzerdefinierten Beitragstyp bestimmte Umschreibungen hinzufügen.

Michael Ecklund
quelle
3
Löschen Sie die Umschreiberegeln nicht bei jedem Laden der Seite.
Fuxia
Dieser Code funktioniert nicht, auch wenn Sie nur Code aus xplus3.net/2010/05/20/wp3-custom-post-type-permalinks kopieren und einfügen, stellen Sie sicher, dass er wie erwartet funktioniert -1 zum Nicht-Testen
user983248
@toscho wie willst du das machen oder damit aufhören?
user983248
1
flush_rules()sollte nur bei De / Aktivierung aufgerufen werden, weil es sehr langsam ist. Sie können überprüfen $GLOBALS['wp_rewrite']->rules, ob die Regeln bereits bekannt sind.
Fuxia
@ Michael Ecklund Es gibt eine 404 Ich arbeite nicht. Hast du diesen Code getestet?
user983248