Intereting Posts
get_comments_number () возвращает 0 передать строку запроса на url для фильтрации медиа Как разрешить редактирование текста на боковой панели? Почему функция вставки / редактирования ссылок по умолчанию в режиме Visual в сообщениях или страницах создает полные URL-адреса? если это специальный пользовательский пост в cpt Можно ли использовать один пул для множественных таксономий? nav_menu: как заставить подстраницу включить родительское меню wysiwyg скремблирован HowTo: разработка шаблона WP с динамическим фоновым изображением Как я могу использовать пользовательское имя AccessFileName? перевести кнопку «загрузить больше» Сделать окно браузера мигающим или изменить веб-сайт favicon в панели задач Получить подкатегории из определенной категории Как разрешить пользователям проголосовать на этом простом счетчике голосования (который использует мета-сообщение)? Cant удалить строку, которая появляется над содержимым страницы

Получение иерархических настраиваемых постоянных констант для работы так же, как страницы

Я прокопал каждый вопрос здесь, на постоянных позициях по умолчанию, но большинство из них, похоже, либо проблемы с пользовательской перезаписью таксономии, либо очевидное отсутствие flush_rewrite_rules (). Но в моем случае я использую только пользовательский тип сообщения (без таксономии), установленный как иерархический (поэтому я могу назначить отношения между родителями и дочерними элементами), с надлежащей «поддержкой» атрибутов metabox и т. Д. И т. Д. I «Я покраснел, переписывая правила тысячи способов. Я пробовал разные структуры ссылок. Но дочерние URL-адреса всегда приводят к 404!

Первоначально у меня были независимые пользовательские типы сообщений для «родительских» и «дочерних» элементов (с использованием p2p), и у меня, вероятно, не было бы проблем с использованием таксономии для «родительской» группировки – я знаю, что они были бы семантически более точными. Но для клиента проще всего визуализировать иерархию, когда «сообщения» отображаются в админах точно так же, как и на страницах: простое дерево, где дети отображаются под родительским, с префиксом «-», а в правильный порядок. Кроме того, могут использоваться различные методы назначения порядка с помощью drag-n-drop. Группировка по таксономии (или p2p) приводит к плоскому списку «сообщений» в списках admin, что просто не так очевидно.

Итак, что мне нужно, буквально то же поведение, что и основные «страницы», но с моим пользовательским типом сообщения. Я зарегистрировал тип сообщения так, как ожидалось, и в админке он отлично работает – я могу назначить родителя и 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 имеет slug в начале структуры permalink, а затем родительские / дочерние пули (где страницы только начинаются с родительских / дочерних пулов, нет «префикса»). Почему это будет плохо, я не знаю. Множество статей, по-видимому, указывает на то, что именно так должны вести себя такие иерархические СРТ-константы, но мои, хотя и хорошо сформированные, не работают.

Что меня беспокоит, так это когда я просматриваю 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 [...] 

Я пробовал это с различными темами, включая двадцать четвертый, просто чтобы убедиться, что это не какой-то недостающий шаблон с моей стороны.

Используя Rewrite Rules Inspector, это то, что отображается для 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 ) 

Solutions Collecting From Web of "Получение иерархических настраиваемых постоянных констант для работы так же, как страницы"

Это первый раз, когда я участвую здесь в Stack Exchange, но я дам это и посмотрю, смогу ли я помочь вам в правильном направлении.

По умолчанию иерархические CPT ведут себя точно так, как вы описали. Уникальный префикс slug, «информационный бюллетень» в этом случае, должен позволить механизму перезаписи знать, как сообщать запросы для разных типов сообщений.

Эти заявки на регистрацию CPT выглядят хорошо, но когда запрашивается CPT, запрос var pagename не должен иметь значения, а запрос name var должен быть таким же, как и в newsletter , поэтому, похоже, что где-то в вашей настройке существует конфликт.

Чтобы помочь отлаживать, устанавливать и активировать плагин Inspector Rules Rewrite Rules , перейдите на экран в « Инструменты -> Правила перезаписи ».

  1. При просмотре списка все ваши правила для электронного бюллетеня CPT должны быть перечислены перед любыми правилами перезаписи страницы. Проверьте это, сканируя столбец « Источник ».
  2. Если это проверит, введите URL-адрес для CPT «первой статьи» в поле « URL-адрес сопоставления» и нажмите кнопку «Фильтр», чтобы увидеть, какое соответствие согласовано. Он должен соответствовать правилу рассылки и правилу страницы, но правило рассылки должно быть первым.

Если это не выявило каких-либо проблем, post_name поиск столбца post_name в wp_posts чтобы найти другие сообщения с wp_posts «первая статья», чтобы узнать, может ли быть столкновение. Ищите «информационный бюллетень», чтобы быть уверенным.

Добавьте следующий фрагмент, чтобы проверить ваши запросы в начале запроса на проверку и посмотреть, какие из них заданы в соответствии с правилом переписывания (посетите дочерний CPT на лицевой стороне). Если pagename var не отображается здесь, то он устанавливается кем-то позже в запросе:

 add_filter( 'request', 'se77513_display_query_vars', 1 ); function se77513_display_query_vars( $query_vars ) { echo '<pre>' . print_r( $query_vars, true ) . '</pre>'; return $query_vars; } 

Любые плагины / функции, которые изменяют ваши запросы, могут вызвать конфликт, поэтому отключите их, если вы все еще видите проблемы. Также очистите правила перезаписи после каждого шага, особенно если запрос совпал с неправильным правилом на втором шаге выше (держите экран «Permalinks» открытым на отдельной вкладке и просто обновляйте его).

