问题描述

基本上我想使用自定义的帖子类型来实现一个词汇表,并且设置一些问题来重写我想要的方式。我想要这样:

主要词汇表 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');

最佳解决方案

您可以随时覆盖将使用 template_include 或相关过滤器调用的模板,但这可能会隐藏更多自定义存档的问题。

据我了解,您要使用以下结构:

  •  /glossary/应该是所有 sumo-glossary-term 帖子的归档页面

  •  /glossary/[letter]/应该是 sumo-glossary-letter 分类学中具有分类术语 [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 中实现了这一点,显式地设置了分类重写 slug,重写 slug 和 post 类型的 archive slug,而没有其他的重写规则。此外,我先注册了分类法,然后在其后注册了分类,以确保优先级是正确的 (否则,如/glossary/f/page/2 的 URL 转换为术语表 page 而不是术语表 f 的第 2 页) 。

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;
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。