Я перебрал каждый вопрос здесь о пользовательских постоянных типах записей, но в большинстве случаев это либо проблемы с пользовательскими изменениями таксономии, либо очевидное отсутствие flush_rewrite_rules (). Но в моем случае я использую только пользовательский тип записи (без таксономии), установленный как иерархический (чтобы я мог назначать отношения родитель-потомок), с надлежащей «поддержкой» для атрибута metabox и т. Д. И т. Д. Переписал правила тысячами разных способов. Я пробовал разные постоянные структуры. Но дочерние URL всегда приводят к 404!
Первоначально у меня были независимые пользовательские типы записей для «родительских» и «дочерних» элементов (с использованием p2p), и у меня, вероятно, не было бы проблем с использованием таксономии для «родительской» группировки - я знаю, что они были бы семантически более точными. Но для клиента им проще всего представить иерархию, когда «сообщения» отображаются в админке так же, как страницы: простое дерево, в котором дочерние элементы отображаются под родительским элементом с префиксом «-» и в правильный порядок. Также могут быть использованы различные методы для назначения порядка с помощью drag-n-drop. Группировка через таксономию (или p2p) приводит к простому списку «постов» в списках администратора, что просто не так визуально очевидно.
Так что я в буквальном смысле точно такое же поведение, как основные "страницы", но с моим пользовательским типом поста. Я зарегистрировал тип поста так, как ожидалось, и в админке он работает отлично - я могу назначить родителя и menu_order для каждого «поста» новостной рассылки, они правильно отображаются в списках редактирования:
Spring 2012
— First Article
— Second Article
И их постоянные ссылки выглядят правильно. Фактически, если я изменяю что-либо в структуре или даже изменяю слизь перезаписи при регистрации типа записи, они автоматически обновляются правильно, поэтому я знаю, что что-то работает:
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 */
У меня также есть стандартные базовые «страницы» с созданными иерархическими отношениями, и они выглядят одинаково в админке, но на самом деле они работают и во внешнем интерфейсе (родительские и дочерние URL-адреса работают нормально).
Моя структура постоянных ссылок настроена на:
http://mysite.com/%postname%/
Я также пытался это сделать (просто потому, что многие другие ответы указывали на то, что это необходимо, хотя в моем случае это не имело смысла):
http://mysite.com/%category%/%postname%/
Мой регистр CPT аргументы включают в себя:
$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 ),
Единственное видимое различие между моими настраиваемыми дочерними типами записей и обычными дочерними страницами состоит в том, что мой CPT имеет слаг в начале структуры постоянной ссылки, за которым следуют слагаемые родительский / дочерний (где страницы только начинаются с слагаемых родительский / дочерний, нет "префикса"). Почему это все испортило, я не знаю. Множество статей, кажется, указывают, что именно так должны вести себя такие иерархические постоянные ссылки CPT - но мои, хотя и хорошо сформированные, не работают.
Что также сбивает с толку, так это когда я проверяю query_vars для этой страницы 404 - они, кажется, содержат правильные значения для WP, чтобы «найти» мои дочерние страницы, но что-то не работает.
$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
[...]
Я пробовал это с различными темами, включая двадцать двенадцать, просто чтобы убедиться, что это не какой-то пропущенный шаблон с моей стороны.
Используя Инспектор правил перезаписи, вот что отображается для 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:
как это отображается на другой странице инспектора:
RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter
Этот результат перезаписи заставит меня поверить, что будет работать следующая «не красивая» постоянная ссылка:
http://mysite.com/?newsletter=spring-2012&page=first-article
Это не 404, но он показывает родительский пункт CPT "информационный бюллетень", а не дочерний элемент. Запрос выглядит так:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)
post_name
колонке.