WordPress

カスタム投稿タイプのページが404エラーで表示されないときの対処法

  1. 最終更新日:
  2. 公開日:

WordPressでカスタム投稿タイプを設定してページを開いても、404エラーが表示されてしまうことがあります。他のカスタム投稿タイプは問題なく表示されているから、URLは正しいはず。そんなときの解決方法を解説します。

カスタム投稿タイプのページが404エラーで表示されないときの対処法

現象

WordPressを運用していて、あるタイミングでカスタム投稿タイプを追加することになりました。
もともとカスタム投稿タイプ「カスタムA」を設定していて、そこへ新しく「カスタムB」を追加する形です。

functions.phpへ設定を追記してサーバーへアップロード。
ここまでは順調。
新しいカスタム投稿タイプへ投稿を登録し、URLを開く。
しかし、404エラーで表示されません。
ページが存在しないことになっています。

おかしいと思い、もともとあったカスタムAを確認してみたら、こちらは正常に表示されます。
謎は深まるばかり。

解決方法と原因

functions.phpのどこでもいいので、次の2行を追記して実行したところ解決しました。

functions.php

global $wp_rewrite;
$wp_rewrite->flush_rules();

原因はWordPressがURL構造をデータベースに保持していて、こちらに追加したカスタム投稿タイプのURLが存在していないことでした。
そのため、上記の関数で一旦リセットする必要があったということです。

これで新しいカスタム投稿タイプを含めたURL構造が登録され、ページも正常に表示されるようになります。
なお、一度実行したら、上記のコードは削除しても大丈夫です。

今回はカスタム投稿タイプの設定がある流れでfunctions.phpからflush_rules関数を呼び出していますが、実は$wp_rewriteが呼び出せればどこでも構いません。
なので、header.phpfooter.phpでも大丈夫です。

解決までのプロセス

カスタム投稿タイプのページが表示されないので、おかしいと思って次の3点を確認しました。

  • カスタム投稿タイプの設定が正しいか確認
  • 他のカスタム投稿タイプは正常に表示されている(カスタムA)
  • カスタム投稿タイプと同じスラッグ名を他の場所で使用していないか

カスタム投稿タイプの設定が正しいか確認

まずは設定しているコードに問題がないか確認します。
今回はプラグインを使用せず、functions.phpから設定。
次のコードがカスタム投稿タイプの設定に該当します。

functions.php

// カスタム投稿タイプを登録する関数
function new_custom_post_type() {

  // もともと設定されていたカスタム投稿タイプ「カスタムA」
  register_post_type(
    'custom_a',
    array(
      'labels' => array(
        'name' => 'カスタムA',
        'singular_name' => 'カスタムA',
        'add_new' => '新規追加',
        'add_new_item' => '新規追加',
        'edit_item' => '投稿を編集',
        'new_item' => '新着情報',
        'all_items' => '投稿一覧',
        'view_item' => '投稿を見る',
        'search_items' => '検索する',
        'not_found' => '投稿が見つかりませんでした。',
        'not_found_in_trash' => 'ゴミ箱内に投稿が見つかりませんでした。'
      ),
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        'title',
        'editor',
        'thumbnail'
      ),
      'rewrite' => true,
      'taxonomies' => array('custom_a_cat')
    )
  );

  // 新しく設定したカスタム投稿タイプ「カスタムB」
  register_post_type(
    'custom_b',
    array(
      'labels' => array(
        'name' => 'カスタムB',
        'singular_name' => 'カスタムB',
        'add_new' => '新規追加',
        'add_new_item' => '新規追加',
        'edit_item' => '投稿を編集',
        'new_item' => '新着情報',
        'all_items' => '投稿一覧',
        'view_item' => '投稿を見る',
        'search_items' => '検索する',
        'not_found' => '投稿が見つかりませんでした。',
        'not_found_in_trash' => 'ゴミ箱内に投稿が見つかりませんでした。'
      ),
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => array(
        'title',
        'editor',
        'thumbnail',
        'excerpt',
      ),
      'rewrite' => true,
      'taxonomies' => array('custom_b_cat')
    )
  );

  $labels = array(
    'name'                => 'カテゴリー',
    'singular_name'       => 'カテゴリー',
    'search_items'        => 'カテゴリー検索',
    'all_items'           => '全てのカテゴリー',
    'parent_item'         => '親カテゴリー',
    'parent_item_colon'   => '親カテゴリー:',
    'edit_item'           => 'カテゴリーを編集',
    'update_item'         => 'カテゴリーを更新',
    'add_new_item'        => 'カテゴリーを追加',
    'new_item_name'       => '新規カテゴリー',
    'menu_name'           => 'カテゴリー'
  );
  $args = array(
    'hierarchical'        => true,
    'labels'              => $labels,
  );
  register_taxonomy( 'custom_a_cat', 'custom_a', $args );
  register_taxonomy( 'custom_b_cat', 'custom_b', $args );
}
add_action( 'init', 'new_custom_post_type');

こちらのコードでは2つのカスタム投稿タイプを設定していますが、新しく追加した「カスタムB」は「カスタムA」を複製し、ラベルなどを書き換えたものになります。

他のカスタム投稿タイプは正常に表示されている(カスタムA)

次に、カスタムAが表示されているかを確認します。
表示は正常。なので、上記の設定コードは正常に動作するはず、ということになります。

カスタム投稿タイプと同じスラッグ名を他の場所で使用していないか

他の場所で同じスラッグ名を使っている可能性も考え、年のためチェックしました。
主に通常投稿のカテゴリーや固定ページのURLを確認しましたが、重複はなく問題なさそうです。

上記3点に問題がないということは、パーマリンクがどこかにキャッシュ(一時的に記憶)されている可能性を考えました。
そこで検索をしてみたら、WordPressCodexの「WP_Rewrite」ページへ辿り着きます。

こちらの「WP_Rewriteの役割」を読むと、「内部的にはリライトルールを更新するためや、特定の投稿やページ、カテゴリーアーカイブなどのURLを特定するためなどに使われています。」とあります。
そこで関数(メソッド)を見ていたら、上記のflush_rewrites関数を見つけたのでした。
実行してみたら、確かに解決。

以上が問題解決までの流れでした。

記事一覧