Przekopałem się przez każde pytanie tutaj dotyczące permalinków niestandardowych typów postów, ale większość wydaje się być albo problemami z niestandardowymi przeróbkami taksonomii, albo oczywistym brakiem flush_rewrite_rules (). Ale w moim przypadku używam tylko niestandardowego typu postu (bez taksonomii), ustawionego na hierarchiczny (dzięki czemu mogę przypisywać relacje rodzic-dziecko), z odpowiednią „obsługą” atrybutów metabox itp. Itp. przepłukano przepisywanie przepisów na tysiąc różnych sposobów. Próbowałem różnych struktur permalink. Ale podrzędne adresy URL zawsze dają wynik 404!
Początkowo miałem niezależne niestandardowe typy postów dla elementów „nadrzędnych” i „podrzędnych” (przy użyciu p2p) i prawdopodobnie nie miałbym problemów z zastosowaniem taksonomii dla grupowania „rodzicielskiego” - wiem, że byłyby one semantycznie bardziej dokładne. Ale dla klienta najłatwiej jest im wizualizować hierarchię, gdy „posty” są wyświetlane w adminie tak jak strony: proste drzewo, w którym dzieci pojawiają się pod rodzicem, poprzedzone znakiem „-”, oraz w właściwe zamówienie. Można również zastosować różne metody przypisywania kolejności za pomocą przeciągania i upuszczania. Grupowanie według taksonomii (lub p2p) daje płaską listę „postów” na listach administratora, co po prostu nie jest tak wizualnie oczywiste.
Więc szukam dosłownie takiego samego zachowania jak podstawowe „strony”, ale z moim niestandardowym typem postu. Zarejestrowałem typ postu zgodnie z oczekiwaniami, a u administratora działa idealnie - mogę przypisać nadrzędnego i menu_order do każdego „postu” w biuletynie, pojawiają się one poprawnie na listach edycji:
Spring 2012
— First Article
— Second Article
A ich permalinki wydają się być poprawnie skonstruowane. W rzeczywistości, jeśli zmienię coś w strukturze, lub nawet zmienię podrożnik podczas rejestracji typu postu, automatycznie aktualizują się poprawnie, więc wiem, że coś działa:
http://mysite.com/parent-page/child-page/ /* works for pages! */
http://mysite.com/post-type/parent-post/child-post/ /* should work? */
http://mysite.com/newsletter/spring-2012/ /* works! */
http://mysite.com/newsletter/spring-2012/first-article/ /* 404 */
http://mysite.com/newsletter/spring-2012/second-article/ /* 404 */
Mam również standardowe podstawowe strony z utworzonymi relacjami hierarchicznymi, które wyglądają tak samo w adminie, ale w rzeczywistości działają również na interfejsie (zarówno adresy URL nadrzędny, jak i podrzędny działają dobrze).
Moja struktura bezpośredniego łącza jest ustawiona na:
http://mysite.com/%postname%/
Próbowałem również tego (tylko dlatego, że tak wiele innych odpowiedzi wskazywało na to, że jest potrzebna, chociaż w moim przypadku nie miało to sensu):
http://mysite.com/%category%/%postname%/
Moje rejestrowe argumenty CPT obejmują:
$args = array(
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'has_archive' => 'newsletter',
'hierarchical' => true,
'query_var' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
'rewrite' => array( 'slug' => 'newsletter', 'with_front' => false ),
Jedyną widoczną różnicą między moimi niestandardowymi elementami potomnymi typu posta a normalnymi stronami potomnymi strony jest to, że mój CPT ma ślimak na początku struktury permalink, a następnie ślimak nadrzędny / podrzędny (gdzie strony zaczynają się od ślimaka nadrzędnego / podrzędnego, bez „prefiksu”). Dlaczego to miałoby zepsuć, nie wiem. Wiele artykułów wydaje się wskazywać, że właśnie tak powinny zachowywać się takie hierarchiczne permalinki CPT - ale moje, choć ładnie uformowane, nie działają.
Co mnie też zaskakuje, kiedy sprawdzam zmienne query_vars dla tej strony 404 - wydają się zawierać prawidłowe wartości WP, aby „znaleźć” moje strony podrzędne, ale coś nie działa.
$wp_query object WP_Query {46}
public query_vars -> array (58)
'page' => integer 0
'newsletter' => string(25) "spring-2012/first-article"
'post_type' => string(10) "newsletter"
'name' => string(13) "first-article"
'error' => string(0) ""
'm' => integer 0
'p' => integer 0
'post_parent' => string(0) ""
'subpost' => string(0) ""
'subpost_id' => string(0) ""
'attachment' => string(0) ""
'attachment_id' => integer 0
'static' => string(0) ""
'pagename' => string(13) "first-article"
'page_id' => integer 0
[...]
Próbowałem tego z różnymi motywami, w tym dwadzieścia jeden, aby mieć pewność, że nie brakuje mi szablonu.
Korzystając z Insprite Rules Inspector, pojawia się to dla adresu URL: http://mysite.com/newsletter/spring-2012/first-article/
newsletter/(.+?)(/[0-9]+)?/?$
newsletter: spring-2012/first-article
page:
(.?.+?)(/[0-9]+)?/?$
pagename: newsletter/spring-2012/first-article
page:
jak jest wyświetlany na innej stronie inspektora:
RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter
To wyjście przerobiłoby mnie do przekonania, że zadziała następujący link „nie ładny”:
http://mysite.com/?newsletter=spring-2012&page=first-article
Nie 404, ale pokazuje „biuletyn” nadrzędnego elementu CPT, a nie dziecko. Żądanie wygląda następująco:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)
post_name
kolumnie.