コンテンツにスキップ

カスタム投稿タイプの詳細ページで 404 エラーが出る問題と解決方法

メインイメージ

WordPress でカスタム投稿タイプの詳細ページで 404 エラーが出てしまう問題について解説します。

原因と解決策

原因はいくつか考えられます。 原因によって解決策が異なるので順に説明します。

A. カスタム投稿タイプが適切に登録できていないパターン

カスタム投稿タイプの登録は関数 register_post_type() を使って行いますが、この関数が適切なタイミングで呼べていない、もしくは引数が適切にセットできていないと登録がうまくいきません。

以下のポイントを確認してください。

  • register_post_type() を呼び出す関数が init フックで呼ばれていること
  • カスタム投稿タイプが登録されていること
  • カスタム投稿タイプの public 設定が有効になっていること

正しく登録できる例:

// カスタム投稿タイプ「商品」を登録する
add_action( 'init', 'example_init' );

function example_init() {
  register_post_type( 'product', [
    'label' => '商品',
    'public => true,
  ] );
}

前提としてサイトのリライト設定が有効になっている必要がありますが、カスタム投稿タイプの登録が適切に行えているかどうかは実際に投稿を作成してその ID を使ってページへのアクセスを試みれば確認できます。

作成した投稿の ID を管理画面で確認したら、サイトのホームページ URL の末尾に ?p=123 という感じで投稿 ID をつけてページを開いてみてください。

https://example.com/?p=123

投稿タイプの登録が問題なくできていれば、上の product の例だと /product/<スラッグ>/ にリダイレクトされます。

B. カスタム投稿タイプ登録後にリライトルールが更新されていないパターン

A のポイントが問題ない場合、次に可能性が高い原因はリライトルールが更新できていないことです。 カスタム投稿タイプの URL (パーマリンク)が適切に機能するためにはリライトルールが最新の状態になっている必要があります。

リライトルールの更新はいくつかの方法で行えます。 やりやすい方法で行ってください。

更新方法 1) 管理画面でパーマリンクの設定を更新する

管理画面の「設定」 → 「パーマリンク設定」を開いて「変更を保存」ボタンをクリックします。

設定 → パーマリンク設定

既存の設定は変更する必要はありません。 ページを開いたらそのまま「変更を保存」ボタンをクリックするだけで OK です。

更新方法 2) WP-CLI を使う

WordPress のコマンドラインツールである WP-CLI の wp rewrite flush コマンドを使います。

wp rewrite flush

出力:

Success: Rewrite rules flushed.

ターミナルでの操作に慣れている方が作業する場合はこの方法が早くて確実です。

更新方法 3) プラグインの有効化・無効化時のフックを使う

カスタム投稿タイプの登録をプラグインで行っている場合は、プラグインが有効化されたときに自動的にリライトルールの更新がトリガーされるようにフックを登録します。 プラグインが無効化されたときにもリライトルールを更新するようにしておくと、プラグインが無効化されたらプラグイン有効化前の状態に自動的に戻ります。

この方法は公式リファレンスの register_post_type() のページ でも推奨されています。

// カスタム投稿タイプ「商品」を登録する
add_action( 'init', 'example_init' );

function example_init() {
  example_register_post_types();
}

// プラグインの有効化時に実行する
register_activation_hook( __FILE__, 'example_activation_hook' );

function example_activation_hook() {
  // カスタム投稿タイプを登録する必要あり:
  example_register_post_types();
  flush_rewrite_rules( false );
}

function example_register_post_types() {
  register_post_type( 'product', [
    'label' => '商品',
    'public' => true,
  ] );
}

// プラグインの無効化時に実行する
register_deactivation_hook( __FILE__, 'example_deactivation_hook' );

function example_deactivation_hook() {
  // カスタム投稿タイプの登録を削除する必要あり:
  unregister_post_type( 'product' );
  flush_rewrite_rules( false );
}

更新方法 4) functions.php を一時的に編集する

上の 1 〜 3 の方法がおすすめですが、それらが難しい場合はテーマの functions.php ファイルを利用する方法もあります。

  1. アクティブなテーマの functions.php に次の行を追加します

    flush_rewrite_rules( false );
    
  2. ブラウザで一度サイトにアクセスします

  3. 1 で追加した flush_rewrite_rules( false ); の行を削除します

flush_rewrite_rules() は毎リクエストで実行するには重たい処理で、一度だけ実行できたら十分なので、ブラウザに一度アクセスした後は追加行を削除するのを忘れないようにしてください。

C. プラグインやテーマが悪さをしている

上述の A と B のポイントでほとんどの場合は問題が解消すると思いますが、それでも解決しない場合はプラグインやテーマが悪さをしている可能性も考えられます。

特にキャッシュ系や SEO 系のプラグインは原因となる可能性が高いので、まずはそれらを疑うのがよいでしょう。 ひとつずつプラグインを無効化して問題が解消されるか確認してください。

テーマが怪しい場合は別のテーマに切り替えるなどして問題が解消されるか確認してみてください。


ということでカスタム投稿タイプの詳細ページで 404 エラーが出る問題と解決策の解説でした。