混合使用自定义帖子类型和分类重写结构吗?


30

基本上,我想使用自定义帖子类型来创建词汇表,并在设置重写我希望的方式时遇到一些问题。我想要这样:

主要词汇表URL: http://example.com/glossary/

术语以字母A开头: http://example.com/glossary/a/

单个词汇表术语的网址: 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');

Answers:


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 2011年

好的,不完全是明天……它几乎可以正常工作!谢谢!什么是行不通的/glossary/。给我一个404(archive-sumo-glossary-term.php已设置)。有任何想法吗?不得不说,我坚持使用WP 3.0.1,这可能是版本问题。我可以升级时再次进行测试。无论如何,在大多数情况下它都可以正常工作,现在我并不需要/glossary/,只需重定向到字母A。再次感谢您!
maryisdead 2011年

嘿@maryisdead,我遇到了完全相同的问题,并提出了完全相同的解决方案,但又遇到了完全相同的问题-如何获得/ glossary进入archive-glossery.php模板?我只是找到了答案-use 'has_archive' => 'glossary',而不是has_archive => true 我刚刚注意到Jan在他的答案中有这种方式,但是您在原始代码中没有这种方式-您是否更新了那部分?刚一开始,我工作,我所做的改变
杰夫

嘿,杰夫!是的,更新了那部分。刚刚再次检查,仍然无法正常工作。有问题的WordPress安装仍不是最新版本(3.0.1),因此也许这仍然是问题的根源。
maryisdead '02

使用WP 3.2.1,这里也存在同样的问题。还是没有解决办法?
理查德B

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.