Wordpressでカスタム投稿タイプを使いたいとき、functions.phpにコードを書いて設定していましたが、パーマリンク設定ができない(末尾が自動的に投稿名になってしまう)のが改善できないでいました。一応functions.phpにさらに追記していけばできないこともなさそうなのですが、かなり冗長で管理するのが難しそう。いろいろ探していると、投稿タイプごとにパーマリンクを設定できるプラグインを発見。
Custom Post Type UIほど設定できる項目は多くないけど、カスタム投稿タイプに加えカスタム分類も設定できる。パーマリンク設定ももちろんできるし無事成功!…かと思っていたら一つ問題が。一覧ページでarchive-カスタム投稿名.phpが効いていないような…。index.phpが表示されている…。has_archiveがtrueでない!しかも設定箇所を探すも存在しない!うーむ。
ちなみにindex.phpのコードはこんな感じ
<?php get_header(); ?>
<?php get_template_part( 'loop' ); ?>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
中でget_post_type()を実行してみると、カスタム投稿タイプはきちんと認識している様子。てことでindex.phpを下記のように修正。
<?php get_header(); ?>
<?php get_template_part( 'loop', get_post_type() ); ?>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
これでloop-カスタム投稿名.phpが読み込めるので表示を分岐できます。
追記
やはりhas_archiveがtrueでないと、アーカイブページを見せたい時に不都合がでてきた。Breadcrumb NavXTでパンくずを表示させたときに、カスタム投稿タイプの(疑似)アーカイブページではindex.phpが読み込まれてしまうためカスタム投稿タイプ名が表示されない。さらに、カスタム投稿タイプとして投稿したページのパンくずでは、カスタム投稿タイプ名は表示されるものの、リンクが空で表示されてしまうなど。
てことで、強制的にhas_archiveをtrueにするようにプラグインを修正(本来なら管理画面にチェックボタンなりつけて設定するようにすべきだろうけど、やり方がわからない…)。
cms-press/cp-custom-content/cp-custom-content-core.php に追記。
$args = array(
'labels' => $handler->get_type_labels(),
'publicly_queryable' => (bool) $handler->get_type_publicly_queryable(),
'exclude_from_search' => $handler->get_type_exclude_from_search(),
'public' => (bool) $handler->get_type_is_public(),
'hierarchical'=> (bool) $handler->get_type_is_hierarchical(),
'capability_type' => $handler->get_type_capability_type(),
'supports'=>$handler->get_type_supports(),
'rewrite' => $handler->get_type_rewrite(),
'query_var' => $handler->get_type_query_var(),
'show_ui' => (bool) $handler->get_type_show_ui(),
'has_archive' => true // 追記!
);
これで、Breadcrumb NavXTでパンくずがでるようにできますが、まだおかしい。カスタム投稿タイプのアーカイブページへのリンクが?post_type=xxxの形式になってしまう…。てことでこちらも修正。修正するファイルはbcn_display()を呼び出しているphpファイル。
$topicPath = bcn_display( true ); echo preg_replace( '/\?post_type=([^\?=]+?)/', '$1', $topicPath );
CMS Pressがバージョンアップしたときは、上書きされて今回の修正がパーになると思うのでそこは注意。