サポート » 使い方全般 » カスタム投稿タイプのパーマリンク階層構造

  • カスタム投稿タイプ、カスタムタクソノミーを使った際のパーマリンク構造について質問です。

    投稿URLを下記の様にしたいと考えています。
    1. /カスタム投稿タイプ名/ターム名A/ページ名
    2. /カスタム投稿タイプ名/ターム名A/ターム名B/ページ名
    3. /カスタム投稿タイプ名/ターム名A/ターム名B/ターム名C/ページ名
    4以降も、カテゴリ階層に制限は設けていません。

    上記の様にターム名の階層の深さが異なる場合があり、リライトルールをどう設定したら良いか見当がついておりません。
    1. /カスタム投稿タイプ名/ターム名A/ページ名
    2. /カスタム投稿タイプ名/ターム名A/ターム名B/ページ名

    現状、1のページ名と、2のターム名Bがリライトルールで判別できないため、リライトルールが破綻しています。

    全てのターム条件をリライトルールで網羅(postのように)すれば良いのでしょうが、運用上そうもいきません。
    postのように、自動でリライトルールを作ってくれると有り難いのですが。

    現在のカスタム投稿タイプ、タクソノミーの記述を記載いたします。

    function new_post_type_Test(){
     register_post_type(
     'test',
     array(
     'label' => 'Test',
     'public' => true,
     'hierarchical' => false,
     'has_archive' => true,
     'rewrite' => array('with_front' => false,),
     'exclude_from_search' => false,
     'query_var' => false,
     'supports' => array(
     'title',
     'editor',
     'thumbnail',
     'excerpt'
     ),
     'taxonomies' => array('test_cat'),
     'menu_position' => 5
     )
     );
     register_taxonomy(
     'test_cat',
     'test',
     array(
     'label' => 'Test Cate',
     'labels' => array(
         'popular_items' => 'popular_items',
         'edit_item' => 'edit_item',
         'add_new_item' => 'add_new_item',
         'search_items' => 'search',
     ),
     'public' => true,
     'hierarchical' => true,
     'query_var' => true,
     'rewrite' => array('slug' => 'test')
     )
     );
    }
    
    add_action('init', 'new_post_type_Test');

    Custom Post Type Permalinksのプラグインは入れており、
    Use custom permalink of custom taxonomy archive.のチェックは入れていますが、
    これがどう作用しているのかはよく理解できていないのが正直な所です。

    WordPressで運用していく以上、上記のようなケースは頻繁にあると思っているのですが、
    皆様はどのように対応されておられるのでしょうか。

    よろしければご回答いただけると嬉しいです。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • カスタムタクソノミーのrewriteのパラメータをこうすると、お望みのパーマリンク構造になると思いますー。

    'rewrite' => array(
        'slug' => 'test',
        'hierarchical' => true
    )

    トピック投稿者 tarotaro

    (@tarotaro)

    developer様

    ご回答いただきありがとうございます。
    ご教示いただいた方法を試してみましたが、結論から言うとまだ解決しておりません。
    ページが表示されていない状況です。

    下記は404となる、ページのDebug情報です。

    Request:

    test/ターム名A/ターム名B/ターム名C/ページ名

    Query String:

    test_cat=ページ名

    Matched Rewrite Rule:

    test/(.+?)/?$

    Matched Rewrite Query:

    test_cat=ターム名A%2Fターム名B%2Fターム名C%2Fページ名

    すみませんが、何かお分かりになればご回答いただけると幸いです。
    よろしくお願いいたします。

    トピック投稿者 tarotaro

    (@tarotaro)

    パーマリンク設定を記載いたします。

    Permalink Settings for Custom Post Types
    /%test_cat%/%postname%/

    rewriteパラメータの変更後のパーマリンク更新は実施しています。

    よく見るとslug間違ってますねー。
    これでどうでしょう?

    'rewrite' => array(
        'slug' => 'test_cat',
        'hierarchical' => true
    )

    トピック投稿者 tarotaro

    (@tarotaro)

    度々ありがとうございます。

    上記修正により、ページは閲覧可能になりました。
    しかし、次はタームのスラッグにタクソノミー名が付くようになってしまいました。

    現状
    http://○○○/test/ (アーカイブページ)
    http://○○○/test/test_cat/ターム名A/
    http://○○○/test/test_cat/ターム名A/ターム名B/
    http://○○○/test/test_cat/ターム名A/ターム名B/ターム名C/

    理想
    http://○○○/test/
    http://○○○/test/ターム名A/
    http://○○○/test/ターム名A/ターム名B/
    http://○○○/test/ターム名A/ターム名B/ターム名C/

    slugをタクソノミー名にすることで何故このような挙動になるかは追って理解を深めたいと思っておりますが、ひとまずは現状打破をしたく引き続きアドバイスを頂戴できると助かります。

    何卒よろしくお願いいたします。

    そういう時はこうしちゃいましょうー。

    'rewrite' => array(
        'slug' => 'test_cat',
        'with_front' => false,
        'hierarchical' => true
    )

    あと、こういうのはCodexの関数リファレンスに大体書いてあるので、目を通してみると良いですよー。

    トピック投稿者 tarotaro

    (@tarotaro)

    ご対応いただきまして誠にありがとうございます。
    上記方法は試していたのですが、結果としては変わらず、タクソノミー名が入ってくる状況です。

    リファレンスを再度読み直してみます。

    トピック投稿者 tarotaro

    (@tarotaro)

    なお、現状のDebug情報です。
    ‘with_front’ => false,
    を入れても入れなくても下記の結果は同じとなっています。

    http://○○○/test/ターム名A/

    Request:

    test/ターム名A

    Query String:

    name=ターム名A&category_name=test

    Matched Rewrite Rule:

    (.+?)/([^/]+)(/[0-9]+)?/?$

    Matched Rewrite Query:

    category_name=test&name=ターム名A&page=

    トピック投稿者 tarotaro

    (@tarotaro)

    下記でタームのページは開けるようでした。

    ‘with_front’ => true
    http://○○○/test/test_cat/ターム名A/

    ‘with_front’ => false
    http://○○○/test_cat/ターム名A/

    理想
    http://○○○/test/ターム名A/

    with_frontのFrontページを除外するというのは、カスタム投稿タイプ名を除外するということだったのですね。

    カスタム投稿タイプ名は残しつつ、カスタムタクソノミー名を外す方法が分かれば良いということになります。
    とは言っても可能かどうか分かりませんので、調べてみるようにいたします。
    もし解決策に心当たりなどございましたら、ご教示いただけると幸いです。

    よろしくお願いいたします。

    私、最初に書かれていたパーマリンク構造をしっかり見ることが出来てませんでしたね。
    申し訳ないですー。
    多分これで解決すると思うので、お付き合いくださいー。
    with_frontなんですけど、よーく見るとregister_post_typeの中にもありますよねー?
    もうお分かりだと思いますけど、そこがfalseになっているので、trueにしてあげてくださいー。

    トピック投稿者 tarotaro

    (@tarotaro)

    何度もご親切にアドバイスをいただき誠にありがとうございます。
    状況から申し上げると、結果は変わらずでした。

    影響しそうなプラグインとしては「WP No Category Base」があります。
    もう少し粘ってみます。

    function new_post_type_Test(){
     register_post_type(
     'test',
     array(
     'label' => 'Test',
     'public' => true,
     'hierarchical' => false,
     'has_archive' => true,
     'rewrite' => array('with_front' => true),
     'exclude_from_search' => false,
     'query_var' => false,
     'supports' => array(
     'title',
     'editor',
     'thumbnail',
     'excerpt'
     ),
     'taxonomies' => array('test_cat'),
     'menu_position' => 5
     )
     );
     register_taxonomy(
     'test_cat',
     'test',
     array(
     'label' => 'Test Cate',
     'labels' => array(
    	 'popular_items' => 'popular_items',
    	 'edit_item' => 'edit_item',
    	 'add_new_item' => 'add_new_item',
    	 'search_items' => 'search',
     ),
     'public' => true,
     'hierarchical' => true,
     'query_var' => true,
     'rewrite' => array(
       'slug' => 'test_cat',
       'with_front' => false,
       'hierarchical' => true
     )
     )
     );
    }
    
    add_action('init', 'new_post_type_Test');

    酔いが回った状態で回答していました。
    失礼しました。

    そして今じっくり見直していて思ったんですけど、他にも間違ってるところありますね。

    //'query_var' => false,
    // falseではなくカスタム投稿タイプを指定
    'query_var' => 'test'
    
    //'query_var' => true,
    // trueではなくタクソノミーを指定
    'query_var' => 'test_cat',

    一度そのコードはfunctions.phpから外してプラグインで設定した方が良いかもしれません。
    渡すべきパラメータが足りないとか間違っているとか、そういう事が原因である可能性も十分あるので、まずはそこから潰していくと原因も特定しやすいと思います。

    ちなみにプラグインはCustom Post Type Generatorが個人的におすすめです。
    このプラグインで作成したカスタム投稿タイプやカスタムタクソノミーの設定をExportするとこういうコードが取得できます。
    (プラグインで設定した内容によってパラメータは変化します)

    function cptg_custom_post_types()
    {
    	$labels = array(
    		'name' => 'テスト投稿タイプ',
    		'singular_name' => 'テスト投稿タイプ',
    		'menu_name' => 'テスト投稿タイプ',
    		'name_admin_bar' => 'テスト投稿タイプ',
    		'all_items' => '投稿一覧',
    		'add_new' => '新規追加',
    		'add_new_item' => '新規投稿を追加',
    		'edit_item' => '投稿の編集',
    		'new_item' => '新規投稿',
    		'view_item' => '投稿を表示',
    		'search_items' => '投稿を検索',
    		'not_found' =>  '投稿が見つかりませんでした。',
    		'not_found_in_trash' => 'ゴミ箱内に投稿が見つかりませんでした。',
    		'parent_item_colon' => '親投稿',
    	);
    	$args = array(
    		'labels' => $labels,
    		'public' => true,
    		'exclude_from_search' => false,
    		'publicly_queryable' => true,
    		'show_ui' => true,
    		'show_in_nav_menus' => true,
    		'show_in_menu' => true,
    		'show_in_admin_bar' => true,
    		'has_archive' => true,
    		'menu_position' => null,
    		'menu_icon' => null,
    		'hierarchical' => false,
    		'rewrite' => array( 'slug' => 'test','with_front' => true,'feeds' => true,'pages' => true ),
    		'query_var' => 'test',
    		'can_export' => true,
    		'supports' => array( 'title','editor' ),
    	);
    	register_post_type( 'test', $args );
    
    	$labels = array(
    		'name' => 'テストタクソノミー',
    		'singular_name' => 'テストタクソノミー',
    		'menu_name' => 'テストタクソノミー',
    		'all_items' => 'すべてのタグ',
    		'edit_item' => 'タグの編集',
    		'view_item' => 'タグを表示',
    		'update_item' => 'タグを更新',
    		'add_new_item' => '新規タグを追加',
    		'new_item_name' => '新規タグ名',
    		'parent_item' => '親カテゴリー',
    		'parent_item_colon' =>  '親カテゴリー',
    		'search_items' => 'タグを検索',
    		'popular_items' => '人気のタグ',
    		'separate_items_with_commas' => 'タグが複数ある場合はコンマで区切ってください',
    		'add_or_remove_items' => 'タグの追加もしくは削除',
    		'choose_from_most_used' => 'よく使われているタグから選択',
    		'not_found' => 'タグが見つかりませんでした。',
    	);
    	$args = array(
    		'labels' => $labels,
    		'public' => true,
    		'show_ui' => true,
    		'show_in_nav_menus' => true,
    		'show_tagcloud' => true,
    		'meta_box_cb' => null,
    		'show_admin_column' => true,
    		'hierarchical' => true,
    		'query_var' => 'test_cat',
    		'rewrite' => array( 'slug' => 'test_cat','with_front' => true,'hierarchical' => true, ),
    		'sort' => false,
    	);
    	register_taxonomy( 'test_cat', array( 'test' ) , $args );
    }
    add_action( 'init', 'cptg_custom_post_types' );

    Exportで取得したコードをfunctions.phpに貼り付けてしまえば、その後はプラグインを無効にしても大丈夫です。

    ただ、このプラグインは作者さんは日本の方なのですが、あえてパラメータを日本語に訳していないんですよね。
    そんなわけなので、Codexのregister_post_typeregister_taxonomyでそれぞれのパラメータを確認しながら設定を行った方が良いです。

    トピック投稿者 tarotaro

    (@tarotaro)

    度々、誠にありがとうございます。
    試させていただきましたが、ターム名とページ名がバッティングしてしまっているのか、

    成功パターン1
    test_cat/ターム名/
    test/ターム名/ページ名/

    成功パターン2
    test/test_cat/ターム名/
    test/ターム名/ページ名/

    のパターンでしか成功していません。

    test/ターム名/
    を通そうとすると、
    test/ターム名/ページ名/
    が404になる状況は変わりません。

    ちょっと頭を冷やして再度考えてみます・・。

    まずパーマリンク構造を整理してみましょう。

    Custom Post Type Permalinksで設定したパーマリンク構造
    (分かりやすくするために%test_cat%を%custom_taxonomy%としています)

    /%custom_taxonomy%/%postname%/

    パーマリンク
    /custom_post_type/term/post/
    クエリ

    post_type=custom_post_type&custom_post_type=post&name=post&custom_taxonomy=term

    個別の投稿として有効なパーマリンク構造

    パーマリンク
    /custom_taxonomy/term/
    クエリ

    custom_taxonomy=term

    タクソノミーアーカイブとして有効なパーマリンク構造

    パーマリンク
    /custom_post_type/custom_taxonomy/term/
    クエリ

    post_type=custom_post_type&custom_taxonomy=term

    カスタム投稿内のタクソノミーアーカイブとして有効なパーマリンク構造

    パーマリンク
    /custom_post_type/term/
    クエリ

    name=term&category_name=custom_post_type

    個別の投稿ではない
    タクソノミーアーカイブではない
    投稿を表示するリライトルール(/category/post/)が適用されるため正しく機能しない
    適切なリライトルールがない無効なパーマリンク

    個人的にはURLが少し短くなる程度のメリットしかないように感じるので、どのカスタムタクソノミーのタームなのかが分かるように/custom_post_type/custom_taxonomy/termで良いのではないかと思いますが、一応対応する方法も書いておきますね。

    この無効なパーマリンクを有効にしたい時はadd_rewrite_ruleでリライトルールを追加します。
    実際には次のようにして追加します。

    function custom_rewrite_basic() {
      /**
       * パーマリンク
       * domain.com/custom_post_type/term
       *
       * custom_post_typeは実際に登録しているカスタム投稿タイプに置き換えてください
       * custom_taxonomyは実際に登録しているカスタムタクソノミーに置き換えてください
       * リライトルールを2つ追加していますが、これはページが分割されて表示される場合にも対応しなければいけないからです。
       */
      add_rewrite_rule( 'custom_post_type/(.+?)/page/?([0-9]{1,})/?$', 'index.php?post_type=custom_post_type&custom_taxonomy=$matches[1]&paged=$matches[2]', 'top' );
      add_rewrite_rule( 'custom_post_type/(.+?)/?$', 'index.php?post_type=custom_post_type&custom_taxonomy=$matches[1]', 'top' );
    }
    add_action( 'init', 'custom_rewrite_basic' );

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「カスタム投稿タイプのパーマリンク階層構造」には新たに返信することはできません。