Résoudre un nom de type de publication personnalisé et un conflit de permalien de page (même slug)


19

J'ai un type de message personnalisé appelé "visningshus", et aussi une page avec ce slug. C'est comme cela devrait (doit) être.

Actuellement, " http://my-site.com/visningshus " répertorie tous les messages de ce type. Je veux plutôt montrer la page qui a ce slug permalien.

Comment puis-je faire en sorte que Wordpress ne donne pas la priorité au nom du type de publication, mais plutôt au permalien et affiche la page?

Réponses:


33

Le plus simple serait de simplement désactiver la page d'archive pour ce CPT:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

N'oubliez pas de vous rafraîchir les permaliens par la suite dans "Paramètres> Permaliens"


1
Fonctionne parfaitement - mais maintenant, tous les permaliens commençant par le nom du type de message personnalisé donnent un 404, malgré le fait qu'ils soient corrects dans wp-admin et qu'il ne semble pas y avoir de réécriture. C'est-à-dire que tous les permaliens sont corrects sur le site, mais tous les messages personnalisés donnent un 404. Pouvez-vous aider avec ça? :)
Henrik Erlandsson

@HenrikErlandsson Peut-être que votre type de publication porte le même nom que la page. Dans ce cas, je vous recommande de modifier le nom de votre type de message. Exemple: nom de type de publication personnalisé - Avant: produits Après: cpt_products.
Bruno Monteiro

Très intelligent. Résout un tas de problèmes
bysanchy

8

Je ne suis pas assez réputé pour commenter le post de @ Carl, mais c'est la bonne réponse (au moins à cette situation de garder le slug de page et le slug de type de message personnalisé identiques et de ne pas utiliser de fichier archive.php)

Mais sa réponse donnerait des erreurs de pagination. Pour éviter les erreurs de pagination:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Cela examine la pagination, saisit le numéro de page, puis sur le revers l'oblige à utiliser la page avec le slug correspondant, puis insère la variable de page.

Ceci en plus de ce 'has_archive' => false,qui précède devrait atteindre la fonctionnalité souhaitée.

Comme d'autres l'ont indiqué, assurez-vous de vider les règles de réécriture en visitant Paramètres> Permaliens après avoir effectué cette modification.

J'espère que cela aide quelqu'un, car je sais que cela m'a embarrassé pendant très longtemps.


4

Tjena Henrik!

Je pense que tout ce que vous devez faire est d'ajouter une règle de réécriture aux règles de réécriture Wordpress qui ont déjà été créées. Ajoutez cet extrait de code à votre functions.php de votre thème ou incluez-le en tant que pugin séparé ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);

4
Si quelqu'un l'utilise, supprimez flush_rewrite_rules();Vous ne devez pas modifier les règles de réécriture à initchaque fois. Rechargez une fois puis supprimez-le, ou videz manuellement les permaliens en accédant aux paramètres de permaliens dans le tableau de bord d'administration et cliquez sur "Enregistrer les modifications"
tehlivi

0

Je l'ai résolu sans résoudre le conflit. Créez une page avec des visages limaces et écrivez ce que vous voulez. Prenez note de l'ID de cette page.

Créez et personnalisez le modèle archive-custom-post-type.php comme vous le souhaitez (très probablement, vous utiliserez simplement un modèle de page) mais remplacez la partie de boucle par

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Ensuite, lorsque vous irez sur http://my-site.com/visningshus, vous verrez le contenu géré par la page à l'url correcte.

Faites-moi savoir que cela fonctionne.


Belle idée, mais c'est trop compliqué. Avez-vous essayé ma solution?
kraftner

@kraftner non, je ne l'ai pas fait. Je vais essayer la prochaine fois. Merci!
molokom

Cela a également des effets secondaires comme l'en-tête et tout est toujours en cours de création comme s'il s'agissait d'une page d'archive et non d'une page. Je ne conseillerais pas d'utiliser cette solution.
kraftner

Et si l'ID de page change? Ce n'est pas sûr.
Joel James

0

Pas autorisé à voter, mais + pour la solution Carls, register_post_type devrait avoir

'has_archive' => false

Facile. Cependant, lorsque vous rencontrez des problèmes de pagination, jetez un œil à

add_rewrite_rule

0

Ce qui a résolu le problème pour moi, c'était de définir l'archive sur false, mais également de définir la hiérarchie sur false lors de la configuration de mon type de publication personnalisé!


0

Voici une solution générale pour hiérarchiser la pagination sur le contenu des types de publication personnalisés pour TOUT slug de type de publication personnalisé.

// prioritize pagination over displaying custom post type content
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Outre l'ajout de cet extrait, vous devez également vous assurer que votre type de publication personnalisé a archive = false

et enfin, allez à la page des paramètres Permaliens Paramètres> Permaliens (/wp/wp-admin/options-permalink.php) et enregistrez les paramètres actuels pour actualiser la structure des liens sur la page.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.