Похоже, что все веб-ресурсы основаны на удалении пользовательского типа поста, т.е.
yourdomain.com/CPT-SLUG/post-name
В настоящее время это очень устаревшие решения, часто ссылающиеся на предварительные версии WP 3.5. Обычным является:
'rewrite' => array( 'slug' => false, 'with_front' => false ),
в вашей функции register_post_type. Это больше не работает и вводит в заблуждение. Поэтому я прошу сообщество в 3 квартале 2018 года на грани WordPress 5 ...
Каковы современные и эффективные способы удаления слагаемого типа сообщения из URL-адреса сообщения настраиваемого типа сообщения из аргумента перезаписи или где-либо еще?
ОБНОВЛЕНИЕ: Кажется, есть несколько способов заставить это работать с регулярным выражением. В частности, ответ от Яна Бека, если вы хотите постоянно следить за созданием контента, чтобы убедиться, что конфликтующие имена страниц / постов не создаются .... Однако я убежден, что это серьезный недостаток в ядре WP, где его следует обрабатывать для нас. , И как опция / ловушка при создании CPT, или как расширенный набор опций для постоянных ссылок. Пожалуйста, поддержите трек билет.
Сноска: Пожалуйста, поддержите этот билет, проследив / продвигая его: https://core.trac.wordpress.org/ticket/34136#ticket
источник
Ответы:
Следующий код будет работать, но вы просто должны помнить, что конфликты могут легко возникнуть, если слаг для вашего пользовательского типа поста такой же, как слаг для страницы или поста ...
Сначала мы удалим слизняк из постоянной ссылки:
Одного удаления слизняка недостаточно. Прямо сейчас вы получите страницу 404, потому что WordPress ожидает, что посты и страницы будут вести себя именно так. Вам также необходимо добавить следующее:
Просто измените «события» на свой тип сообщения, и все готово. Возможно, вам придется обновить ваши постоянные ссылки.
источник
2 != count( $query->query )
. С nginx вы можете иметь $ query-> query asarray('page' => '', 'name' => '...', 'q' => '...')
. @NateAllen, что означает это условие?Запишите следующий код в регистрацию таксономии.
Самое важное, что вы должны сделать после изменения кода
После того, как вы изменили свой документ таксономии с пользовательским типом записи, попробуйте зайти в « Настройки»> «Постоянные ссылки» и заново сохранить настройки , иначе вы получите страницу 404, которая не найдена.
Проверьте здесь для лучшего решения: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/
источник
Я пытался понять это не так давно, и короткий ответ из того, что я знаю, нет . По крайней мере, не из аргумента перезаписи.
Длинное объяснение становится очевидным, если вы посмотрите на реальный код
register_post_type
в строке 1454 wp-includes / post.php :Вы можете видеть его префиксы
$args->rewrite['slug']
к%$post_type%
тегу перезаписи. Кто-то может подумать «давайте просто установим слагnull
», пока вы не посмотрите несколько строк вверх:Вы можете видеть, что функция всегда ожидает значение slug, которое не является пустым, и иначе использует тип записи.
источник
В ответ на мой предыдущий ответ : вы, конечно, могли бы установить
rewrite
параметрfalse
при регистрации нового типа поста и самостоятельно обрабатывать правила перезаписи.Вы можете видеть, что
add_permastruct
звонок теперь не включает слизняк. Я проверил два сценария:источник
Просматривая ответы здесь, я думаю, что есть место для лучшего решения, которое объединяет некоторые вещи, которые я изучил выше, и добавляет автоматическое обнаружение и предотвращение дублирования почтовых слагов.
ПРИМЕЧАНИЕ. Убедитесь, что вы изменили «custom_post_type» для своего собственного имени CPT в моем примере ниже. Есть много случаев, и «найти / заменить» - это простой способ поймать их всех. Весь этот код может идти в вашем functions.php или в плагине.
Шаг 1. Отключите перезаписи для своего пользовательского типа сообщения, установив для параметра rewrites значение «false» при регистрации сообщения:
Шаг 2: Вручную добавить наши собственные переписывает в нижней части WordPress переписывает для нашего custom_post_type
ПРИМЕЧАНИЕ. В зависимости от ваших потребностей вы можете изменить приведенные выше варианты перезаписи (отключить обратные ссылки? Каналы? И т. Д.). Они представляют типы перезаписей по умолчанию, которые были бы сгенерированы, если бы вы не отключили перезаписи на шаге 1
Шаг 3. Снова сделайте постоянные ссылки на ваш пользовательский тип сообщения «pretty».
ПРИМЕЧАНИЕ. Вы можете остановиться здесь, если вы не беспокоитесь о том, что ваши пользователи создают конфликтующие (дублирующие) записи в сообщениях другого типа, что создаст ситуацию, при которой только одна из них сможет загружаться при запросе страницы.
Шаг 4: Предотвратите повторяющихся пост-слагов
ПРИМЕЧАНИЕ. Это добавит строку «-duplicate» в конец любых дублирующих слагов. Этот код не может предотвратить дублирование слагов, если они уже существуют до реализации этого решения. Не забудьте сначала проверить наличие дубликатов.
Я хотел бы услышать от кого-то еще, кто попробует проверить, хорошо ли это сработало и для них.
источник
/%category%/%postname%/
. При добавлении вашего кода слагаемые CPT выглядят нормально (хотя и не имеют завершающего слеша) ... и проверка конфликтов также работает. Но фактическое сообщение приводит к 404.Вам не нужно так много жесткого кода. Просто используйте легкий плагин:
Имеет настраиваемые параметры.
источник
Были те же проблемы здесь и там, кажется, нет движения на сайте WordPress. В моей конкретной ситуации, когда для отдельных постов в блоге была нужна структура / blog /% postname% /
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
закончилась кучей 404-х
Но вместе с этим замечательным подходом, который не использует структуру постоянных ссылок бэкенда для поста блога, он, наконец, работает как шарм. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
Огромное спасибо.
источник
и мы можем внести некоторые изменения в вышеупомянутую функцию:
чтобы:
для того, чтобы установить правильное значение post_type.
источник
Это сработало для меня:
'rewrite' => array('slug' => '/')
источник
Для тех, кто читает это, у кого были проблемы с дочерними записями, как я, я нашел лучший способ - добавить свои собственные правила переписывания.
Основная проблема, с которой я столкнулся, заключалась в том, что WordPress обрабатывает перенаправление со страниц, которые имеют глубину 2 уровня (дочерние сообщения), немного по-другому, чем он обрабатывает 3 уровня (дочерние элементы дочерних сообщений).
Это означает, что когда у меня есть / post-type / post-name / post-child /, я могу использовать / post-name / post-child, и он перенаправит меня на тот, у которого post-type впереди, но если у меня есть post-type / post-name / post-child / post-внучка, тогда я не могу использовать post-name / post-child / post-внучка.
Взглянув на правила перезаписи, он выглядит так, как будто он соответствует другим вещам, кроме pagename на первом и втором уровнях (я думаю, что второй уровень соответствует вложению), а затем делает что-то там, чтобы перенаправить вас на нужный пост. На трех уровнях это не работает.
Первое, что вам нужно сделать, это также удалить ссылку на тип записи у детей. Эта логика должна произойти здесь, если вы посмотрите на ответ Нейта Аллена выше:
Я сам использовал комбинацию различных условных выражений, чтобы проверить, есть ли у поста дети и еще много чего, чтобы получить правильную постоянную ссылку. Эта часть не слишком сложна, и вы найдете примеры людей, делающих это в других местах.
Следующий шаг - это то, где все меняется от данного ответа. Вместо того, чтобы что-то добавлять в основной запрос (который работал для пользовательских сообщений и их дочерних элементов, но не для последующих дочерних элементов), я добавил переписывание, которое перешло в конец правил WordPress, чтобы, если pagename не проверялось, и оно собиралось если вы нажмете 404, он выполнит одну последнюю проверку, чтобы увидеть, имеет ли страница в пользовательском типе записи то же имя, в противном случае он выбросит 404.
Вот правило перезаписи, которое я использовал, предполагая, что 'event' - это имя вашего CPT
Надеюсь, это поможет кому-то еще, я не смог найти ничего другого, связанного с дочерними постами и удалением слизняков из них.
источник