web-dev-qa-db-fra.com

Ajouter l'extension .html aux types de publication personnalisés

J'ai déjà trouvé une solution de travail pour ma question, mais le problème est qu'il neutralise une autre fonction qui ajoute la base de catégorie dans les permaliens de type de message personnalisé, et j'ai besoin des deux , donc Je dois les fusionner d’une manière ou d’une autre . Comment faire ça?

C'est le code qui ajoute l'extension .html aux types de publication personnalisés:

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

Et c’est le code qui ajoute la catégorie de base à un type de message personnalisé cources (voir une solution similaire , et un autre ):

//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

Reprenons ces fonctions et paraphrasons-les en anglais, puis classons-les dans leur ordre d'exécution. Je vais délibérément éviter d'utiliser PHP dans cette réponse, mais une compréhension de base de PHP sera nécessaire:

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"

Donc, custom_post_permalink n'ajoute pas .html à la fin de vos URL comme vous le pensiez, il crée une nouvelle URL. Si vous avez changé la priorité de 3 à 11, vos URL .html fonctionneront, mais vos URL de cours ne seront pas remplacées, car %course% a été remplacé.

Heureusement, la fonction wpa_course_post_link fournit un meilleur modèle pour ce faire. Institué de saisir les termes du cours et de remplacer une chaîne, il suffit d'ajouter le fichier .html à la fin de la chaîne $post_link et de le renvoyer

Au lieu de cela, si nous écrivons cela sous forme de pseudocode en anglais simplifié, nous pourrions obtenir ceci:

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

Je laisse la conversion à PHP en tant que tâche du lecteur, tous les PHP nécessaires sont déjà disponibles dans la question.

4
Tom J Nowell

Avec l’aide de @ tom-j-nowell j’ai une solution qui marche. Je suppose que ce n'est pas encore parfait, mais cela fonctionne.

//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