0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「WordPress」ページごとにIPアドレスによるアクセス制限をかける(IPv6・IPv4両対応)

0
Last updated at Posted at 2025-12-18

はじめに

先日の投稿にてリモート端末のIPv4/IPv6アドレス両方を取れる方法を検討しました。

今回はいよいよWPへの実装を想定してバイブコーディングを行いました。

  • $_SERVER["REMOTE_ADDR"]の代わりにIPアドレス判定を行うようにする。
  • functions.phpの編集は初回のみとして以降はWP管理画面での運用ができるようにした。
  • 使えるページスラッグは日本語(2バイト文字)と英数の両対応にした。

これら手法の代替手段を想定しています。

バイブコーディング

※Cline利用(GPT-5.2(GitHub Copilot)、Gemini3)

プロンプト(初回)はこちら

# WordPressのページごとにIPアドレスによるアクセス制限をかける(IPv6およびIPv4両対応カスタマイズ)

## 仕様

### 1. ユーザーは事前に固定ページ(ページスラッグ)「ip_allowed」で対象とするページ(投稿と固定の両方対応)と許可するIPアドレスの組を記入する。

  - 「対象とするページスラッグ => 許可するIPアドレス(配列)」で記入していく。
    - IPアドレスはカンマ区切りで複数指定でき、サブネットマスクも使用できる。
    - IPv6およびIPv4両方対応できる。
    - コメントアウトには「#」「//」「/* */」「」が利用できる。

 - 記載例
    ```
    /* ここはコメント内です。
       ここはコメント内です。*/
    # この行はコメントです。
    restricted-page-1 => 123.456.789.001,123.456.789.001/32
    
    restricted-page-2 => 2001:0db8:0000:0000:0000:0000:0000:0001
    // この行はコメントです。
    ```

### 2. 「ip_allowed」の本文から「対象とするページスラッグ => 許可するIPアドレス(配列)」を取得する。
  - ファイル名: `get_ip-and-slug_list.php`
  - 参考にするコード
    - [WordPress 固定ページの情報を取得して表示する ID/タイトル/本文](https://www.nowte.net/wordpress/wordpres-get-page-information/)


### 3. 「許可するIPアドレス」と、リモートアクセスしてきた端末のIPアドレスを比較する。
  - ファイル名: `ip-check.php`
  - 参考にするコード
    - [ip-check.php:サーバヘッダ・外部グローバルIP確認サイト・クライアントPOST値を統合してIPv4/IPv6を収集する](https://github.com/hiro-gj/mw-ip-denied/blob/main/mw-ip-denied-ip-check.php)

  - 「許可するIPアドレス」が合致する場合は、そのまま「対象とするページ」(スラッグ)の表示を許可する処理に移行する。
  - 「許可するIPアドレス」がIPv4しか記録されていない場合は、「ip-check.php」で同時に取得されたIPv6も同じく「対象とするページ」(スラッグ)の表示を許可する処理に移行する。(重要な機能)

### 4. 「許可するIPアドレス」と合致した場合は、「対象とするページ」(スラッグ)の表示を許可する。
### 5. 「許可するIPアドレス」と合致しない場合は、「ipblock」(スラッグ)の表示へリダイレクトする。


## 作成および修正してもらいたい内容
- 上記仕様を正確に満たすようにコーディングしてください。
  - 元の「function block_access_by_ip()」を修正して、`get_ip-and-slug_list.php`で取得した値を使えるようにして。
  - 元の「function block_access_by_ip()」を修正して、「$_SERVER["REMOTE_ADDR"]」を使わずに`ip-check.php`の結果に置きかえるようにして。
 - 書き換える「function block_access_by_ip()」は`function block_access_by_ip.php`として書き出して。


## 参考とするPHPコード
- [ip-check.php:サーバヘッダ・外部グローバルIP確認サイト・クライアントPOST値を統合してIPv4/IPv6を収集する](https://github.com/hiro-gj/mw-ip-denied/blob/main/mw-ip-denied-ip-check.php)

- [ページごとにIPアドレスによるアクセス制限をかける](https://enchord.jp/blog/ip-restriction-per-page/)
```


```

- [WordPress 固定ページの情報を取得して表示する ID/タイトル/本文](https://www.nowte.net/wordpress/wordpres-get-page-information/)
```
post_content;   //本文を表示

?>

```

以上

完成したコード

こちらに置いてあります。

総合テスト項目

(2026.1.7追記)協力会社さんに次のテストを実施いただき全ての項目でクリアしました。

使い方

(1)次のように配置する

./wp-content/themes/[テーマ名]/

  └ functions.php            ← 「functions.phpの最終行に追加貼付するコード.txt」を追加する

  └ get_ip-and-slug_list.php ← 配置

  └ ip-check.php             ← 配置

(2)固定ページ「ip_allowed」(非公開)を作成し
本文に次の様に「対象とするページスラッグ => 許可するIPアドレス」を書く

/*
* 対応コメント:
*   # 行コメント
*   // 行コメント
*   [ブロックコメント] 例: / * ... * /
*   <!-- HTMLコメント -->
*/
restricted-page-1 => 203.0.113.10,203.0.113.10/32
restricted-page-2 => 2001:db8::1,2001:db8::/64
  • WP固定ページ「ip_allowed」の様子
    WP固定ページ「ip_allowed」.png

  • WP固定ページ一覧
    WP固定ページ一覧.png

  • 許可されていないIPv4/IPv6アクセス時の「ipblock」(404)への遷移
    「ipblock」(404)への遷移.avif

最後に

  • 動作の不具合がありましたら是非改修をお願いします!
  • できればプラグイン化も目指したいのでメンテナンス出来る方がおられたら是非お願いします!

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?