カスタム投稿タイプのパーマリンクをリライトすると、その個別ページがs
-
カスタム投稿タイプの個別ページにおいて、リライト設定を変えたところ、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で表示されればいいというわけです。以上の問題に対する解決策をご教示いただければ幸いです。
出来るだけプラグインを使いたくはないので、どのようにソースコードを修正すべきかを教えていただけると助かります。
- トピック「カスタム投稿タイプのパーマリンクをリライトすると、その個別ページがs」には新たに返信することはできません。