Właśnie skonfigurowałem relację między postem a rodzicem między „epizodami” typu posta a „serialem animowanym”.
Użyłem tego fragmentu kodu, aby dodać w polu meta, aby przypisać element nadrzędny z innego typu postu:
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.
}
To działało na ekranie administratora, pozwalając mi ustawić serial jako rodzic odcinka, ale kiedy próbuję wyświetlić post, dostaję 404. Struktura adresu URL to:
domain/episodes/series-name/episode-name
Adres URL tej serii to:
domain/cartoon-series/series-name
Chciałbym, aby URL odcinka był:
domain/cartoon-series/series-name/episode-name
czego mi brakuje? Czy można uczynić cały typ postu potomkiem innego typu postu? Więc mógłbym nawet uzyskać adres URL listy odcinków:
domain/cartoon-series/series-name/episodes
Dzięki! Matt
Zgodnie z życzeniem, oto kod dwóch omawianych typów niestandardowych postów:
$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 );
Korzystam z wtyczki CPT UI, więc nie mogę bezpośrednio edytować tego kodu. To tylko kod eksportu, który zapewnia interfejs CPT.
Nie mam żadnego innego kodu, który łączy dwa CPT. Może tego mi brakuje. Właśnie znalazłem ten kod online, który umieszcza metaboks na stronie, aby wykonać link. Czy to nie wystarczy do wykonania pracy? Wygląda na to, że ustawia post_parent.
Dzięki! Matt
pre_get_posts
do zmiany zapytania bez powodzenia, w grę wchodzi coś bardziej skomplikowanego, czego nie byłem w stanie zrozumieć. To tak, jakby kot był rodzicem psa. Sugeruję, aby użyć tylko jednego hierarchicznego typu postu lub ustawić prawdziwość za pomocą pól meta .
parent_id
zapytania var i nie potrzebuje więcej kodu, aby ustawić relację. Problem polega na tym, że wygenerowany adres URL nie jest rozpoznawany przez WordPress. Próbowałem znaleźć regułę przepisywania, która sprawi, że zadziała, ale nie odniosłem sukcesu. Teraz szukam rozwiązania.