当前位置: 首页>>技术问答>>正文


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

问题描述

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

主要词汇表网址: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

我通过显式设置分类法重写slug,以及post类型的重写slug和archive slug,以及没有其他重写规则,在WordPress 3.2中实现了这一点。此外,我首先注册了分类法,并在其后注册了帖子类型,以确保优先级正确(否则像/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;
}

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3009.html,转载请务必附带本地址声明。