Как включить иерархические постоянные ссылки для иерархических таксономий
Если у вас есть категория "term" и подкатегория "subterm", вы можете получить доступ к записям подкатегории по адресу /cat/subcat. Однако с пользовательскими таксономиями это не работает из коробки. Они доступны по адресу /taxonomy/subterm, но не /taxonomy/term/subterm.
Эта проблема обсуждалась в WordPress Trac (http://core.trac.wordpress.org/ticket/12659), и кажется, что там есть решение, но так как я никогда не использовал Trac и не полностью понимаю его язык (diff'ы и т.д.), мне нужна помощь более опытного разработчика. Есть ли там код, который нужно вставить в файлы ядра WordPress? Или это уже реализовано и можно просто добавить что-то в functions.php моей темы?
По возможности я бы предпочел не изменять файлы ядра. Помогите!

Эта функция реализована в WordPress начиная с версии 3.1.
Когда вы регистрируете свою таксономию, убедитесь, что установили параметр rewrite hierarchical в true, как и для самой таксономии:
<?php
register_taxonomy('genre',array('book'), array(
'hierarchical' => true, // делает таксономию иерархической в интерфейсе
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'hierarchical' => true ), // создает иерархические URL
));

Есть ли способ добавить параметр к уже зарегистрированной пользовательской таксономии? Все мои таксономии были созданы с помощью плагина, поэтому было бы удобно, если бы я мог добавить что-то в functions.php, что просто добавило бы 'rewrite' => array( 'hierarchical' => true ) к этим таксономиям.

Я все еще ищу ответ на этот вопрос — см. http://wordpress.stackexchange.com/questions/17444/add-overwrite-a-parameter-on-an-existing-post-type-taxonomy

Вероятно, проще просто добавить таксономии самостоятельно и не использовать плагин.

Проблема в том, что я работаю с другими, кому нужен графический интерфейс. Иерархический параметр rewrite — это единственное, что до сих пор не поддерживают многие из этих плагинов.

@supertrue - им нужно иметь возможность регистрировать таксономии через графический интерфейс? После регистрации таксономии они смогут использовать GUI для управления терминами. Просто хочу убедиться, что нет путаницы — я никогда не сталкивался с ситуацией, когда новые таксономии нужно было бы добавлять настолько регулярно. Целую таксономию, а не просто термины в таксономии.

Есть ли способ добавить параметр к уже зарегистрированной пользовательской таксономии? Все мои таксономии были созданы с помощью плагина, поэтому было бы удобно добавить что-то в functions.php, что просто добавит 'rewrite' => array( 'hierarchical' => true ) к этим таксономиям.
Вы можете использовать функцию register_taxonomy
для повторной регистрации таксономии, которую хотите изменить.
http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/taxonomy.php#L305
ПРЕДУПРЕЖДЕНИЕ: Код не тестировался!
(Просто набросок. Я не несу ответственности за сломанные сайты.):
function reregister_taxonomy() {
# типы записей, к которым привязана таксономия
$post_types = array('post');
# укажите здесь название таксономии
$tax_name = 'TAXONOMY_NAME_TO_CHANGE';
# загружаем существующую таксономию как массив, чтобы
# передать её в $args функции register_taxonomy
$tax = (array)get_taxonomy($tax_name);
if ($tax) {
# настраиваем иерархические параметры
$tax['hierarchical'] = true;
$tax['rewrite']['hierarchical'] = true;
# настраиваем удобные иерархические метки (можно пропустить)
$tax['labels']['parent_item'] = sprintf(__("Родительский %s"),
$tax->labels->singular_name);
$tax['labels']['parent_item_colon'] = sprintf(__("Родительский %s:"),
$tax->labels->singular_name);
# преобразуем права в массив, как ожидает register_taxonomy
$tax['capabilities'] = (array)$tax['cap'];
# преобразуем метки в массив
$tax['labels'] = (array)$tax['labels'];
# регистрируем таксономию с новыми настройками
register_taxonomy($tax_name, array('post'), $tax);
}
}
# действие init с низким приоритетом, чтобы другие таксономии успели загрузиться
# альтернативно можно использовать хук `registered_taxonomy`
add_action('init', 'reregister_taxonomy', 9999);
Только после написания этого кода я понял, что вопросу уже полтора года, но, возможно, кому-то это пригодится.

Чтобы иерархические постоянные ссылки работали, необходимо добавить правила перезаписи. Мне удалось собрать код, который заставляет пользовательский тип записи с пользовательской таксономией работать с родительскими/дочерними терминами, отраженными в постоянных ссылках. Это не идеально, но работает!
function keha_add_rewrite_rules() {
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?taxonomy=$matches[1]&taxonomy=$matches[2]&posttype=$matches[3]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/$', 'index.php?posttype=$matches[2]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?posttype=$matches[3]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/?$', 'index.php?taxonomy=$matches[2]', 'top' );
add_rewrite_rule( '^posttype_slug/(.+?)$', 'index.php?taxonomy=$matches[1]', 'top' );
}
add_action('init', 'keha_add_rewrite_rules');
Посмотрите мой рабочий пример на Github:
https://github.com/keha76/WordPress-CPT-Hierarchical-Taxonomy-Permalinks

Спасибо @anubhava
Небольшое исследование WP Rewrite API помогло найти решение.
1) Я создал пользовательский URL для перезаписи и поместил его в functions.php
function services_rewrite_basic() {
add_rewrite_rule('^services/.*', 'index.php?page_id=110&level=$matches[1]&level=$matches[1]&level=$matches[1]', 'top');
}
add_action('init', 'services_rewrite_basic');
2) И наконец просто сохранил страницу постоянных ссылок без изменений, что и сработало.
