it-swarm.com.de

Fügen Sie den benutzerdefinierten Beitragstypen die Erweiterung .html hinzu

Ich habe bereits eine funktionierende Lösung für meine Frage gefunden, aber das Problem ist, dass es neutralisiert eine andere Funktion , die die Kategoriebasis zu den benutzerdefinierten Permalinks für Beitragstypen hinzufügt, und ich benötige beides , also ich muss sie irgendwie zusammenführen . Wie geht das?

Dies ist der Code, der den benutzerdefinierten Beitragstypen die Erweiterung .html hinzufügt:

//Create the rewrite rules like post-type/post-name.html
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;
}

//Format the new permalink structure for these post types.
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' );
}

//And then stop redirecting the canonical URLs to remove the trailing slash.
add_filter( 'redirect_canonical', '__return_false' );

Und dies ist der Code, der die Kategoriebasis zu einem cources benutzerdefinierten Beitragstyp hinzufügt (siehe eine ähnliche Lösung und eine andere ):

//Change your rewrite to add the course query var:
'rewrite' => array('slug' => 'courses/%course%')

//Then filter post_type_link to insert the selected course into the permalink:
function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);  
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course' );
        if( $terms ){
            return str_replace( '%course%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );
3
Iurie Malai

Nehmen wir diese Funktionen und umschreiben sie in Englisch, und ordnen Sie sie in der Reihenfolge, in der sie ausgeführt werden. Ich werde die Verwendung von PHP in dieser Antwort absichtlich vermeiden, aber ein grundlegendes Verständnis von PHP ist erforderlich:

When the `post_type_link` filter runs: // the add_action calls
    run: `wpa_course_post_link` as it has priority 3 // function wpa_course_post_link(....
        if the object is a post
            and that post has a course term
                search for %course% in the URL string and replace it
    Then, run `custom_post_permalink` as it has priority 10: // function custom_post_permalink(...
        Ignore the URL we got given and construct a brand new one by returning the post_type + "/" + posts name + ".html"

custom_post_permalink fügt also nicht .html an das Ende Ihrer URLs an, wie Sie es gedacht haben, sondern erstellt eine ganz neue URL. Wenn Sie die Priorität von 3 auf 11 geändert haben, funktionieren Ihre HTML-URLs, aber Ihre Kurs-URLs werden nicht durch %course% ersetzt.

Glücklicherweise bietet die Funktion wpa_course_post_link eine viel bessere Vorlage dafür. Fügen Sie einfach .html an das Ende des $post_link-Strings an und geben Sie es zurück

Wenn wir es also stattdessen als Pseudocode in einfachem Englisch ausschreiben, erhalten wir möglicherweise Folgendes:

When the `post_type_link` filter runs:
    run: `wpa_course_post_link` as it has priority 3
        if the object is a post, then:
            if that post has a course term then:
                search for %course% in the URL string and replace it
            then add ".html" to the end

Ich überlasse die Konvertierung zu PHP als Aufgabe für den Leser, alle benötigten PHP sind bereits in der Frage vorhanden.

4
Tom J Nowell

Mit Hilfe von @ tom-j-nowell habe ich eine funktionierende Lösung. Ich nehme an, es ist noch nicht perfekt, aber es funktioniert.

//When your create a custom post type change your rewrite to:
'rewrite' => array('slug' => 'courses/%course_category%')

//Then filter post_type_link to insert the category of selected course into the permalink:
function wpa_course_post_link( $post_link, $id = 0 ){
    $post = get_post($id);
    if ( is_object( $post ) ){
        $terms = wp_get_object_terms( $post->ID, 'course_category' );
        if( $terms ){
            $post_link = str_replace( '%course_category%' , $terms[0]->slug , $post_link );
            //and add the .html extension to the returned post link:
            return $post_link . '.html';
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'wpa_course_post_link', 1, 3 );

//Then create the rewrite rules for the post-type/post-category/post-name.html permalink structure:
add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    $new_rules[ 'courses/([^/]+)/(.+)\.html$' ] = 'index.php?courses=$matches[2]';
    return $new_rules + $rules;
}
2
Iurie Malai