Как включить иерархические постоянные ссылки для иерархических таксономий

16 мая 2011 г., 01:08:49
Просмотры: 18.1K
Голосов: 3

Если у вас есть категория "term" и подкатегория "subterm", вы можете получить доступ к записям подкатегории по адресу /cat/subcat. Однако с пользовательскими таксономиями это не работает из коробки. Они доступны по адресу /taxonomy/subterm, но не /taxonomy/term/subterm.

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

По возможности я бы предпочел не изменять файлы ядра. Помогите!

0
Все ответы на вопрос 4
5
11

Эта функция реализована в 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
));
16 мая 2011 г. 01:42:31
Комментарии

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

supertrue supertrue
16 мая 2011 г. 02:06:17

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

supertrue supertrue
17 мая 2011 г. 18:50:30

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

Milo Milo
17 мая 2011 г. 18:54:08

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

supertrue supertrue
17 мая 2011 г. 23:21:33

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

Milo Milo
18 мая 2011 г. 01:35:15
0

Есть ли способ добавить параметр к уже зарегистрированной пользовательской таксономии? Все мои таксономии были созданы с помощью плагина, поэтому было бы удобно добавить что-то в 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);

Только после написания этого кода я понял, что вопросу уже полтора года, но, возможно, кому-то это пригодится.

9 нояб. 2012 г. 00:50:42
0

Чтобы иерархические постоянные ссылки работали, необходимо добавить правила перезаписи. Мне удалось собрать код, который заставляет пользовательский тип записи с пользовательской таксономией работать с родительскими/дочерними терминами, отраженными в постоянных ссылках. Это не идеально, но работает!

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

22 сент. 2013 г. 20:49:26
2

Спасибо @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) И наконец просто сохранил страницу постоянных ссылок без изменений, что и сработало.

20 сент. 2016 г. 18:37:59
Комментарии

Возможно, я ошибаюсь, но мне кажется, это не учитывает переводы, верно? За исключением того, что слаг налога "services" одинаков во всех языках...

wbq wbq
28 нояб. 2019 г. 18:19:24

services — это название страницы (имя файла, например services_page.php)

Fury Fury
29 нояб. 2019 г. 13:39:11