Intereting Posts
Когда я загружаю любой мультимедийный файл, он говорит: «Загруженный файл не может быть перемещен в wp-content / uploads / 2017/04» Показать изображение рядом с пост-тизерами в Genesis Framework? Использование комментариев WordPress на странице пользовательских плагинов Получение значений из базы данных для выбора окна помочь с помощью специального короткого кода, который перестает работать Разделение значения__состояния () по размеру? Получить категорию должности Удаленная страница в базе данных WordPress Почему запрос таксономии Post загружает неправильный шаблон? wpdb-> обновить всю таблицу вместо одной строки Вставка категории программно Использование WordPress для публикации с учетными записями главной учетной записи и редактора Пользовательская позиция WordPress. Лучшая проблема WordPress Экспортировать локальную WP-установку, чтобы жить – нужна помощь

Как переписать пользовательский URL-адрес типа сообщения для нескольких глубин вместо одной определенной глубины

Я получил этот код, который переписывает URL для пользовательских сообщений. Он работает, но только для глубины, где posttitle находится на 5-м сегменте. Как я могу настроить его так, чтобы он принимал несколько глубин?

например:

http://www.mydomain.com/post_type/category1/postname/ http://www.mydomain.com/post_type/category1/child1/postname/ http://www.mydomain.com/post_type/category1/child1/child2/postname/ http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/ 

я попробовал добавить:

 $newRules['product/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]'; 

Но это не сработало, потому что оно дало 404 ошибку при просмотре глубины child3 в приведенной выше структуре примеров.

Текущий код:

 function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]'; // The above structure only works if the postname is the 5th uri segment // eg http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/ $newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]'; return array_merge($newRules, $rules); } 

[Update1]

Он также не будет работать, если я изменю код на if и elseif. С elseif добавляется только верхнее правило, и поэтому я могу просматривать продукты, где posttitle является 5-м сегментом в URL-адресе. if все правила добавлены, но я не могу просматривать категории с глубиной 2,3 и 4, но вы можете просматривать продукты в глубинах, где URL-адрес находится в 3,4-м и 5-м сегментах

 function mmp_rewrite_rules($rules) { $newRules = array(); if ('index.php?products=$matches[4]'){ $newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]'; } elseif ('index.php?products=$matches[3]'){ $newRules['product/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]'; } elseif ('index.php?products=$matches[2]'){ $newRules['product/(.+)/(.+)/?$'] = 'index.php?products=$matches[2]'; } // The above structure only works of the postname is the 5th uri segment $newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]'; return array_merge($newRules, $rules); } 

Solutions Collecting From Web of "Как переписать пользовательский URL-адрес типа сообщения для нескольких глубин вместо одной определенной глубины"

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

Если кто-то придумает лучшее решение, сообщите мне.

 function mmp_rewrite_rules($rules) { //Product structure $newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]'; //The above structure only works of the postname is the 5th uri segment //It's more flexible to confugure the depths for each category below $newRules['product/televisies/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[3]'; $newRules['product/sports/(.+)/?$'] = 'index.php?products=$matches[1]'; //Category rule $newRules['product/(.+)/?$'] = 'index.php?pcategory=$matches[1]'; return array_merge($newRules, $rules); } 

Проблема с вашим регулярным выражением:

 product/(.+)/(.+)/(.+)/(.+)/?$ 

Часть .+ Говорит, чтобы соответствовать чему угодно как можно больше раз. Все может включать / '.

Если вы использовали что-то вроде

 product/([^/]+/)+([^/]+)/?$ 

нарушая это, мы имеем:

  • product/ который соответствует product/
  • ([^/]+/)+? – который соответствует как можно меньше, но по крайней мере 1, slug/ elements (часть [^/] говорит, что соответствует чему-либо, что не является / )
  • ([^/]+)/?$ который соответствует slug , возможно, за которым следует a / , в конце строки (что и означает $ .

Тип сообщения будет в $ match [2]