web-dev-qa-db-fra.com

Lien permanent de type publication pour parent/enfant, erreur 404 de page introuvable

Ici, nous avons un extrait d'un fichier functions.php ...

add_action('init', 'create_recipes');
function create_recipes() {
   $recipes_args = array(
       ...some properies...,
       'hierarchical' => false,
       'rewrite' => array('slug' => 'recipes')
       ...maybe more properties...
   }
   register_post_type('recipes',$recipes_args);
}

add_action( 'init', 'recipes_rewrites_init' );
function recipes_rewrites_init(){
    global $wp_rewrite;
    $gallery_structure = 'recipes/%post_id%/%recipe%';
    $wp_rewrite->add_rewrite_tag("%recipe%", '([^/]+)', "recipe=");
    $wp_rewrite->add_permastruct('recipe', $gallery_structure, false);
}

Ceci enregistre un type de post personnalisé 'recettes' et configure la structure de permalien afin que nous puissions atteindre, par exemple:

(1) example.com/recipes/394/lunch/

Sur la page 'lunch', je vanterai les vertus d'un bon déjeuner. Jusqu'ici tout va bien.

Cependant, si je veux subdiviser le terme "déjeuner" en "sandwich", "burger", "salade" (par exemple, sur la page "sandwich", je parlerai du déjeuner - en particulier des sandwichs). Tout d'abord, je crée ces pages supplémentaires dans la section Type de publication personnalisée "Recette", puis je choisis la page "Déjeuner" comme parent. Maintenant, je pourrais espérer/présumer ce qui suit fonctionnera, par exemple:

(2) example.com/recipes/513/lunch/sandwich/

Oh mon Dieu, cela ne fonctionne pas comme présumé - nous recevons une erreur 404. Ok, comment pouvons-nous accéder à la page "sandwich"? Voyons voir...

(3) example.com/recipes/513/sandwich/

Génial, cela fonctionne - mais je voulais que le slug parent de la page "sandwich" ("lunch") le précède dans l'URL (see (2)). Comment résoudre ceci? Commençons quelque part ...

Étape 1

Ce que je sais, c'est que si je change 'hierarchical' => false en 'hierarchical' => true, alors la fonction the_permalink() construira (comme on le souhaite) le permalien comme dans (2). Génial, mais cela entraînera une erreur 404 avec (2). Je suppose que j'ai commis une erreur dans la fonction create_recipes ou peut-être que je n'en ai pas fait assez dans la fonction recipes_rewrites_init.

Étape 2

Je suppose que je pourrais (en théorie) accrocher la fonctionnalité WP permalink pour intercepter la requête/permalink, récupérer le slug parent du message (s'il en a un) et le déposer juste avant le slug du message. Cependant, cela ne modifie probablement que le lien permanent qui en résulte, ce que j'ai déjà fait à l'étape 1. Ce dont j'ai vraiment besoin, c'est de m'assurer que la demande est routée correctement.

Des questions

Comment puis-je faire cela? Existe-t-il une méthode WP connue (c'est-à-dire des fonctionnalités/options existantes dans la configuration de type personnalisée initiale)?

D'autres pensées

Je suis également conscient que des taxonomies personnalisées peuvent être utilisées (au moins en partie) pour résoudre le problème de la catégorisation des publications - et qu’il existe un ou plusieurs plug-ins pour vous aider. Cependant, j'aimerais dans un premier temps rester avec des types de publication personnalisés, si possible.

Merci.


Mise à jour 1

Je connais maintenant un plugin appelé "Posts 2 Posts" qui permet, entre autres, d'établir des liens entre les types de publication personnalisés, en particulier entre différents types de publication personnalisés. Cependant, pour mon exemple, j'utilise un seul type de publication personnalisé et j'essaie d'avoir une hiérarchie naturelle parent-enfant (ce qui semble être une chose relativement standard WP) plutôt que d'imposer une relation entre des types de publication personnalisés disparates. .


Mise à jour 2

Quelques informations supplémentaires et une solution de toutes sortes. Voici deux choses importantes:

  1. L'ajout de structures permalien personnalisées à des types de publication personnalisés peut être - astucieux .
  2. L'ajout de structures permalink personnalisées à des types de publication personnalisés peut être inutile .

J'ai réalisé que je combattais l'excellente fonctionnalité permanente de Wordpress en créant une structure [inutile] personnalisée (par exemple, example.com/recipes/513/lunch/sandwich/) qui, rétrospectivement, est complexe. Mon raisonnement était que l'ID de publication devrait être présent dans l'URL pour des raisons de performances (par opposition aux slugs, qui pourraient être plus lents pour que WP corresponde). J'ai imaginé que cela pourrait être possible, mais que cela ne vaut peut-être pas la peine. Au lieu de cela, j'ai déchiré mes données permanentes personnalisées et laissé simplement WP résoudre, par exemple, example.com/recipes/lunch/sandwich/ - qui fonctionne maintenant exactement comme prévu. N'oubliez pas de définir 'hierarchical' => true, et le monde est votre lien permanent.

Conclusion

Si vous insistez pour faire ce que j’essayais de faire, c’est peut-être possible, mais vous devrez configurer correctement une structure de permalien personnalisée pour éviter les erreurs 404 (mon problème initial). Pour le moment, je vais m'en tenir à la fonctionnalité standard WP hiérarchique permalien.

4
41st

En réponse à ma propre question:

Il s'avère que la structure de permalien Wordpress fonctionne parfaitement pour les types personnalisés, par exemple. example.com/recipes/lunch/sandwich/. Cela fonctionne exactement comme prévu si vous définissez 'hierarchical' => true.

Ce que j’essayais à l’origine était inutilement difficile à exécuter et nécessite de configurer correctement une structure permalien personnalisée pour éviter les erreurs 404. Je vous conseille de vous en tenir à la fonctionnalité standard permalien hiérarchique de Wordpress.

0
41st