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?

Henrik Erlandsson
la source

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"

kraftner
la source
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.

Andrew Herder
la source
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);
Carl
la source
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.

molokom
la source
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
Vitali Protosovitski
la source
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é!

Adrian Sticea
la source
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.

jmarceli
la source