WordPressのパスワード保護ページをカスタマイズする方法

Cocoonカスタマイズ集
この記事は約11分で読めます。
記事内に広告が含まれています。

注意点:投稿を「非公開」にした際のWordPressメニューの挙動

メニュー

外観→メニューでメニューを作成する際、「ナビゲーションラベル」は手動で設定できるため、投稿タイトルを自由に変更することが可能です。
このナビゲーションラベルは、WordPressの仕様により実際の投稿タイトルとは独立しており、「保護中:」や「非公開:」などの投稿ステータスの接頭辞は自動的には付与されません。

そのため、「ナビゲーション」ウィジェット、グローバルメニュー、フッターメニューなどに表示されるタイトルには、これらの接頭辞は表示されない仕様となっています。

「ナビゲーションラベル」にステータスを追加する方法

「ナビカード」ウィジェットも同様で、ナビゲーションラベルとして設定された文字列がそのまま表示されるため、投稿ステータスに応じた接頭辞は含まれません。

そこで、投稿ステータスに応じた接頭辞をナビゲーションラベルに「保護中:」や「非公開:」を自動的で付けるようにします。

非公開投稿の扱いについて

  • 新規追加
    非公開の投稿は選択リストに表示されないため、メニューに追加できません。
  • 標準仕様の挙動
    メニュー追加済みの投稿を後から「非公開」にしても項目自体は削除されず、アクセスすると404エラーになります。

完成イメージ

実装手順

以下のコードを functions.phpに追加します。

add_filter('wp_setup_nav_menu_item', function ($menu_item) {
  if ($menu_item->type !== 'post_type' || empty($menu_item->object_id)) {
    return $menu_item;
  }

  $post = get_post($menu_item->object_id);
  if ($post) {
    $title = $post->post_title;

    // パスワード保護・非公開の場合はタイトルに状態を付加
    if (!empty($post->post_password)) {
      $title = '保護中: ' . $title;
    } elseif ($post->post_status === 'private') {
      $title = '非公開: ' . $title;
    }

    $menu_item->title = $title;
  }

  return $menu_item;
});

非公開のメニュー項目を非表示にする方法

通常、WordPressで一度メニューに追加した投稿を「非公開」に変更しても、メニュー項目自体は自動で消えず残ってしまい、アクセスすると404エラーになってしまいます。

そこで、投稿を「非公開」にした際、一般の閲覧者に対してのみメニュー項目を自動で非表示にします。

実装手順

以下のコードをfunctions.phpに追加します。

add_filter('wp_get_nav_menu_items', function ($items) {
  if (is_admin()) {
    return $items;
  }

  return array_filter($items, function ($item) {
    if ($item->type !== 'post_type' || empty($item->object_id)) {
      return true;
    }

    $post = get_post($item->object_id);

    if (!$post) {
      return true;
    }

    // 閲覧権限のない非公開投稿を除外
    if ($post->post_status === 'private' && !current_user_can('read_post', $post->ID)) {
      return false;
    }

    return true;
  });
});

さいごに

今回紹介した方法を使えば、パスワード保護機能をより柔軟にカスタマイズできるようになります。
フォームのデザインを統一したり、クッキーの有効期限を最適化することで、訪問者にとっても管理者にとっても使いやすいサイト運用が実現できます。

タイトルとURLをコピーしました