カスタムの投稿タイプと分類の書き換え構造を混在させていますか?


30

基本的に、カスタムの投稿タイプを使用して用語集を作成したいと思いますが、いくつかの問題があります。そのようにしたい:

メイン用語集の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

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、2番目のテンプレートがロードされ、3 番目のテンプレートがロードされることを意味しますsingle-sumo-glossary-term.php

これをWordPress 3.2で明示的に分類書き換えスラグと、投稿タイプの書き換えスラグとアーカイブスラグの両方を設定し、他の書き換えルールを設定することによってこれを達成しました。また、優先順位が正しいことを確認するために、分類法を最初に登録し、その後に投稿タイプを登録しました(そうでない場合、用語集の2ページ目ではなく/glossary/f/page/2用語集用語pageに移動します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;
}

明日それを試してみて、うまくいくかどうかを確認して、ここに戻ります。ありがとう!
マリスデッド

OK ありがとうございました!動作していないのは/glossary/です。404(archive-sumo-glossary-term.phpセットアップ済み)を提供します。何か案は?WP 3.0.1にこだわっていると言わざるを得ないが、それはバージョンの問題かもしれない。アップグレードできたらもう一度テストしてください。とにかく、ほとんどの部分で機能しています。今のところ、必ずしも必要ではなく/glossary/、文字Aにリダイレクトするだけです。ありがとうございます!
maryisdead

ちょっと@maryisdead、まったく同じ問題があり、まったく同じ解決策を思いつきましたが、まったく同じ問題が残っていました-archive-glossery.phpテンプレートに/ glossaryを取得するにはどうすればよいですか?私はちょうど答えを見つけました-Jan が彼の答えにそのように持っていることに気付いたの'has_archive' => 'glossary'ではなく、使用has_archive => trueしますが、元のコードではそうではありません-あなたはその部分を更新しましたか?その変更を加えるとすぐに機能し始めました
ジェフ

こんにちはジェフ!はい、その部分を更新しました。もう一度確認したところ、まだ機能していません。問題のWordPressのインストールはまだ最新(3.0.1)ではないため、それが問題の原因である可能性があります。
maryisdead

ここで同じ問題、WP 3.2.1を使用します。それでも解決策はありませんか?
リチャードB

0

私はこれを個人的に使用したことはありませんが、あなたが見たいのは「add_rewrite_rule」です

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

また、パーマリンクを変更したら保存することを忘れないでください。


実際に使用するのadd_rewrite_ruleは、コードを一番下までスクロールするだけです。:-)これまでのところうまく機能しています。この方法で間違ったテンプレートが呼び出されるだけです。
maryisdead
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.