Как изменить структуру постоянных ссылок для произвольного типа записей и его таксономий?
Это повторная публикация моего предыдущего вопроса, но теперь я хочу рассмотреть его более детально, чтобы полностью решить проблему.
Итак, для обычных записей изменение постоянных ссылок просто как никогда - достаточно перейти в Настройки > Постоянные ссылки и изменить структуру на любую понравившуюся, например, на широко используемую %category%/%postname%.html
. Это работает. Если бы это было так же просто для произвольного типа записей и его таксономий.
Вот чего я хочу добиться:
- http://mywordpress.com/portfolio.html - Отображать все записи во всех категориях.
- http://mywordpress.com/portfolio/music/ - Отображать все записи в этой категории.
- http://mywordpress.com/portfolio/music/trance/ - Отображать все записи в этой (дочерней) категории.
- http://mywordpress.com/portfolio/music/trance/Tiesto.html - Отображать запись.
Вот что у меня есть на данный момент:
- Сначала я создал
custom_post_type
с названием project иtaxonomy
project_category. - Я создал страницу Portfolio и назначил ей шаблон страницы, который будет выводить все записи с
post_type = project
. Как добавить .html к постоянной ссылке страниц? Сейчас она ведет на http://mywordpress.com/portfolio, а мне нужно http://mywordpress.com/portfolio.html. Это должно решить первую проблему. - Дальше становится сложнее, потому что мы заранее не знаем, сколько будет подкатегорий, возможно их вообще не будет. Поэтому структура, которую мы ищем:
portfolio/(ПУТЬ КАТЕГОРИИ ОТ ВЕРХНЕЙ ДО ДОЧЕРНЕЙ)/post.html
. Я все еще застрял на этом моменте. Думаю, что как-то нужно получить последнюю добавленную категорию в путь и передать ее в project_category, что должно привести к файлу taxonomy.php, где я смогу правильно ее обработать. - Я также еще не решил эту проблему, но она должна быть связана с добавлением
%postname%.html
в конце чего-то.
Надеюсь, моя проблема понятна, и найдутся смелые разработчики, которые помогут мне решить эту задачу, над которой я бьюсь уже ЧЕТЫРЕ полных дня!
Хорошо, думаю, у меня есть решение. Я не уверен, правильный ли это способ реализовать задуманное, но пока это единственное, что работает.
// Добавляем фильтр для изменения правил перезаписи URL
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
// Правило для отдельных проектов: portfolio/категория/проект.html
$newRules['portfolio/(.+)/(.+?).html$'] = 'index.php?project=$matches[2]';
// Правило для категорий проектов: portfolio/категория/
$newRules['portfolio/(.+)/?$'] = 'index.php?project_category=$matches[1]';
// Объединяем новые правила с существующими
return array_merge($newRules, $rules);
}
// Добавляем фильтр для обработки запроса
add_filter('request', 'mmp_rewrite_request');
function mmp_rewrite_request($vars) {
// Если запрошена категория проекта
if (isset($vars['project_category'])) {
// Если в URL категории есть слэши
if (strpos($vars['project_category'], '/') !== false) {
// Разбиваем URL по слэшам
$categories = explode('/', $vars['project_category']);
// Берем последний элемент (актуальное имя категории)
$vars['project_category'] = $categories[count($categories) - 1];
}
}
return $vars;
}

Фильтр запросов — это хороший способ определить, запрашиваем ли мы категорию (по сути, термин) или запись. Он позволяет добавить только одно правило перезаписи и получать страницу записи независимо от того, находится ли запись в категории, подкатегории или вообще без категории.

После многочасовых мучений я нашел этот плагин очень полезным.
https://wordpress.org/plugins/custom-post-type-permalinks/
Ниже приведен скриншот доступных опций.

2 разных метода:
*Смотрите примечания внизу этого поста.
Например, вы хотите иметь такую структуру постоянных ссылок:
/ГЛАВНАЯ_КАТЕГОРИЯ/ПОДКАТЕГОРИЯ_2/Еще_ПОДКАТЕГОРИЯ/моя-запись
Сначала вам может потребоваться установить постоянные ссылки в формате /%category%/%postname%. Затем...
МЕТОД 1:
создайте СТАНДАРТНЫЕ категории (ГЛАВНАЯ_КАТЕГОРИЯ
, ПОДКАТЕГОРИЯ_1
, и так далее..
), затем зарегистрируйте ПРОИЗВОЛЬНЫЙ ТИП ЗАПИСИ, включив этот параметр:
'taxonomies' => array('category'..)
и используйте этот код для изменения постоянных ссылок: https://wordpress.stackexchange.com/a/195643/33667
Затем, после публикации ПРОИЗВОЛЬНОЙ ЗАПИСИ (если она прикреплена к категории), URL будет выглядеть так:
example.com/ГЛАВНАЯ_КАТЕГОРИЯ/ПОДКАТЕГОРИЯ_1/моя-запись
МЕТОД 2:
(примечание: этот метод не рекомендуется, если вы планируете публиковать сотни или тысячи записей)
зарегистрируйте ПРОИЗВОЛЬНЫЙ ТИП ЗАПИСИ (названный ГЛАВНАЯ_КАТЕГОРИЯ
), включив эти параметры:
"supports" => array('page-attributes'......
"hierarchical" => true,
затем публикуйте произвольные записи следующим образом:
(т.е. публикуйте несколько произвольных записей, названных ПОДКАТЕГОРИЯ_2, ПОДКАТЕГОРИЯ_1..
. После этого, когда вы публикуете другую запись, выберите ПОДКАТЕГОРИЯ_2
в качестве родительской.
Примечания:
1) Если вы новичок, изучите: Регистрация ПРОИЗВОЛЬНОГО ТИПА ЗАПИСИ и Регистрация ПРОИЗВОЛЬНОГО ТИПА ЗАПИСИ с ТАКСОНОМИЕЙ
2) если вам потребуется функциональность поиска для подуровней, используйте произвольный поисковый запрос
