web-dev-qa-db-ja.com

カスタムの投稿タイプと分類の書き換え構造を混在させる

基本的に、カスタム投稿タイプを使用して用語集を作成したいのですが、セットアップ時にいくつかの問題が発生します。私はそれが好きです:

主な用語集のURL:http://example.com/glossary/

_ a _ の文字で始まる用語集:http://example.com/glossary/a/

単一の用語集のURL:http://example.com/glossary/a/atomic/

私は実際に以下のコードを使用してこれを達成しました、しかしそれはそれをする非常に厄介な方法であると確信しています、そして私はそれがページを見るとき間違ったテンプレートが呼ばれるのでどこか誤動作しています。 archive-sumo-glossary-term.phpが期待どおりに呼び出される http://example.com/glossary/ を除いて、他の2つは私のテーマで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');
30
maryisdead

template_includeまたは関連するフィルタで呼び出されるテンプレートはいつでもオーバーライドできますが、これはカスタムアーカイブに関するより深い問題を隠すかもしれません。

私が理解しているように、あなたは次のような構造を使いたいのです。

  • /glossary/は、すべてのsumo-glossary-term投稿のアーカイブページになります
  • /glossary/[letter]/は、[letter]分類法の分類法用語sumo-glossary-letterを持つ投稿のアーカイブページです。
  • /glossary/[letter]/[term-name]/は個別のsumo-glossary-term投稿であるべきです

これは、最初のテンプレートがarchive-sumo-glossary-term.phpをロードし、2番目のテンプレートがtaxonomy-sumo-glossary-letter.phpをロードし、3番目のテンプレートがsingle-sumo-glossary-term.phpをロードすることを意味します。

WordPress 3.2では、分類タイプの書き換えスラッグ、および投稿タイプの書き換えスラッグとアーカイブスラッグの両方を明示的に設定することでこれを実現しました。その他の書き換え規則はありません。また、優先順位が正しいことを確認するために、最初に分類法を、その後に分類法を登録しました(そうでなければ、/glossary/f/page/2のようなURLは用語集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;
}
29
Jan Fabry

私は個人的にはこれを使用していませんが、あなたが見たいのは "add_rewrite_rule"です。

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

パーマリンクを変更したら、忘れずに保存してください。

0
eeMZee