問題描述

基本上我想使用自定義的帖子型別來實現一個詞彙表,並且設定一些問題來重寫我想要的方式。我想要這樣:

主要詞彙表 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。