WordPressは
トップページと投稿のアーカイブのテンプレートが基本的に同じ。
管理画面の表示設定でフロントページの表示を
固定ページにすればすんなり分けられるけど
固定ページつくるのは気持ち悪い。
ので探していたら
v4.4から追加されたregister_post_type_argsに引っ掛ければで設定を変えられるらしいことがわかる。
投稿アーカイブを有効にする (WordPress 4.4以降)
っていうことでやったらできたにはできたけど
シングルのスラッグとアーカイブのスラッグが同じだと問題が。
投稿のパーマリンクを
/news/%post_id%
としている場合で
$args['has_archive'] = 'news';
とすると
/news/ でアーカイブは表示できるが
/news/1 とかでシングルが404になる。
ので却下で海外を探してみるとあった。
Creating a blog post archive at /blog/ without awkwardly publishing a page
フィードも考慮されていてマーベラス。
自分用に変えると
/**
* 投稿のアーカイブページを設定
*/
add_filter('register_post_type_args', function($args, $post_type) {
if ('post' == $post_type) {
global $wp_rewrite;
$archive_slug = 'news';
$args['label'] = 'ニュース';
$args['has_archive'] = $archive_slug;
$archive_slug = $wp_rewrite->root.$archive_slug;
$feeds = '(' . trim( implode('|', $wp_rewrite->feeds) ) . ')';
add_rewrite_rule("{$archive_slug}/?$", "index.php?post_type={$post_type}", 'top');
add_rewrite_rule("{$archive_slug}/feed/{$feeds}/?$", "index.php?post_type={$post_type}".'&feed=$matches[1]', 'top');
add_rewrite_rule("{$archive_slug}/{$feeds}/?$", "index.php?post_type={$post_type}".'&feed=$matches[1]', 'top');
add_rewrite_rule("{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type={$post_type}".'&paged=$matches[1]', 'top');
}
return $args;
}, 10, 2);
で無事にarchive.phpで読めるようになったと。
ちなみに
$args['label'] = 'ニュース';
てやると
get_post_type_object($post_type)->label;
を使っても「投稿」と表示されずに「ニュース」と表示できる。