WordPressのデフォルト投稿であるpostの一覧ページをつくる方法を紹介します。
今回のWordPressサイト構築の仕様
- サイトのTOPページはオリジナルコンテンツのため、postのアーカイブページを作りたい
- 投稿のパーマリンク(URL)は「https://ドメイン/blog/%post_id%/」という形にする
ググってみたところ、ページ送りが動かないコードとかも多かったのですが、海外の記事でベストな方法がありました。
こちらの記事です。
解決:add_rewrite_ruleを使う
以下コードをfunctions.phpに以下を追加して、以下の「blog」部分を好きな文字にすればページ送りもきちんと効く一覧ページが出来上がります。
・$archive_slug = ‘blog’;
・$link = home_url( ‘blog/’ );
function post_has_archive( $args, $post_type ) {
global $wp_rewrite;
if ( 'post' === $post_type && ! is_null( $wp_rewrite ) ) {
$archive_slug = 'blog';
// Setting 'has_archive' ensures get_post_type_archive_template() returns an archive.php template.
$args['has_archive'] = $archive_slug;
// We have to register rewrite rules, because WordPress won't do it for us unless $args['rewrite'] is true.
$archive_slug = $wp_rewrite->root . $archive_slug;
add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
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;
}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
function post_archive_link( $args, $post_type ) {
if ( 'post' === $post_type ) {
$link = home_url( 'blog/' );
}
return $link;
}
add_filter( 'post_type_archive_link', 'post_archive_link', 10, 2 );