J'essaie de mettre en place une structure de type de publication personnalisée à plusieurs niveaux avec des permaliens qui ressemblent authors/books/chapters
, avec des auteurs, des livres et des chapitres tous configurés comme leur propre type de publication personnalisé. Par exemple, une URL typique sur ce site pourrait ressembler àexample.com/authors/stephen-king/the-shining/chapter-3/
Chaque chapitre ne peut appartenir qu'à un seul livre, et chaque livre ne peut appartenir qu'à un seul auteur. J'ai envisagé d'utiliser des taxonomies au lieu des CPT pour les auteurs et les livres, mais je dois associer des métadonnées à chaque élément et je préfère l'interface de publication pour cela.
Je suis la plupart du chemin là-bas en configurant simplement chaque poste personnalisé en tant qu'enfant d'une entrée dans le CPT d'un niveau supérieur. Par exemple, je crée "Chapitre 3" et attribue "The Shining" comme parent à l'aide d'une méta-boîte personnalisée. "The Shining" a à son tour "Stephen King" comme parent. Je n'ai eu aucun mal à créer ces relations.
J'utilise des balises de réécriture dans les slugs CPT et les permaliens veulent fonctionner, mais ils ne sont pas tout à fait raison. En utilisant un analyseur de réécriture, je peux voir que les règles de réécriture sont réellement générées, mais elles ne semblent pas être dans le bon ordre et donc d'autres règles sont traitées en premier.
Voici comment j'ai enregistré mes CPT:
function cpt_init() {
$labels = array(
'name' => 'Authors'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('authors',$args);
$labels = array(
'name' => 'Books'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('books',$args);
$labels = array(
'name' => 'Chapters'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%/%books%',
'with_front' => FALSE,
),
'with_front' => FALSE,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('chapters',$args);
}
add_action( 'init', 'cpt_init' );
Existe-t-il un moyen de modifier la priorité de mes règles de réécriture afin que les auteurs, les livres et les chapitres soient tous mis en correspondance en premier?
Je sais également que je vais devoir ajouter un post_type_link
filtre, mais cela semble secondaire pour obtenir les permaliens correctement en premier lieu. Si quelqu'un sait où je peux trouver un aperçu complet du fonctionnement de ce filtre, ce serait apprécié.
Réponses:
Si vous souhaitez conserver les «auteurs» comme slug de base dans les permaliens, par exemple example.com/authors/stephen-king/ pour le CPT «auteurs», example.com/authors/stephen-king/the-shining/ pour le `` livres '' CPT et example.com/authors/stephen-king/the-shining/chapter-3/ pour les `` chapitres '' CPT, WordPress pensera que tout est à peu près tout un `` auteur '' ou un enfant hiérarchique d'un `` auteur '' 'et, comme ce n'est pas le cas, WordPress devient finalement très confus.
Cela dit, il existe une solution de contournement qui est assez basique, mais tant que votre structure de permalien suit toujours le même ordre, c'est-à-dire que le mot «auteurs» est toujours suivi par un slug d'auteur, qui est toujours suivi par un slug de livre qui est toujours suivi par une limace de chapitre, alors vous devriez être prêt à partir.
Dans cette solution, il n'est pas nécessaire de définir le slug de réécriture dans la définition de type de message personnalisé pour les `` chapitres '' et les `` livres '', mais définissez le slug de réécriture des `` auteurs '' simplement comme `` auteurs '', placez le code suivant dans vos fonctions.php fichier et "vider" vos règles de réécriture.
En savoir plus sur le plugin CPT-onomies
la source
Je n'ai pas d'expérience personnelle avec un tel scénario, mais Randy Hoyt a fait une présentation au WordCamp San Fran le week-end dernier sur les "types de messages subordonnés" qui ressemble à ce dont vous parlez.
Voici sa page pour la conférence qui comprend ses diapositives de présentation et des liens vers un plugin qu'il a créé pour travailler avec des types de publication subordonnés: http://randyhoyt.com/wordpress/subordinate-post-types/
la source
Les règles seront ajoutées à extra_rules_top de WP_Rewrite dans l'ordre d'ajout des permastructs supplémentaires. Ainsi, la modification de l'ordre dans lequel vous enregistrez les types de publication modifiera l'ordre des règles de réécriture générées, ce qui fera en sorte que la réécriture du chapitre correspondra en premier. Cependant, puisque vous utilisez le query_var des autres post_types, le wp_query peut finir par correspondre à l'un de ceux-ci comme nom de post interrogé avant de correspondre au chapitre comme vous le souhaitez.
Je créerais de nouvelles balises de réécriture pour représenter les espaces réservés pour l'auteur parent et le livre parent, c'est-à-dire:
En faisant cela, vous devrez filtrer 'query_vars' pour rendre public 'parent_book'. Ensuite, vous devrez ajouter un filtre à pre_get_posts qui convertira le nom défini en tant que parent_book query_var en post_id et le définira en tant que «post_parent».
la source