Ajouter l'extension .html (dot HTML) aux types de publication personnalisés

10

Existe-t-il un moyen d'ajouter l' .htmlextension aux types de publication personnalisés sans plugin ?

Pour les messages que je peux utiliser /%postname.htmlsur 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 publication personnalisés ???

Y a-t-il un morceau de code similaire à celui ci-dessus qui me permet de modifier ou d'ajouter l' .htmlURL du type de message personnalisé?

user983248
la source
5
Vous vous demandez simplement pour quelle raison vous souhaitez ajouter .html?
Vince Pettit
Eh bien, function post-type_permalinkjettera une erreur. Si vous ne recevez pas cette erreur, vous avez un problème douloureux avec vos paramètres de débogage. Veuillez également retravailler votre question avec les bonnes intentions sur les lignes. Merci.
kaiser
@kaiser, c'est juste pour savoir comment utiliser les mêmes paramètres de permalien sur les types de publication personnalisés. Si je définis /$postname.htmlpour les messages, comment puis-je utiliser la même chose pour les types de messages personnalisés.
user983248
Vous n'avez pas lu une seule ligne que j'ai écrite dans mon commentaire, non? Veuillez corriger votre code. Aussi -ne fonctionne pas dans les noms de fonction ...
kaiser
@kaiser Oui, mais je ne suis pas Flash, et j'ai un problème de main, donc je ne peux pas taper comme je pense ou parler
user983248

Réponses:

8

Cela semble fonctionner:

Créez les règles de réécriture comme post-type/post-name.html. Vous pouvez utiliser des tableaux pour créer les règles d'un ensemble de types de publication au lieu de le faire pour chacun d'eux.

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 de 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 de fin. 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 ici, après avoir fait ce qui précède, vous devrez vider les règles, et c'est possible en visitant la options-permalink.phppage d'administration dans Dashboard -> Settings -> Permalinks.

vmassuchetto
la source
6
Oi Vinicius, une bonne pratique de réponse consiste à préfixer tous les noms de fonction avec wpse_59024_ (ID de question) pour éviter les conflits de copie / pâtes;). . . Et a l'avantage supplémentaire de savoir à quelle réponse appartient ce code dans notre bibliothèque d'extraits de code. . . . . +1 Spot on!
brasofilo
Ce code écraserait tous les autres filtres qui utilisent le post_type_linkfiltre
Tom J Nowell
4

Vous pouvez ajouter une règle de réécriture pour cela qui remplace les permaliens intégrés, par exemple pour un type de publication 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 vider vos règles en ré-enregistrant vos permaliens ou en utilisant flush_rulesles notes @toscho ci-dessus).

Avertissements

  • Je ne pense pas que des fonctions comme the_permalink()utiliseraient ceci, donc vous pourriez avoir à ajouter un filtre pour post_linkattraper ces liens. Vous pouvez également ajouter au redirect_canonicalfiltre pour rediriger les permaliens par défaut, afin que / product / foo et / product / foo / redirect vers /product/foo.html.
  • Vous devrez ajouter des réécritures supplémentaires pour les autres URL que votre site utilise, comme les URL de flux, les pages suivantes, les rétroliens, etc. Le code ci-dessus ne fonctionnerait que pour la page principale du type de publication personnalisé.
Matthew Boynes
la source
2

Si vous préférez un plugin WordPress pour gérer le travail pour vous, consultez les permaliens de type de publication personnalisés dans le référentiel de plugins WordPress. Testé sur WordPress 3.4.1 et cela fonctionne parfaitement.

Après avoir activé le plugin, accédez simplement à Dashboard -> Settings -> Permalinks. Vous pouvez ajouter des réécritures spécifiques pour chaque type de publication personnalisé enregistré.

Michael Ecklund
la source
3
Ne videz pas les règles de réécriture à chaque chargement de page.
fuxia
ce code ne fonctionne pas, même si vous copiez et collez simplement le code de xplus3.net/2010/05/20/wp3-custom-post-type-permalinks assurez-vous qu'il fonctionne comme prévu -1 pour ne pas tester
user983248
@toscho comment pensez-vous faire ou arrêter cela?
user983248
1
flush_rules()ne doit être appelé que sur / activation car il est très lent. Vous pouvez vérifier $GLOBALS['wp_rewrite']->rulessi les règles sont déjà connues.
fuxia
@Michael Ecklund Il donne un 404 je ne travaille pas. Avez-vous testé ce code?
user983248