Игорь Воротнёв: 1. Пример. Есть произвольный тип записи "модели автомобилей", у него есть таксономия "марка автомобиля", заказчик хочет, чтобы урл был не site.ru/mark/audi, а sire.ru/audi
2. Отчасти.
В этом и проблема.
1. WordPress читает правила сверху вниз, по порядку. И сравнивает.
2. При регистрации пост-тайпа ваши новые правила будут сверху. С них он и начнет.
3. При нахождении первого же совпадения, дальнейшие проверки прерываются, и WP продолжает работу, используя совпавшее правило.
4. Правило без /mark/ будет идентично правилу обычных страниц (page)
5. Соответственно, при попытке зайти на страницу, получите 404 - потому что WP будет смотреть ваш custom post type с таким слагом, а не страницу, такой записи в mark он не найдет, поэтому выдаст 404.
6. Если вы поставите ваши правила в низ массива rewrite_rules - произойдет обратное. При запросе страниц все будет ок (потому что первое правило в списке будет по страницам, его WP и подхватит), а при запросе вашего CPT будет 404 - потому что WP возьмет его слаг и спросит страницу с таким слагом. Ее, естественно, не будет - отсюда 404.
Это если говорить о механизме из коробки.
Впрочем, WP - это всего лишь кучка PHP-кода, поэтому в теории можно сделать все, что угодно. Можно хукаться в дальнейшие фазы обработки запроса и там делать дополнительные проверки. Посмотрите тут для начала: https://kellenmace.com/remove-custom-post-type-slu...
Игорь Воротнёв: спасибо за ответ! алгоритм действий понятен.
можете еще подсказать, я на страницу передаю get параметры, с помощью add_rewrite_rule делаю урл чпу. Но это, если известно кол-во параметров и их названия. А что делать, если число параметров и сами параметры неизвестны? То есть может передавать один параметр, а может и 5.