Смешивание пользовательских типов записей и структур переписывания таксономии?

30

По сути, я хочу создать глоссарий, используя пользовательские типы сообщений, и у меня есть некоторые проблемы с настройкой переписывания так, как я хочу. Я хочу это так:

Основной глоссарий URL: http://example.com/glossary/

Глоссарий термины, начинающиеся с буквы A : http://example.com/glossary/a/

URL для одного глоссария http://example.com/glossary/a/atomic/

Я фактически достиг этого, используя код ниже, но я уверен, что это очень неловкий способ сделать это, и я знаю, что он где-то работает неправильно, так как при просмотре страниц вызываются неправильные шаблоны. За исключением http://example.com/glossary/ , где archive-sumo-glossary-term.php вызывается, как и ожидалось, остальные два просто активируют index.php в моей теме.

Вот идет ( functions.phpв теме):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
maryisdead
источник

Ответы:

30

Вы всегда можете переопределить шаблон, который будет вызываться с template_includeили или связанным фильтром, но это может скрыть более глубокие проблемы с пользовательскими архивами.

Насколько я понимаю, вы хотите использовать следующую структуру:

  • /glossary/должна быть страница архива для всех sumo-glossary-termсообщений
  • /glossary/[letter]/должна быть страница архива для постов с таксономическим термином [letter]в sumo-glossary-letterтаксономии
  • /glossary/[letter]/[term-name]/должен быть отдельный sumo-glossary-termпост

Это означает, что первый загрузит шаблон archive-sumo-glossary-term.php, второй загрузит taxonomy-sumo-glossary-letter.php, а третий загрузит single-sumo-glossary-term.php.

Я добился этого в WordPress 3.2, явно установив слаг для перезаписи таксономии, а также слаг для перезаписи и архивный слаг для типа записи, и никаких других правил перезаписи. Кроме того, я сначала зарегистрировал таксономию, а затем тип поста, чтобы убедиться, что приоритеты были правильными (в противном случае URL-адрес, такой как /glossary/f/page/2переводится на глоссарий, pageвместо страницы 2 глоссария f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}
Ян Фабри
источник
Я попробую это завтра и посмотрю, сработает ли это, и вернусь сюда. Благодарность!
maryisdead
Хорошо, не совсем до завтра ... Это сработало, почти идеально! Спасибо! Что не работает, так это /glossary/. Дает мне 404 ( archive-sumo-glossary-term.phpнастроен). Любые идеи? Должен сказать, что я застрял на WP 3.0.1, и это, возможно, проблема с версией. Должен проверить это снова, когда я смогу обновить. Во всяком случае, по большей части это работает, и сейчас мне не обязательно, /glossary/а просто перенаправить на букву А. Еще раз спасибо!
maryisdead
эй @maryisdead, у меня была точно такая же проблема, и я нашел то же самое решение, но осталась та же самая проблема - как получить / глоссарий, чтобы перейти к шаблону archive-glossery.php? Я только что нашел ответ - используйте 'has_archive' => 'glossary', вместо того, чтобы has_archive => true просто заметить, что у Джена это так в его ответе, но у вас его нет в исходном коде - вы обновили эту часть? Это начало работать для меня, как только я сделал это изменение
Джефф
Привет, Джефф! Да, обновил эту часть. Просто проверил еще раз, все еще не работает. Рассматриваемая установка WordPress не все еще актуальна (3.0.1), так что, возможно, это все еще корень проблемы.
maryisdead
Та же проблема здесь, с использованием WP 3.2.1. Все еще нет решения?
Ричард Б
0

Я лично не использовал это, но вы можете посмотреть на это "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

также не забудьте сохранить постоянные ссылки, как только вы их изменили.

eeMZee
источник
Я на самом деле использую add_rewrite_rule, просто прокрутите мой код до конца. :-) Пока что все работает нормально, только при таком способе вызываются неправильные шаблоны.
maryisdead