Je viens de mettre en place une relation post / parent entre un type de post "épisodes" et un type de post "cartoon-series".
J'ai utilisé ce morceau de code pour ajouter dans la boîte de méta pour attribuer le parent d'un autre type de message:
add_action('admin_menu', function() {
remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});
function episodes_attributes_meta_box($post) {
$post_type_object = get_post_type_object($post->post_type);
if ( $post_type_object->hierarchical ) {
$pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
if ( ! empty($pages) ) {
echo $pages;
} // end empty pages check
} // end hierarchical check.
}
Cela a fonctionné sur l'écran d'administration en me permettant de définir la série en tant que parent de l'épisode, mais lorsque j'essaie de consulter le message, j'obtiens un 404. La structure d'URL est la suivante:
domain/episodes/series-name/episode-name
L'URL de la série est:
domain/cartoon-series/series-name
J'aimerais que l'URL de l'épisode soit:
domain/cartoon-series/series-name/episode-name
Qu'est-ce que je rate? Est-il possible de faire d'un type de message entier l'enfant d'un autre type de message? Donc, je pourrais même obtenir l'URL de la liste des épisodes:
domain/cartoon-series/series-name/episodes
Merci! Mat
Comme demandé, voici le code pour les deux types de messages personnalisés en question:
$labels = array(
"name" => "Cartoon Series",
"singular_name" => "Cartoon Series",
"menu_name" => "Cartoon Series",
"all_items" => "All Cartoon Series",
"add_new" => "Add New",
"add_new_item" => "Add New Cartoon Series",
"edit" => "Edit",
"edit_item" => "Edit Cartoon Series",
"new_item" => "New Cartoon Series",
"view" => "View",
"view_item" => "View Cartoon Series",
"search_items" => "Search Cartoon Series",
"not_found" => "No Cartoon Series Found",
"not_found_in_trash" => "No Cartoon Series Found in Trash",
"parent" => "Parent Cartoon Series",
);
$args = array(
"labels" => $labels,
"description" => "",
"public" => true,
"show_ui" => true,
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => true,
"rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
"query_var" => true,
"supports" => array( "title", "revisions", "thumbnail" ), );
register_post_type( "cartoon-series", $args );
$labels = array(
"name" => "Episodes",
"singular_name" => "Episode",
);
$args = array(
"labels" => $labels,
"description" => "",
"public" => true,
"show_ui" => true,
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => true,
"rewrite" => array( "slug" => "episodes", "with_front" => true ),
"query_var" => true,
"supports" => array( "title", "revisions", "thumbnail" ), );
register_post_type( "episodes", $args );
J'utilise le plugin CPT UI, donc je ne peux pas modifier ce code directement. C'est juste le code d'exportation fourni par l'interface utilisateur CPT.
Je n'ai pas d'autre code qui relie les deux CPT. C'est peut-être ce qui me manque. Je viens de trouver ce code en ligne qui place la métabox sur la page pour faire le lien. N'est-ce pas suffisant pour faire le travail? On dirait que cela définit le post_parent.
Merci! Mat
pre_get_posts
me connecter pour modifier la requête sans succès, quelque chose de plus compliqué est impliqué que je n'ai pas pu comprendre. Comme avoir un chat comme parent d'un chien. Je suggère d'utiliser un seul type de publication hiérarchique ou de définir la propriété en utilisant des méta-champs .
parent_id
requête var et elle n'a pas besoin de plus de code pour définir la relation. Le problème est que l'URL générée n'est pas reconnue par WordPress. J'ai essayé de trouver une règle de réécriture qui le fasse fonctionner mais je n'ai pas réussi. J'examine maintenant une solution.