Я пытаюсь настроить многоуровневую структуру пользовательских типов записей с постоянными ссылками, которые выглядят как 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
фильтр, но это кажется второстепенным для получения правильных постоянных ссылок. Если кто-нибудь знает, где я могу найти исчерпывающий обзор того, как работает этот фильтр, это будет оценено.
Ответы:
Если вы хотите оставить «авторов» в качестве основного слагаемого в постоянных ссылках, например, example.com/authors/stephen-king/ для CPT «авторов», example.com/authors/stephen-king/the-shining/ для CPT «books» и example.com/authors/stephen-king/the-shining/chapter-3/ для CPT «chapters», WordPress будет думать, что почти все - это пост «авторов» или иерархический потомок «авторов» ', и, поскольку это не так, WordPress в конечном итоге становится очень запутанным.
С учетом вышесказанного, есть обходной путь, который является довольно базовым, но при условии, что ваша структура постоянных ссылок всегда следует одному и тому же порядку, то есть за словом «авторы» всегда следует слаг автора, за которым всегда следует слаг книги, за которым всегда следует если у вас есть глава, то вам нужно идти.
В этом решении нет необходимости определять слизень перезаписи в пользовательском определении типа записи для «глав» и «книг», но установите слаг «перезапись авторов» просто как «авторы», поместите следующий код в ваши functions.php файл и "очистить" ваши правила перезаписи.
Узнайте больше о плагине CPT-onomies
источник
У меня нет личного опыта с таким сценарием, но Рэнди Хойт на прошлых выходных сделал презентацию на WordCamp San Fran о «типах подчиненных постов», которая звучит так, как вы говорите.
Вот его страница для выступления, которая включает слайды презентации и ссылки на плагин, который он создал для работы с подчиненными типами записей : http://randyhoyt.com/wordpress/subordinate-post-types/
источник
Правила будут добавлены к extra_rules_top в WP_Rewrite в порядке добавления дополнительных пермаструктур. Таким образом, переключение порядка, в котором вы регистрируете типы записей, изменит порядок генерации правил перезаписи, в результате чего сначала переписывается глава. Однако, так как вы используете query_var из других post_types, wp_query может в конечном итоге соответствовать одному из них в качестве имени запрашиваемого поста, прежде чем соответствовать главе, как вы хотите.
Я хотел бы создать новые теги перезаписи, чтобы представить заполнители для родительского автора и родительской книги, то есть:
При этом вам нужно будет отфильтровать 'query_vars', чтобы сделать 'parent_book' общедоступным. Затем вам нужно добавить фильтр в pre_get_posts, который преобразует имя, установленное в качестве parent_book query_var, в post_id и устанавливает его как «post_parent».
источник