サポート » 使い方全般 » カスタム投稿タイプのパーマリンクをリライトすると、その個別ページがs

  • 解決済 tekeli

    (@tekeli)


    カスタム投稿タイプの個別ページにおいて、リライト設定を変えたところ、single-[posttype].phpのテンプレートが使われず、archive-[posttype].phpのテンプレートが使われてしまいます。404 Not Foundではありません。
    これをsingle-[posttype].phpのテンプレートで表示させたいというのが要望です。

    ※single-[posttype].phpは今回の場合はsingle-search.phpですが、以下の文章でも引き続きsingle-[posttype].phpと記述します。

    以下はfunction.phpの内容です。

    `function my_custom_post_type() {
    // カスタム投稿タイプを作成
    $args = array(
    'label' => '企画検索',
    'public' => true,
    'exclude_from_search' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => array(
    'slug' => 'search',
    'with_front' => false
    ),
    'capability_type' => 'post',
    'hierarchical' => false,
    'has_archive' => true,
    'menu_position' => null,
    'supports' => array('title','editor','excerpt','custom-fields')
    );
    register_post_type('search',$args);

    // カスタムタクソノミーを作成
    register_taxonomy('group','search',$args);
    $args = array(
    'label' => 'ジャンル',
    'public' => true,
    'show_ui' => true,
    'hierarchical' => false
    );
    register_taxonomy('area','search',$args);

    // カスタム投稿タイプのリライト設定
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag('%search_type%', '(search)', 'post_type=');
    $wp_rewrite->add_rewrite_tag('%search_name%', '([^/]+)', 'postname=');
    $wp_rewrite->add_permastruct('search', '/events/%search_type%/%search_name%/', false);
    }
    add_action('init', 'my_custom_post_type');

    function myposttype_permalink($post_link, $id = 0, $leavename) {
    global $wp_rewrite;
    $post = &get_post($id);
    if(is_wp_error($post))
    return $post;
    $newlink = $wp_rewrite->get_extra_permastruct($post->post_type);
    $newlink = str_replace('%'.$post->post_type.'_type%', $post->post_type, $newlink);
    $newlink = str_replace('%'.$post->post_type.'_name%', $post->post_name, $newlink);
    $newlink = home_url(user_trailingslashit($newlink));
    return $newlink;
    }
    add_filter('post_type_link', 'myposttype_permalink', 1, 3);`

    リライト設定を書いていない状態(但しregister_post_typeのrewriteは使用)では、
    http://www.example.com/search/
    となっていました。
    この状態では、個別ページではsingle-[posttype].phpが問題なく適用されていました。

    しかし、どうしてもURLを
    http://www.example.com/events/search/
    とする必要があるので、上記のようにリライト設定を追加しました。

    すると、確かに上のURLでアーカイブページの方は問題なく表示(archive-[posttype].phpが適用)されていますが、例えば
    http://www.example.com/events/search/hogehoge <-スラッグが「hogehoge」の場合
    などの個別ページの方はsingle-[posttype].phpが適用されずにarchive-[posttype].phpが適用されてしまいます。
    もちろん、function.phpのリライト設定を改変した時には、管理画面の 設定->パーマリンク設定 から「変更を保存」しています。

    これだと1日に2件以上の投稿をしたとき、1つの投稿に絞れないのでシングルポストと判定されません (single.php テンプレートが使われない)。
    パーマリンク構造に postname, post_id, 時・分・秒の3通りのうちいずれか1つを入れる必要があります。

    と、パーマリンクをカスタムにするとmoreのリンクエラーに書かれていたので
    $wp_rewrite->add_permastruct('search', '/events/%search_type%/%search_name%/', false);
    に本来なら%postname%と書くところを%search_name%に書き換えていることが原因とも思っていますが、ここに%postname%を記述しても%postname%がスラッグにリライトされません。

    そもそもsearchは確か予約語だった気もするので、どこかで競合しているのかもしれませんが、リライト設定を書いていない状態(http://www.example.com/search/)の挙動に問題はなかったので、そこは大丈夫だと思っています。

    ちなみに現在使用しているプラグインは
    Akismet (2.5.9)
    Contact Form 7 (3.5.1)
    Google XML Sitemaps (3.2.9)
    WP Multibyte Patch (1.7)
    のみなので、プラグインによる競合は考えにくいです。

    最後に目的をまとめると、
    カスタム投稿タイプ「search」のアーカイブページのURLを
    http://www.example.com/events/search/
    として、その個別ページが通常通りsingle-search.phpで表示されればいいというわけです。

    以上の問題に対する解決策をご教示いただければ幸いです。
    出来るだけプラグインを使いたくはないので、どのようにソースコードを修正すべきかを教えていただけると助かります。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • モデレーター jim912

    (@jim912)

    カスタム投稿タイプのrewriteの部分を

    'rewrite' => array(
    	'slug' => 'events/search',
    	'with_front' => false
    ),

    にして、リライト設定およびパーマリンクのカスタマイズ部分を割愛してみるのはどうでしょう?

    トピック投稿者 tekeli

    (@tekeli)

    返信が遅れてすみません。
    教えていただいたコードで解決しました。

    'slug' => 'events/search'

    は一度試しましたが、その時は404 Not Foundだったので、それ以降この設定には触れていませんでした。今回再度コードを加えて問題なく表示されたので、前の時はリライトルールを保存していなかったのかもしれません。
    ありがとうございます。助かりました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「カスタム投稿タイプのパーマリンクをリライトすると、その個別ページがs」には新たに返信することはできません。