Я пытаюсь настроить многоуровневую структуру пользовательских типов записей с постоянными ссылками, которые выглядят как authors/books/chapters
авторы, книги и главы, настроенные как их собственные пользовательские типы записей. Например, типичный URL на этом сайте может выглядетьexample.com/authors/stephen-king/the-shining/chapter-3/
Каждая глава может принадлежать только одной книге, и каждая книга может принадлежать только одному автору. Я рассмотрел использование таксономий вместо CPT для авторов и книг, но мне нужно связать метаданные с каждым элементом, и я предпочитаю для этого пост-интерфейс.
Я в большинстве случаев просто настраиваю каждый пользовательский пост как дочерний элемент в CPT на один уровень выше. Например, я создаю «Главу 3» и назначаю «Сияющий» в качестве родителя, используя собственный мета-блок. «Сияющий», в свою очередь, имеет «Стивена Кинга» в качестве родителя. У меня не было проблем с созданием этих отношений.
Я использую теги перезаписи в слагах CPT, и постоянные ссылки хотят работать, но они не совсем правы. Используя анализатор перезаписи, я вижу, что правила перезаписи фактически генерируются, но, похоже, они не в правильном порядке, поэтому сначала обрабатываются другие правила.
Вот как я зарегистрировал свои 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' );
Так есть ли способ изменить приоритет моих правил переписывания, чтобы сначала сопоставлялись все авторы, книги и главы?
Я также знаю, что мне придется добавить post_type_link
фильтр, но это кажется второстепенным для получения правильных постоянных ссылок. Если кто-нибудь знает, где я могу найти исчерпывающий обзор того, как работает этот фильтр, это будет оценено.