web-dev-qa-db-fra.com

Ajouter une extension .html (point HTML) aux types de publication personnalisés

Est-il possible d'ajouter l'extension .html à des types de publication personnalisés sans plugin ?

Pour les publications, je peux utiliser /%postname.html sur les paramètres de permalien

Pour les pages que je peux utiliser:

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

Pour les types de post personnalisés ???

Existe-t-il un élément de code similaire à celui ci-dessus qui me permette de modifier ou d’ajouter le .html à l’URL de type message personnalisé?

9
user983248

Cela semble fonctionner:

Créez les règles de réécriture telles que post-type/post-name.html. Vous pouvez utiliser des tableaux pour créer les règles de certains types de publication au lieu de les appliquer à tous.

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

Formatez la nouvelle structure permalien pour ces types de publication.

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

Et puis arrêtez de rediriger les URL canoniques pour supprimer la barre oblique finale. Cela pourrait nécessiter un peu plus de travail, car vous souhaiterez probablement conserver la redirection dans la plupart des cas.

add_filter( 'redirect_canonical', '__return_false' );

Comme d’autres l’ont dit, après avoir suivi ce qui précède, il vous faudra effacer les règles, ce qui est possible en visitant la page administrateur options-permalink.php dans Dashboard -> Settings -> Permalinks.

7
vmassuchetto

Vous pouvez ajouter une règle de réécriture qui remplace les permaliens intégrés, par exemple. pour un type de message personnalisé "produit" ...

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

(N'oubliez pas de purger vos règles en ré-enregistrant vos permaliens ou en utilisant flush_rules de la manière indiquée par @toscho ci-dessus).

Mises en garde

  • Je ne pense pas que des fonctions comme the_permalink() l'utilisent, vous devrez donc peut-être ajouter un filtre pour post_link pour intercepter ces liens. Vous pouvez également ajouter au filtre redirect_canonical pour rediriger les liaisons permanentes par défaut, de sorte que/product/foo et/product/foo/redirect vers /product/foo.html.
  • Vous devez ajouter des réécritures supplémentaires pour les autres URL utilisées par votre site, telles que les URL de flux, les pages suivantes, les rétroliens, etc. Le code ci-dessus ne fonctionnerait que pour la page principale Type de message personnalisé.
4
Matthew Boynes

Si vous préférez un plugin WordPress pour gérer le travail à votre place, consultez Custom Post Type Permalinks dans le référentiel du plugin WordPress. Testé sur WordPress 3.4.1 et cela fonctionne parfaitement.

Après avoir activé le plug-in, accédez simplement à Tableau de bord -> Paramètres -> Permaliens. Vous pouvez ajouter des réécritures spécifiques pour chaque type de publication personnalisé enregistré.

2
Michael Ecklund