Próbuję skonfigurować wielopoziomową niestandardową strukturę typu postu z permalinkami, które wyglądają tak authors/books/chapters
, że autorzy, książki i rozdziały są skonfigurowane jako własne niestandardowe typy postów. Na przykład może wyglądać typowy adres URL tej witrynyexample.com/authors/stephen-king/the-shining/chapter-3/
Każdy rozdział może należeć tylko do jednej książki, a każda książka może należeć tylko do jednego autora. Rozważyłem zastosowanie taksonomii zamiast CPT dla autorów i książek, ale muszę powiązać metadane z każdym elementem i wolę do tego interfejs postu.
Jestem w większości przypadków, po prostu konfigurując każdy niestandardowy post jako dziecko wpisu w CPT o jeden poziom wyżej. Na przykład tworzę „Rozdział 3” i przypisuję „Lśnienie” jako element nadrzędny za pomocą niestandardowego meta-boxa. Z kolei „Lśnienie” ma „Stephena Kinga” jako rodzica. Nie miałem żadnych problemów z tworzeniem tych relacji.
Używam tagów przepisywania w ślimakach CPT i permalinki chcą działać, ale nie są w porządku. Za pomocą analizatora ponownego zapisu widzę, że reguły przepisywania są w rzeczywistości generowane, ale wydaje się, że nie są w odpowiedniej kolejności, dlatego najpierw przetwarzane są inne reguły.
Oto jak zarejestrowałem moje 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' );
Czy jest więc jakiś sposób, aby zmienić priorytet moich reguł przepisywania, aby autorzy, książki i rozdziały były dopasowane najpierw?
Wiem też, że będę musiał dodać post_type_link
filtr, ale wydaje się to drugorzędne w stosunku do uzyskania permalinków w pierwszej kolejności. Jeśli ktoś wie, gdzie mogę znaleźć kompleksowy przegląd działania tego filtra, byłoby to mile widziane.
Odpowiedzi:
Jeśli chcesz zachować „autorów” jako podstawowy ślimak w permalinkach, np. Przyklad.com/authors/stephen-king/ dla CPT „autorów”, przyklad.com/authors/stephen-king/the-shining/ dla „książki” CPT i example.com/authors/stephen-king/the-shining/chapter-3/ do „rozdziałów” CPT, WordPress pomyśli, że prawie wszystko jest postem „autorów” lub hierarchicznym dzieckiem „autorów” „post, a ponieważ tak nie jest, WordPress ostatecznie staje się bardzo zdezorientowany.
To powiedziawszy, istnieje obejście, które jest dość podstawowe, ale o ile twoja permalinkowa struktura zawsze ma tę samą kolejność, tzn. Po słowie „autorzy” zawsze jest autor ślimak, po którym zawsze następuje ślimak książki, po którym zawsze następuje ślimakiem z rozdziału, powinieneś już iść.
W tym rozwiązaniu nie ma potrzeby definiowania korekty przepisywania w niestandardowej definicji typu postu dla „rozdziałów” i „książek”, ale ustaw korekty przepisywania „Autorzy” jako po prostu „autorów”, umieść następujący kod w swoich funkcjach. Php plik i „opróżnij” swoje reguły przepisywania.
Dowiedz się więcej o wtyczce CPT-onomies
źródło
Nie mam osobistego doświadczenia z takim scenariuszem, ale Randy Hoyt przeprowadził prezentację na WordCamp San Fran w ostatni weekend na temat „Podrzędnych typów postów”, co brzmi jak to, o czym mówisz.
Oto jego strona z przemówieniem, która zawiera slajdy prezentacji i linki do wtyczki, którą zbudował do pracy z podrzędnymi typami postów: http://randyhoyt.com/wordpress/subordinate-post-types/
źródło
Reguły zostaną dodane do extra_rules_top WP_Rewrite w kolejności dodawania dodatkowych permastruktów. Tak więc zmiana kolejności rejestrowania typów postów spowoduje zmianę kolejności generowania reguł przepisywania, dzięki czemu przepisywanie rozdziału zostanie najpierw dopasowane. Ponieważ jednak używasz query_var z innych typów postów, wp_query może skończyć dopasowaniem jednego z nich jako nazwy zapytania, zanim dopasujesz rozdział tak, jak chcesz.
Utworzyłbym nowe znaczniki przepisywania, które będą reprezentować symbole zastępcze dla autora-rodzica i książki-rodzica, tj .:
Aby to zrobić, musisz przefiltrować „query_vars”, aby „parent_book” stał się publiczny. Następnie musisz dodać filtr do post_get_posts, który przekształci zestaw nazw jako parent_book query_var w post_id i ustawi go jako „post_parent”.
źródło