Постоянная ссылка parent/Child Работает из коробки, пока вы устанавливаете

 'hierarchical'=> true, 'supports' => array('page-attributes' .... 

Обновить:

Я просто проверил его снова, и он работает, как ожидалось, с помощью этого тестового примера:

 add_action('init','test_post_type_wpa77513'); function test_post_type_wpa77513(){ $args = array( 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => true, 'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ) ); register_post_type( 'newsletter', $args ); } 

и постоянная ссылка установлена ​​на /%postname%/ Я получаю информационный бюллетень / родитель / ребенок, работающий просто отлично.

Помимо запроса »Вы пытались отключить его и снова?» , Я также должен спросить «У вас есть активные плагины, и ваша тема делает что-либо на постоянные ссылки (например, например, для регистрации таксономии, типа сообщений, добавления правил перезаписи , и т.д.)?

Если да: это все еще происходит, после того как вы отключили все плагины и переключились на TwentyEleven? введите описание изображения здесь

Чтобы отлаживать дальше, отправляйтесь в GitHub и захватите плагин Toschos «Rewrite» . Затем переключитесь на официальный плагин репо на wp.org и запустите плагин MonkeyManRewriteAnalyzer . Я даже написал небольшое расширение, чтобы склеить его немного вместе. Это даст вам подробную информацию о вашей настройке.

Поэтому, подтвердив, что я могу получить ожидаемое поведение иерархической страницы с полностью чистой установкой и только одной декларацией CPT, я знал, что ошибка лежит где-то в моем собственном плагине, который я использую для обработки создания CPT (очень сложный, обрабатывает пользовательские обмены, таксономии , и т.д). Проблема заключалась в том, что, несмотря на все советы по проверке проблем с переписыванием или запросами, я не мог видеть ничего явно неправильного. Я проверил каждый фильтр и зацепил его, просмотрев запрос в каждой точке и не увидев ничего, что могло бы вызвать 404.

Поэтому мне осталась задача вручную отключить / включить каждый из 9 больших классов, а затем найти по крайней мере 2 из них, чтобы вызвать 404, каждый через каждую функцию, отключая / разрешая их, а затем линию трассировки по линии внутри этих функций – попытка грубой силы точно увидеть, что вызвало 404, даже если я не знал почему.

Вот когда я обнаружил, что есть следствие использования $query->get_queried_object() . Казалось бы, использование этой функции-обертки фактически изменяет сам запрос $ query, который, как я думал, я возвращаюсь без изменений в конце моей функции. Были задействованы три фильтра по 2 классам, которые изменили запрос: parse_query , posts_orderby , posts_join – и все функции обратного вызова $query->get_queried_object() в переданном аргументе $query чтобы затем выполнить некоторые условные тесты и иногда изменять запрос vars (например, для особых случаев порядка сортировки). Как ни странно, эти функции действительно отлично работали над тем, что они планировали делать, несмотря на мое использование функции. Я никогда не замечал ничего плохого в возвращенном $ query раньше!

Так или иначе, после более чем года разработки и использования на десятках живых производственных площадок, я никогда не испытывал никаких негативных последствий от этой ошибки. Только когда я рисковал в иерархические CPT, эта маленькая разница внезапно нарушала вещи. Это часть того, что меня так сильно сбило с толку – насколько я мог бы сказать, мои фильтры запросов заслуживают доверия!

Признаюсь, я до сих пор не знаю точно, почему вызов этой функции ломает только этот маленький аспект дочерних страниц CPT – и все же никогда не проявлял никаких других проблем! Но было ясно, что использование его в обратном вызове фильтра каким-то образом исказило возвращаемый $query . Удалив этот вызов, мои 404 ошибки исчезли.

Спасибо за все советы – хотелось бы, чтобы я расколол щедрость, поскольку я получил понимание каждого ответа, даже если окончательное решение было несколько не связано. Это был учебный урок, который не слепо доверял вашему коду, даже если он долгое время работал над вами в надежде, или он не вызывает явных ошибок.

Иногда, поскольку диаграмма кайзера так аккуратно воплощается, вам просто нужно начинать бросать переключатели, пока не загорятся огни. В моем случае перед тем, как я смог увидеть проблему, мне пришлось принять ту же стратегию устранения неполадок вплоть до отдельных строк в функции.

Вы используете самую последнюю версию WP? Я предполагаю, что это первый вопрос (например, когда вы звоните в службу технической поддержки, и они спрашивают вас, подключен ли ваш компьютер!), Так как я читал, что эта проблема была рассмотрена в последнем обновлении текущей версии.

На digwp.com есть сообщение, в котором рассматривается эта проблема (http://digwp.com/2011/06/dont-use-postname/). Очевидно, WP не может легко рассказать разницу между сообщениями и страницами, а если вы начинаете свои URL-адреса с текстовой опцией, WP запускает флаг, который создает правило для каждой страницы / сообщения, которое у вас есть. Если у вас много контента на вашем сайте, это может привести к огромному количеству запросов, и ваш сервер, скорее всего, отключится, а это приведет к сбою в 404, даже если страницы есть.

Так. Если сначала использовать структуру на основе числа, то ваша текстовая структура, я бы сделал ставку на то, что ваша проблема с 404 будет решена. Теперь, рассматривая вопросы SEO, я бы не использовал структуру дат, но принятие этого решения будет достаточно логичным для вас.