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-hierar...
(поставить можно как скачав архив так и через композер)

Источники