2026年5月20日
2026年5月20日
WordPressのカテゴリーページが表示されない・404になるときの確認手順
WordPress のカテゴリーページ(/category/news/ のようなカテゴリーのアーカイブ)がうまく表示されないとき、症状によって見る場所が変わります。
| 症状 | 主な原因 | 見る項目 |
|---|---|---|
| どのカテゴリーも 404 になる | リライトルール・サーバーの設定 | 1 |
| 一部のカテゴリーだけ 404 になる | URL のスラッグ違い、カテゴリーベースの変更 | 2・3 |
| 2ページ目以降だけ 404 になる | 1ページの表示件数と、テーマ側のクエリの食い違い | 4 |
| ページは出るが投稿が出ない | 投稿のステータス、pre_get_posts のカスタマイズ、カスタム投稿タイプ |
5・6 |
| 見た目が意図したテンプレートにならない | テンプレート階層 | 7 |
なお、投稿が1件も無いカテゴリーのページは 404 ではなく、「投稿が見つからない」旨を表示する通常のページ(ステータス 200)になります。カテゴリーが存在しない場合や、存在するページ数を超えたページ番号を開いた場合は 404 になります。
この記事の操作は2026年10月時点の WordPress 6.x の管理画面と WP-CLI を前提にしています。
1. パーマリンクを保存し直す
どのカテゴリーも 404 になる場合は、まずリライトルールを作り直します。管理画面の「設定 → パーマリンク」を開き、何も変えずに「変更を保存」を押します。
WP-CLI を使える場合は次のコマンドでも同じです。--hard を付けると、Apache の .htaccess も書き直します。
wp rewrite flush --hard
これで直らない場合は、サーバーの設定を確認します。
- Apache: WordPress の
.htaccess(# BEGIN WordPressから# END WordPressの部分)があり、そのディレクトリでAllowOverrideがAll(少なくともFileInfo)になっていて、mod_rewriteが有効か。 - Nginx:
location /にtry_files $uri $uri/ /index.php?$args;があるか。Nginx は.htaccessを読まないため、この設定が無いとトップページ以外が 404 になります。
2. カテゴリーのスラッグを確認する
一部のカテゴリーだけ 404 になる場合は、URL に使っているスラッグが実際のスラッグと合っているか確認します。
wp term list category --fields=term_id,name,slug,count
管理画面では「投稿 → カテゴリー」の一覧の「スラッグ」列で確認できます。カテゴリー名を日本語で作ると、スラッグも日本語になり、URL では %e3%81%8a... のようにエンコードされます。手入力したリンクや、あとからスラッグを変えたカテゴリーへの古いリンクは 404 になります。
3. カテゴリーベースを確認する
「設定 → パーマリンク」の「オプション」にある「カテゴリーベース」は、カテゴリーの URL の前に付く部分です。空欄なら category が使われ、https://example.com/category/news/ になります。
ここを topics などに変えると、URL は https://example.com/topics/news/ に変わり、それまでの /category/news/ は 404 になります。外部からのリンクや検索結果がある場合は、変更前の URL から新しい URL へのリダイレクトを用意します。
カテゴリーベースを URL から消すプラグインを使っている場合は、固定ページや投稿のスラッグとカテゴリーのスラッグが重なると、どちらかが表示されなくなることがあります。プラグインを停止して症状が変わるか確かめます。
4. 2ページ目以降だけ404になる
カテゴリーページの何ページ目まで存在するかは、メインクエリの件数で決まります。テーマのテンプレートで new WP_Query() や query_posts() を使って別の件数で表示していると、メインクエリでは存在しないページ番号になり、2ページ目以降が 404 になります。
カテゴリーページの表示件数を変えるときは、テンプレートの中で別のクエリを作らずに、pre_get_posts でメインクエリの件数を変えます。
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_category() ) {
$query->set( 'posts_per_page', 12 );
}
} );
このコードは、子テーマの functions.php か、独自のプラグインに書きます。詳しくはpre_get_postsでページ送りが404になるときの直し方も参照してください。
5. 投稿のステータスとカテゴリーの割り当てを確認する
ページは表示されるのに投稿が出ない場合は、そのカテゴリーに公開済みの投稿があるかを確認します。--category_name にはカテゴリー名ではなくスラッグを指定します。
wp post list --category_name=news --post_status=any --fields=ID,post_title,post_status,post_date
post_status が draft(下書き)、pending(レビュー待ち)、future(予約済み)の投稿は、カテゴリーページに表示されません。private(非公開)の投稿は、閲覧権限のあるログイン中のユーザーにしか表示されません。
6. pre_get_postsとカスタム投稿タイプを確認する
カスタマイズがカテゴリーページに影響していないか
テーマやプラグインが pre_get_posts でメインクエリを書き換えていると、条件の付け方しだいでカテゴリーページにも影響します。次のように、条件を付けずに投稿タイプなどを変えるコードは問題になります。
// 問題のある例: すべてのメインクエリ(カテゴリーページ・管理画面も含む)に効いてしまう
add_action( 'pre_get_posts', function ( $query ) {
if ( $query->is_main_query() ) {
$query->set( 'post_type', array( 'post', 'product' ) );
}
} );
is_admin() で管理画面を除き、is_home()(投稿一覧のトップ)や is_category() など、対象のページを条件で限定します。どのコードが原因か分からないときは、テーマを標準のテーマ(Twenty Twenty-Five など)に一時的に切り替えたり、プラグインを停止したりして、症状が変わるかを見ます。本番サイトではなく、ステージング環境で試してください。
カスタム投稿タイプの投稿は既定では出ない
カテゴリーのアーカイブは、投稿タイプを指定しない限り、通常の投稿(post)だけを表示します。カスタム投稿タイプに「カテゴリー」を使えるようにしても、その投稿は既定ではカテゴリーページに出ません。表示したい場合は、メインクエリに投稿タイプを加えます(例の news は自分の投稿タイプ名に置き換えます)。
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_category() ) {
$query->set( 'post_type', array( 'post', 'news' ) );
}
} );
カスタム投稿タイプ側でカテゴリーを使うには、register_post_type() の taxonomies に category を入れるか、register_taxonomy_for_object_type( 'category', 'news' ) を呼びます。
exclude_from_search の影響
register_post_type() の exclude_from_search を true にすると、その投稿タイプはサイト内検索の結果に出なくなります。これに加えて、カスタムタクソノミー(独自に登録した分類)のアーカイブで投稿タイプを指定していない場合、WordPress は exclude_from_search が false の投稿タイプだけを対象にするため、その投稿タイプはタクソノミーのページにも出なくなります。
カテゴリーとタグのアーカイブは、上のとおり既定では post だけを表示するので、この設定の影響は受けません。カスタム投稿タイプをカテゴリーページに出すには、上の pre_get_posts で投稿タイプを指定します。
7. テンプレートの適用順を確認する
カテゴリーページの見た目が意図したものにならない場合は、どのテンプレートが使われているかを確認します。クラシックテーマでは、次の順に探して、最初に見つかったファイルを使います。
category-{スラッグ}.php(例: スラッグがnewsならcategory-news.php)category-{ID}.php(例: ID が 5 ならcategory-5.php)category.phparchive.phpindex.php
ブロックテーマでは、同じ順で templates/ フォルダーの HTML ファイル(category-news.html、category-5.html、category.html、archive.html、index.html)を探します。サイトエディター(「外観 → エディター → テンプレート」)で編集したテンプレートは、テーマのファイルより優先されます。
category-news.php を作ったのに反映されない場合は、ファイル名のスラッグが実際のスラッグと一致しているか、子テーマを使っているなら有効なテーマのフォルダーに置いたかを確認します。