wordpress Иерархические url для пользовательского типа записи (post type), ассоицированного с таксономией в меню

Задача

Получить вместо (например, при использовании CPT UI):

example.com/custom-post-type/postname

иерархический путь вида:

example.com/custom-post-type/category/sub-category/subsub-category/postname

Сделать это для иерархичеcких категорий таксономии нетрудно (см. тут), но как сделать это и для листьев дерева (т.е. конечных элементов иерархии - самих записей, например в меню, созданном на основе таксономии).

Решение

В functions.php (например), добавляем код вида:

add_filter('post_type_link', 'projectcategory_permalink_structure', 10, 4);
function projectcategory_permalink_structure($post_link, $post, $leavename, $sample) {
    
   $taxonomyName = 'uslugi'; // имя (slug) вашей таксономии
    if (false !== strpos($post_link, "%$taxonomyName%")) {
        $projectscategory_type_term = get_the_terms($post->ID, $taxonomyName);
        if (!empty($projectscategory_type_term))
            $post_link = str_replace("%$taxonomyName%", array_pop($projectscategory_type_term)->
            slug, $post_link);
        else
            $post_link = str_replace("%$taxonomyName%", 'uncategorized', $post_link);
    }
    return $post_link;
}

-- здесь производится замена.
ВНИМАНИЕ: практика показывает, что для замены можно использовать не произвольную строку в процентах, а именно название таксономии, на основании которой хочется построить иерархический URL - а не произвольная строка для подзамены. Т.е. если у вас таксономия называется uslugi, то вам нужно указать в rewrite slug для типа данных custom-post-type именно custom-post-type/%usligi%.

Готовое решение

Можно использовать модуль: https://github.com/it-for-free/wp-hierarchical-taxonomy-items-and-post-urls
(поставить можно как скачав архив так и через композер)

Источники

  • Пример для решения задачи на уровне кода (основной источник): https://wisdmlabs.com/blog/add-taxonomy-term-custom-post-permalinks-wordpress/
  • Похожий вопрос: https://wordpress.stackexchange.com/questions/58707/using-custom-taxonomies-to-display-hierarchical-urls
  • Судя по всему, похожую же задачу, как минимум для ранних версий WP, решал плагин: https://ru.wordpress.org/plugins/custom-post-taxonomy-hierarchy-seo/#description