arraypress / wp-anonymize-utils
A lean WordPress library for anonymizing sensitive data types including emails, personal info, IPs, and financial data
dev-main
2025-07-05 19:55 UTC
Requires
- php: >=7.4
This package is auto-updated.
Last update: 2025-09-02 10:03:49 UTC
README
A lightweight WordPress library for anonymizing sensitive data types including emails, personal information, IP addresses, and financial data. Perfect for GDPR compliance, privacy protection, and maintaining database integrity during anonymization.
Features
- π GDPR Compliant: Placeholder emails maintain database integrity while ensuring compliance
- π§ Email Anonymization: Handles complex domains (.co.uk, .museum, subdomains)
- π IP Support: Full IPv4 and IPv6 anonymization with network preservation
- π€ Personal Data: Names, phones, addresses, dates with structure preservation
- π³ Financial Data: Credit cards, bank accounts, tax IDs for e-commerce sites
- π WordPress Integration: User data, comments, and meta fields
- π Unicode Support: International names, addresses, and characters
- β‘ Lean & Fast: Only essential methods, no bloat
- β Validation: Centralized anonymization detection
Requirements
- PHP 7.4 or later
- WordPress 5.0 or later
Installation
composer require arraypress/wp-anonymize-utils
Basic Usage
Email Anonymization
use ArrayPress\AnonymizeUtils\Email; // Basic anonymization $anonymized = Email::anonymize( 'john.doe@example.com' ); // Returns: "jo*****@ex*****.com" // Works with complex domains $complex = Email::anonymize( 'user@subdomain.example.co.uk' ); // Returns: "us***@su*******.example.co.uk" // Mask for display (preserve domain) $masked = Email::mask( 'john@example.com', 1, 1 ); // Returns: "j**n@example.com" // GDPR-compliant placeholder $placeholder = Email::placeholder( 'user@example.com' ); // Returns: "deleted@site.invalid" // Check if already anonymized if ( Email::is_anonymized( 'jo***@ex*****.com' ) ) { // Already anonymized } // Anonymize multiple emails $emails = [ 'user1@example.com', 'user2@test.org' ]; $anonymized = Email::anonymize_multiple( $emails ); // Returns: ["us***@ex*****.com", "us***@te**.org"]
Personal Data Anonymization
use ArrayPress\AnonymizeUtils\Personal; // Anonymize names (preserves structure) $name = Personal::name( 'John Smith' ); // Returns: "J**n S***h" // Works with international names $international = Personal::name( 'JosΓ© MarΓa' ); // Returns: "J**Γ© M***a" // Anonymize phone numbers $phone = Personal::phone( '555-123-4567' ); // Returns: "******4567" // International phone formats $intl_phone = Personal::phone( '+44 20 7946 0958' ); // Returns: "*******0958" // Anonymize addresses $address = Personal::address( '123 Main Street' ); // Returns: "*** **** ******" // Multi-line addresses $full_address = Personal::address( "123 Main St\nApt 4B" ); // Returns: "*** **** **\n*** **" // Anonymize dates (preserve month/year) $date = Personal::date( '1990-05-15' ); // Returns: "1990-05-**" // Anonymize postal codes $zip = Personal::zipcode( '90210' ); // Returns: "**210" // Anonymize any text $text = Personal::text( 'Sensitive information' ); // Returns: "********* ***********" // Bulk anonymization $data = [ 'name' => 'John Smith', 'phone' => '555-1234', 'address' => '123 Main St' ]; $anonymized = Personal::anonymize_multiple( $data ); // Returns: ['name' => 'J**n S***h', 'phone' => '****1234', ...]
IP Address Anonymization
use ArrayPress\AnonymizeUtils\IP; // IPv4 anonymization $ipv4 = IP::anonymize( '192.168.1.100' ); // Returns: "192.168.1.0" // IPv6 anonymization $ipv6 = IP::anonymize( '2001:db8:85a3::8a2e:370:7334' ); // Returns: "2001:db8:85a3::8a2e:370:0" // IPv6 localhost $localhost = IP::anonymize( '::1' ); // Returns: "::0" // Mask instead of zero $masked_ip = IP::mask_last_octet( '192.168.1.100' ); // Returns: "192.168.1.***" // Check if anonymized if ( IP::is_anonymized( '192.168.1.0' ) ) { // Already anonymized } // Get current user's anonymized IP $user_ip = IP::get_user_anonymized(); // Returns: "192.168.1.0" (or null if unavailable) // Anonymize multiple IPs $ips = [ '192.168.1.100', '10.0.0.50' ]; $anonymized = IP::anonymize_multiple( $ips ); // Returns: ["192.168.1.0", "10.0.0.0"]
Financial Data Anonymization
use ArrayPress\AnonymizeUtils\Financial; // Credit card numbers $card = Financial::credit_card( '4532-1234-5678-9012' ); // Returns: "************9012" // Bank account numbers $account = Financial::bank_account( '123456789012' ); // Returns: "********9012" // Tax ID numbers $tax_id = Financial::tax_id( '12-3456789' ); // Returns: "******6789" // Custom keep length $card_custom = Financial::credit_card( '4532123456789012', 6 ); // Returns: "**********789012" // Check if anonymized if ( Financial::is_anonymized( '************9012' ) ) { // Already anonymized } // Bulk financial anonymization $financial_data = [ 'card' => '4532123456789012', 'account' => '123456789', 'tax_id' => '12-3456789' ]; $anonymized = Financial::anonymize_multiple( $financial_data ); // Auto-detects types based on field names
Web Data Anonymization
use ArrayPress\AnonymizeUtils\Web; // Anonymize URLs (preserve domain) $url = Web::url( 'https://example.com/user/profile?id=123' ); // Returns: "https://example.com/****/*******/***" // User agent simplification $ua = Web::user_agent( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0' ); // Returns: "Chrome on Windows" // Check if URL is anonymized if ( Web::is_url_anonymized( 'https://example.com/****/profile' ) ) { // Already anonymized } // Check if user agent is anonymized if ( Web::is_user_agent_anonymized( 'Chrome on Windows' ) ) { // Already anonymized } // Bulk web data anonymization $web_data = [ 'url' => 'https://example.com/user/123', 'user_agent' => 'Mozilla/5.0...', 'referrer' => 'https://google.com/search?q=example' ]; $anonymized = Web::anonymize_multiple( $web_data );
WordPress Integration
User Data Anonymization
use ArrayPress\AnonymizeUtils\User; // Anonymize WordPress user $success = User::anonymize_data( 123 ); // Anonymizes: email, name, nicename, url, display_name // Anonymize specific fields only $success = User::anonymize_data( 123, [ 'user_email', 'first_name' ] ); // Anonymize user meta data $success = User::anonymize_meta( 123 ); // Anonymizes: billing info, shipping info, etc. // Anonymize specific meta keys $success = User::anonymize_meta( 123, [ 'billing_email', 'billing_phone' ] ); // Check if user is anonymized if ( User::is_anonymized( 123 ) ) { // User is already anonymized } // Bulk anonymize users $user_ids = [ 123, 456, 789 ]; $results = User::bulk_anonymize( $user_ids ); // Returns: [123 => true, 456 => true, 789 => false] // Get anonymized export data $export_data = User::get_anonymized_export( 123 );
Comment Data Anonymization
use ArrayPress\AnonymizeUtils\Comment; // Anonymize WordPress comment $success = Comment::anonymize_data( 456 ); // Anonymizes: author name, email, URL, IP address // Check if comment is anonymized if ( Comment::is_anonymized( 456 ) ) { // Comment is already anonymized } // Bulk anonymize comments $comment_ids = [ 123, 456, 789 ]; $results = Comment::bulk_anonymize( $comment_ids ); // Anonymize all comments for a post $results = Comment::anonymize_by_post( 789 ); // Get anonymized export data $export_data = Comment::get_anonymized_export( 456 );
Validation and Detection
Universal Validation
use ArrayPress\AnonymizeUtils\Validate; // Check if any data is anonymized if ( Validate::is_anonymized( $some_data ) ) { // Data is anonymized } // Works with any data type Validate::is_anonymized( 'jo***@example.com' ); // true Validate::is_anonymized( '192.168.1.0' ); // true Validate::is_anonymized( 'J**n S***h' ); // true Validate::is_anonymized( '************1234' ); // true Validate::is_anonymized( 'Chrome on Windows' ); // true // WordPress-specific validation if ( Validate::is_user_anonymized( 123 ) ) { // WordPress user is anonymized } if ( Validate::is_comment_anonymized( 456 ) ) { // WordPress comment is anonymized }
Convenience Methods
// Each class has its own is_anonymized() method for convenience Email::is_anonymized( $email ); IP::is_anonymized( $ip ); Financial::is_anonymized( $card_number ); User::is_anonymized( $user_id ); Comment::is_anonymized( $comment_id ); // All delegate to the centralized Validate class
Advanced Examples
GDPR Data Export Anonymization
// Anonymize exported user data $user_data = get_userdata( 123 ); $anonymized_export = [ 'email' => Email::placeholder( $user_data->user_email ), 'name' => Personal::name( $user_data->display_name ), 'ip' => IP::anonymize( $user_data->last_login_ip ), 'address' => Personal::address( $user_data->billing_address ) ];
Contact Form Anonymization
// Anonymize contact form submissions function anonymize_contact_form( $submission_data ) { return [ 'name' => Personal::name( $submission_data['name'] ), 'email' => Email::placeholder( $submission_data['email'] ), 'phone' => Personal::phone( $submission_data['phone'] ), 'message' => Personal::text( $submission_data['message'] ), 'ip' => IP::anonymize( $submission_data['ip'] ) ]; }
Analytics Data Anonymization
// Anonymize analytics while preserving structure function anonymize_analytics( $analytics_data ) { return [ 'user_ip' => IP::anonymize( $analytics_data['ip'] ), 'user_agent' => Web::user_agent( $analytics_data['user_agent'] ), 'referrer' => Web::url( $analytics_data['referrer'] ), 'page_url' => Web::url( $analytics_data['page_url'] ) ]; }
Bulk Data Processing
// Process large datasets with validation function process_user_data( $user_ids ) { $results = []; foreach ( $user_ids as $user_id ) { // Skip if already anonymized if ( User::is_anonymized( $user_id ) ) { $results[ $user_id ] = 'already_anonymized'; continue; } // Anonymize user data and meta $success = User::anonymize_data( $user_id ) && User::anonymize_meta( $user_id ); $results[ $user_id ] = $success ? 'success' : 'failed'; } return $results; }
Key Features
- GDPR Compliant: Maintains database integrity with placeholder values
- Complex Domain Support: Handles .co.uk, .museum, subdomains perfectly
- Full IP Support: IPv4, IPv6, all formats with network preservation
- Unicode Ready: International names, addresses, characters
- WordPress Integration: Users, comments, meta data
- Financial Data: Credit cards, bank accounts for e-commerce
- Flexible Methods: Multiple anonymization approaches per data type
- Centralized Validation: Universal anonymization detection
- Lean Codebase: Only essential functionality, no bloat
Best Practices
- Check before anonymizing:
if ( ! Email::is_anonymized( $email ) ) { $email = Email::anonymize( $email ); }
- Use placeholders for GDPR compliance:
// Good: Maintains referential integrity Email::placeholder( $email ); // Avoid: Breaks database relationships // delete_user_meta( $user_id, 'email' );
- Use appropriate anonymization level:
// For display: partial masking Email::mask( $email, 2, 2 ); // For storage: full anonymization Email::anonymize( $email ); // For deletion: placeholder Email::placeholder( $email );
- Leverage centralized validation:
// Universal validation works for any data type if ( Validate::is_anonymized( $data ) ) { // Already processed }
Requirements
- PHP 7.4+
- WordPress 5.0+
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the GPL-2.0-or-later License.