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

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

Основной 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');
27 голосов | спросил maryisdead 25 J0000006Europe/Moscow 2011, 19:03:17

2 ответа


27

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

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

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

Это означает, что первый загрузит шаблон 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;
}
ответил Jan Fabry 9 J000000Saturday11 2011, 16:43:12
0

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

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

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

ответил eeMZee 29 J0000006Europe/Moscow 2011, 22:57:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132