混合定制帖子类型和分类重写结构?

时间:2011-06-25 作者:maryisdead

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

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

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

单个词汇表术语的URL:http://example.com/glossary/a/atomic/

实际上,我使用下面的代码实现了这一点,但我确信这是一种非常笨拙的方式,而且我知道它在某些地方出现了故障,因为在查看页面时调用了错误的模板。除了http://example.com/glossary/, 在哪里存档相扑词汇表术语。php按预期调用,其他两个只激活索引。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\');

2 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

始终可以重写将使用调用的模板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中通过显式设置分类法重写slug,以及post类型的重写slug和归档slug,而没有其他重写规则来实现这一点。此外,我首先注册了分类法,然后注册了帖子类型,以确保优先级正确(否则是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;
    }
    

SO网友:eeMZee

我个人没有使用过这个,但您可能想看看“add\\u rewrite\\u rule”

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

也不要忘记在更改永久链接后保存它们。

结束

相关推荐

curl problem or permalinks

我刚刚配置了我的VPS,我使用的是Centos,一切都很好,但如果我将永久链接设置为自定义结构,然后接受主页,没有帖子出现,它会显示404页,我想这是因为我没有启用curl,但我不知道我的php在哪里。我的centos中的ini文件?好的,我的卷曲被启用了,我检查过了phpinfo(); 这里是URLhttp://74.117.158.182/info.php但如果我在我的wordpress中设置了永久链接,那么接受主页,所有都会给我404页,你可以在这个URL上查看http://mbas.co.in如果