register_post_type_args:WordPressでTOPページとは別に投稿一覧ページをつくる

2017/07/15

(更新日:2023/10/19

register_post_type_args:WordPressでTOPページとは別に投稿一覧ページをつくる

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 );