PHPackages                             arraypress/wp-ip-utils - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Validation &amp; Sanitization](/categories/validation)
4. /
5. arraypress/wp-ip-utils

ActiveLibrary[Validation &amp; Sanitization](/categories/validation)

arraypress/wp-ip-utils
======================

A lean WordPress utility for IP address validation, CIDR operations, and GDPR-compliant anonymization

027PHP

Since Dec 15Pushed 5mo agoCompare

[ Source](https://github.com/arraypress/wp-ip-utils)[ Packagist](https://packagist.org/packages/arraypress/wp-ip-utils)[ RSS](/packages/arraypress-wp-ip-utils/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

WordPress IP Utilities
======================

[](#wordpress-ip-utilities)

A lean WordPress utility for IP address validation, CIDR operations, and GDPR-compliant anonymization. Built for real-world plugin development with just the features you actually need.

Features
--------

[](#features)

- 🎯 **Focused API** - Just 18 essential methods for IP operations
- 🔒 **Privacy Ready** - Built-in anonymization for GDPR compliance
- 🌐 **Full Support** - IPv4 and IPv6 validation and operations
- 📡 **Smart Detection** - Handles proxies, CDNs, and Cloudflare
- 🚫 **Security Features** - CIDR range checking for IP blocking/allowing
- 📦 **Bulk Operations** - Efficient processing of multiple IPs
- 🪶 **Lightweight** - No dependencies, no bloat

Requirements
------------

[](#requirements)

- PHP 7.4 or later
- WordPress 5.0 or later

Installation
------------

[](#installation)

```
composer require arraypress/wp-utils-ip
```

Usage
-----

[](#usage)

### Getting User IP

[](#getting-user-ip)

```
use ArrayPress\IPUtils\IP;

// Get current user's IP (handles proxies/CDNs)
$user_ip = IP::get();
// Returns: "203.0.113.42"

// Get anonymized user IP for privacy compliance
$anonymous_ip = IP::get_anonymous();
// Returns: "203.0.113.0"

// Using global function
$user_ip = get_user_ip();
```

### IP Validation

[](#ip-validation)

```
use ArrayPress\IPUtils\IP;

// Validate any IP
if ( IP::is_valid( '192.168.1.100' ) ) {
    // Valid IP address
}

// Check specific versions
$is_ipv4 = IP::is_valid_ipv4( '192.168.1.100' ); // true
$is_ipv6 = IP::is_valid_ipv6( '2001:db8::1' );   // true

// Check if private/reserved
if ( IP::is_private( '192.168.1.1' ) ) {
    // Internal IP address
}
```

### GDPR Anonymization

[](#gdpr-anonymization)

```
use ArrayPress\IPUtils\IP;
use ArrayPress\IPUtils\IPs;

// Single IP anonymization
$anonymous = IP::anonymize( '192.168.1.100' );
// Returns: "192.168.1.0"

// Bulk anonymization
$ips = ['192.168.1.100', '10.0.0.50', '8.8.8.8'];
$anonymous_ips = IPs::anonymize( $ips );
// Returns: ['192.168.1.0', '10.0.0.0', '8.8.8.0']

// Using global function
$anonymous = anonymize_ip( '192.168.1.100' );
```

### IP Blocking/Allowing (CIDR)

[](#ip-blockingallowing-cidr)

```
use ArrayPress\IPUtils\IP;

// Check if IP is in a specific range
if ( IP::is_in_range( '192.168.1.100', '192.168.1.0/24' ) ) {
    // IP is in the subnet
}

// Check against multiple ranges (blocklist/allowlist)
$blocked_ranges = [
    '192.168.1.0/24',  // Internal network
    '10.0.0.0/8',      // Private range
    '203.0.113.5'      // Specific IP
];

if ( IP::is_match( $user_ip, $blocked_ranges ) ) {
    wp_die( 'Access denied from your IP address' );
}

// Validate CIDR format
if ( IP::is_valid_range( '192.168.1.0/24' ) ) {
    // Valid CIDR notation
}
```

### Bulk IP Operations

[](#bulk-ip-operations)

```
use ArrayPress\IPUtils\IPs;

$ip_list = [
    '192.168.1.100',
    'invalid-ip',
    '2001:db8::1',
    '10.0.0.50',
    '192.168.1.100'  // Duplicate
];

// Get only valid IPs
$valid = IPs::filter( $ip_list );
// Returns: ['192.168.1.100', '2001:db8::1', '10.0.0.50', '192.168.1.100']

// Remove duplicates
$unique = IPs::remove_duplicates( $ip_list );
// Returns: ['192.168.1.100', '2001:db8::1', '10.0.0.50']

// Get only IPv4 addresses
$ipv4_only = IPs::filter_ipv4( $ip_list );
// Returns: ['192.168.1.100', '10.0.0.50']

// Filter by CIDR range
$office_ips = IPs::filter_by_range( $ip_list, '192.168.1.0/24' );
// Returns: ['192.168.1.100']
```

Common Use Cases
----------------

[](#common-use-cases)

### GDPR-Compliant Logging

[](#gdpr-compliant-logging)

```
function log_user_activity( $action ) {
    $ip = IP::get_anonymous(); // Already anonymized

    $log_entry = [
        'action'    => $action,
        'ip'        => $ip,
        'timestamp' => current_time( 'mysql' )
    ];

    // Safe to store - no personal data
    add_option( 'activity_log', $log_entry );
}
```

### Admin Access Control

[](#admin-access-control)

```
function restrict_admin_access() {
    $allowed_ips = [
        '192.168.1.0/24',  // Office network
        '10.8.0.0/16',     // VPN range
        '203.0.113.5'      // CEO's home IP
    ];

    $user_ip = IP::get();

    if ( ! IP::is_match( $user_ip, $allowed_ips ) ) {
        wp_die( 'Admin access restricted to authorized IPs only.' );
    }
}
add_action( 'admin_init', 'restrict_admin_access' );
```

### Rate Limiting

[](#rate-limiting)

```
function check_rate_limit() {
    $ip = IP::get();

    if ( ! $ip ) {
        return false; // Can't rate limit without IP
    }

    $key = 'rate_limit_' . md5( $ip );
    $attempts = get_transient( $key );

    if ( $attempts && $attempts > 10 ) {
        wp_die( 'Rate limit exceeded. Please try again later.' );
    }

    set_transient( $key, $attempts + 1, HOUR_IN_SECONDS );
}
```

### Geo-Blocking

[](#geo-blocking)

```
function block_countries() {
    $blocked_ranges = [
        '1.0.0.0/8',      // Example range
        '2.0.0.0/7',      // Example range
        '5.0.0.0/8'       // Example range
    ];

    $user_ip = IP::get();

    if ( IP::is_match( $user_ip, $blocked_ranges ) ) {
        wp_die( 'Service not available in your region.' );
    }
}
```

### Clean IP List

[](#clean-ip-list)

```
function process_ip_whitelist( $raw_ips ) {
    // Validate all IPs
    $valid = IPs::filter( $raw_ips );

    // Remove any duplicates
    $unique = IPs::remove_duplicates( $valid );

    // Ensure they're public IPs only
    $public = array_filter( $unique, function( $ip ) {
        return ! IP::is_private( $ip );
    });

    return $public;
}
```

API Reference
-------------

[](#api-reference)

### IP Class (Single IP Operations)

[](#ip-class-single-ip-operations)

MethodDescription`get()`Get current user's IP address`get_anonymous()`Get anonymized user IP`is_valid( $ip )`Validate IP address`is_valid_ipv4( $ip )`Check if valid IPv4`is_valid_ipv6( $ip )`Check if valid IPv6`is_private( $ip )`Check if private/reserved`is_valid_range( $range )`Validate CIDR notation`is_in_range( $ip, $range )`Check if IP in CIDR range`is_match( $ip, $list )`Check IP against list`anonymize( $ip )`Anonymize IP for GDPR### IPs Class (Multiple IP Operations)

[](#ips-class-multiple-ip-operations)

MethodDescription`validate( $ips )`Validate multiple IPs`filter( $ips )`Get only valid IPs`anonymize( $ips )`Bulk anonymize`remove_duplicates( $ips )`Remove duplicate IPs`filter_ipv4( $ips )`Get only IPv4`filter_ipv6( $ips )`Get only IPv6`filter_by_range( $ips, $range )`Filter by CIDR`filter_by_ranges( $ips, $ranges )`Filter by multiple CIDRs### Global Functions

[](#global-functions)

```
get_user_ip()        // Get current user's IP
anonymize_ip( $ip )  // Anonymize an IP address
```

Why This Library?
-----------------

[](#why-this-library)

- **Lean &amp; Focused** - Just 18 methods that you'll actually use
- **Real-World Ready** - Built for common WordPress plugin needs
- **Privacy First** - GDPR compliance built in
- **No Bloat** - No academic network calculations or edge cases
- **Clean API** - Separate classes for single vs. multiple operations

License
-------

[](#license)

GPL-2.0-or-later

Support
-------

[](#support)

- [Documentation](https://github.com/arraypress/wp-utils-ip)
- [Issue Tracker](https://github.com/arraypress/wp-utils-ip/issues)

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance50

Moderate activity, may be stable

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd6eb8aff0903d87eb674d1ba3c5f3653899c0d7661504eb0deb7798ed86b643?d=identicon)[arraypress](/maintainers/arraypress)

---

Top Contributors

[![arraypress](https://avatars.githubusercontent.com/u/22668877?v=4)](https://github.com/arraypress "arraypress (10 commits)")

### Embed Badge

![Health badge](/badges/arraypress-wp-ip-utils/health.svg)

```
[![Health](https://phpackages.com/badges/arraypress-wp-ip-utils/health.svg)](https://phpackages.com/packages/arraypress-wp-ip-utils)
```

###  Alternatives

[webmozart/assert

Assertions to validate method input/output with nice error messages.

7.6k894.0M1.2k](/packages/webmozart-assert)[bensampo/laravel-enum

Simple, extensible and powerful enumeration implementation for Laravel.

2.0k15.9M104](/packages/bensampo-laravel-enum)[swaggest/json-schema

High definition PHP structures with JSON-schema based validation

48612.5M73](/packages/swaggest-json-schema)[stevebauman/purify

An HTML Purifier / Sanitizer for Laravel

5325.6M19](/packages/stevebauman-purify)[ashallendesign/laravel-config-validator

A package for validating your Laravel app's config.

217905.3k5](/packages/ashallendesign-laravel-config-validator)[crazybooot/base64-validation

Laravel validators for base64 encoded files

1341.9M8](/packages/crazybooot-base64-validation)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
