{"id":29651263,"url":"https://github.com/arraypress/wp-sanitize-utils","last_synced_at":"2025-07-22T05:06:29.453Z","repository":{"id":304351837,"uuid":"1014433330","full_name":"arraypress/wp-sanitize-utils","owner":"arraypress","description":"A lean WordPress library for sanitization and validation utilities.","archived":false,"fork":false,"pushed_at":"2025-07-16T13:26:39.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-22T05:06:28.648Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arraypress.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-05T18:03:25.000Z","updated_at":"2025-07-16T13:27:52.000Z","dependencies_parsed_at":"2025-07-12T15:31:50.765Z","dependency_job_id":"dc70cdf1-24dd-4dfe-aec3-7651e6ada650","html_url":"https://github.com/arraypress/wp-sanitize-utils","commit_stats":null,"previous_names":["arraypress/wp-clean-utils","arraypress/wp-sanitize-utils"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/arraypress/wp-sanitize-utils","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arraypress%2Fwp-sanitize-utils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arraypress%2Fwp-sanitize-utils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arraypress%2Fwp-sanitize-utils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arraypress%2Fwp-sanitize-utils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arraypress","download_url":"https://codeload.github.com/arraypress/wp-sanitize-utils/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arraypress%2Fwp-sanitize-utils/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266430670,"owners_count":23927169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-22T05:06:28.475Z","updated_at":"2025-07-22T05:06:29.414Z","avatar_url":"https://github.com/arraypress.png","language":"PHP","readme":"# WordPress Clean Utils\n\nA lean WordPress library for sanitization and validation utilities. Provides essential tools for cleaning user input and validating data with WordPress integration.\n\n## Installation\n\n```bash\ncomposer require arraypress/wp-clean-utils\n```\n\n## Quick Start\n\n```php\nuse ArrayPress\\CleanUtils\\Sanitize;\nuse ArrayPress\\CleanUtils\\Validate;\n\n// Sanitization\n$clean_email  = Sanitize::email( ' USER@EXAMPLE.COM ' );    // \"user@example.com\"\n$clean_amount = Sanitize::amount( '$1,234.56' );           // \"1234.56\"\n$safe_html    = Sanitize::html( '\u003cp\u003eSafe content\u003c/p\u003e' );      // Allows safe HTML\n\n// Validation\n$is_valid_email = Validate::email( 'user@example.com' );   // true\n$is_in_range    = Validate::range( 15, 10, 20 );             // true\n$missing_fields = Validate::required_fields( $data, [ 'name', 'email' ] ); // []\n```\n\n## Sanitize Class\n\n### Core Sanitization\n```php\n// Basic text cleaning\nSanitize::text( '  Hello World!  ' );          // \"Hello World!\"\nSanitize::clean( $dirty_data );                // Recursively clean arrays\nSanitize::email( ' USER@EXAMPLE.COM ' );       // \"user@example.com\"\nSanitize::url( 'https://example.com/path' );   // Clean URL\nSanitize::html( '\u003cp\u003eContent\u003c/p\u003e\u003cscript\u003e' );    // Safe HTML only\n\n// WordPress-specific\nSanitize::slug( 'Product Name Here' );         // \"product-name-here\"\nSanitize::username( 'User.Name!' );            // \"user.name\"\nSanitize::key( 'my-option_key' );              // \"my-option_key\"\n```\n\n### Specialized Sanitization\n```php\n// Numbers and amounts\nSanitize::int( '123.45' );                     // 123\nSanitize::float( '123.45' );                   // 123.45\nSanitize::amount( '$1,234.56' );               // \"1234.56\"\nSanitize::percentage( '125%' );                // 100.0 (clamped to 0-100)\n\n// Lists and arrays\nSanitize::comma_list( 'item1, item2, item3' ); // ['item1', 'item2', 'item3']\nSanitize::emails( 'user1@ex.com,user2@ex.com' ); // ['user1@ex.com', 'user2@ex.com']\nSanitize::object_ids( [ 1, '2', 3, 'invalid' ] ); // [1, 2, 3]\n\n// Ranges and constraints\nSanitize::range( 150, 0, 100 );                // 100.0 (clamped to range)\nSanitize::rating( '7', 1, 5 );                 // 5 (clamped to 1-5)\n```\n\n### Business-Specific\n```php\n// E-commerce\nSanitize::discount_type( 'Percentage' );       // \"percentage\"\nSanitize::status( 'Active' );                  // \"active\"\n\n// Dates and times\nSanitize::date( '2024-01-15 10:30' );          // \"2024-01-15 10:30:00\"\nSanitize::time( '25:70' );                     // \"\" (invalid)\nSanitize::timezone( 'America/New_York' );      // \"America/New_York\"\n\n// Technical\nSanitize::hex_color( '#FF0000' );              // \"#ff0000\"\nSanitize::phone( '+1 (555) 123-4567' );        // \"+1 (555) 123-4567\"\nSanitize::ip( '192.168.1.1' );                 // \"192.168.1.1\"\n```\n\n## Validate Class\n\n### Basic Validation\n```php\n// Required fields\nValidate::required( '' );                      // false\nValidate::required( '0' );                     // true\nValidate::required( [] );                      // false\n\n// Data types\nValidate::email( 'user@example.com' );         // true\nValidate::url( 'https://example.com' );        // true\nValidate::numeric( '123.45' );                // true\nValidate::integer( '123' );                    // true\n```\n\n### Range and Constraints\n```php\n// Numeric ranges\nValidate::min( 15, 10 );                       // true (15 \u003e= 10)\nValidate::max( 15, 20 );                       // true (15 \u003c= 20)\nValidate::range( 15, 10, 20 );                 // true (10 \u003c= 15 \u003c= 20)\nValidate::percentage( 85 );                    // true (0-100)\n\n// String length\nValidate::length( 'hello', 10, 3 );            // true (3 \u003c= 5 \u003c= 10)\n\n// Options validation\nValidate::in( 'active', [ 'active', 'inactive' ] ); // true\n```\n\n### Specialized Validation\n```php\n// Dates and times\nValidate::date( '2024-01-15' );                // true\nValidate::time( '14:30' );                     // true\nValidate::timezone( 'America/New_York' );      // true\n\n// Technical formats\nValidate::hex_color( '#FF0000' );              // true\nValidate::uuid( '550e8400-e29b-41d4-a716-446655440000' ); // true\nValidate::json( '{\"valid\": true}' );           // true\nValidate::phone( '+1-555-123-4567' );          // true\n\n// WordPress-specific\nValidate::username( 'valid_user' );            // true\nValidate::slug( 'valid-slug' );                // true\n```\n\n### Advanced Validation\n```php\n// Password strength\nValidate::strong_password( 'MyPass123!', 8, true, true, true, true ); // true\n\n// Credit card (Luhn algorithm)\nValidate::credit_card( '4532015112830366' );   // true\n\n// Multiple required fields\n$data    = [ 'name' =\u003e 'John', 'email' =\u003e 'john@example.com' ];\n$missing = Validate::required_fields( $data, [ 'name', 'email', 'phone' ] );\n// Returns: ['phone']\n\n// Pattern matching\nValidate::matches_pattern( 'ABC123', '/^[A-Z]{3}\\d{3}$/' ); // true\n```\n\n## Real-World Examples\n\n### Form Processing\n```php\n// Clean and validate contact form\n$data = [\n\t'name'    =\u003e $_POST['name'] ?? '',\n\t'email'   =\u003e $_POST['email'] ?? '',\n\t'phone'   =\u003e $_POST['phone'] ?? '',\n\t'message' =\u003e $_POST['message'] ?? ''\n];\n\n// Sanitize inputs\n$clean_data = [\n\t'name'    =\u003e Sanitize::text( $data['name'] ),\n\t'email'   =\u003e Sanitize::email( $data['email'] ),\n\t'phone'   =\u003e Sanitize::phone( $data['phone'] ),\n\t'message' =\u003e Sanitize::textarea( $data['message'] )\n];\n\n// Validate required fields\n$missing = Validate::required_fields( $clean_data, [ 'name', 'email' ] );\nif ( ! empty( $missing ) ) {\n\twp_die( 'Missing required fields: ' . implode( ', ', $missing ) );\n}\n\n// Validate email format\nif ( ! Validate::email( $clean_data['email'] ) ) {\n\twp_die( 'Invalid email address' );\n}\n```\n\n### E-commerce Product Management\n```php\n// Clean product data\n$product_data = [\n\t'name'           =\u003e Sanitize::text( $_POST['product_name'] ),\n\t'slug'           =\u003e Sanitize::slug( $_POST['product_slug'] ),\n\t'price'          =\u003e Sanitize::amount( $_POST['price'] ),\n\t'discount_type'  =\u003e Sanitize::discount_type( $_POST['discount_type'] ),\n\t'discount_value' =\u003e Sanitize::percentage( $_POST['discount_value'] ),\n\t'status'         =\u003e Sanitize::status( $_POST['status'] ),\n\t'categories'     =\u003e Sanitize::object_ids( $_POST['categories'] )\n];\n\n// Validate business rules\nif ( ! Validate::min( $product_data['price'], 0.01 ) ) {\n\twp_die( 'Price must be greater than $0.00' );\n}\n\nif ( $product_data['discount_type'] === 'percentage' \u0026\u0026\n     ! Validate::percentage( $product_data['discount_value'] ) ) {\n\twp_die( 'Discount percentage must be between 0-100%' );\n}\n```\n\n### User Registration\n```php\n// Process user registration\n$user_data = [\n\t'username'   =\u003e Sanitize::username( $_POST['username'] ),\n\t'email'      =\u003e Sanitize::email( $_POST['email'] ),\n\t'password'   =\u003e $_POST['password'], // Don't sanitize passwords\n\t'first_name' =\u003e Sanitize::text( $_POST['first_name'] ),\n\t'last_name'  =\u003e Sanitize::text( $_POST['last_name'] )\n];\n\n// Validate username\nif ( ! Validate::username( $user_data['username'] ) ) {\n\twp_die( 'Invalid username format' );\n}\n\n// Validate email\nif ( ! Validate::email( $user_data['email'] ) ) {\n\twp_die( 'Invalid email address' );\n}\n\n// Validate password strength\nif ( ! Validate::strong_password( $user_data['password'], 8 ) ) {\n\twp_die( 'Password must be at least 8 characters with uppercase, lowercase, number, and special character' );\n}\n\n// Check if username/email already exists\nif ( username_exists( $user_data['username'] ) ) {\n\twp_die( 'Username already exists' );\n}\n\nif ( email_exists( $user_data['email'] ) ) {\n\twp_die( 'Email already registered' );\n}\n```\n\n### Settings Page\n```php\n// Clean and validate settings\n$settings = [\n\t'site_email'         =\u003e Sanitize::email( $_POST['site_email'] ),\n\t'items_per_page'     =\u003e Sanitize::int_range( $_POST['items_per_page'], 1, 100 ),\n\t'currency_symbol'    =\u003e Sanitize::text( $_POST['currency_symbol'] ),\n\t'allowed_file_types' =\u003e Sanitize::comma_list( $_POST['allowed_file_types'] ),\n\t'primary_color'      =\u003e Sanitize::hex_color( $_POST['primary_color'] ),\n\t'enable_feature'     =\u003e Sanitize::bool( $_POST['enable_feature'] )\n];\n\n// Validate critical settings\nif ( ! Validate::email( $settings['site_email'] ) ) {\n\tadd_settings_error( 'settings', 'invalid_email', 'Invalid email address' );\n}\n\nif ( ! Validate::range( $settings['items_per_page'], 1, 100 ) ) {\n\tadd_settings_error( 'settings', 'invalid_range', 'Items per page must be between 1-100' );\n}\n\n// Save if valid\nif ( empty( get_settings_errors() ) ) {\n\tupdate_option( 'my_plugin_settings', $settings );\n}\n```\n\n### API Data Processing\n```php\n// Clean incoming API data\n$api_data = json_decode( file_get_contents( 'php://input' ), true );\n\n$clean_api_data = [\n\t'id'       =\u003e Sanitize::absint( $api_data['id'] ?? 0 ),\n\t'title'    =\u003e Sanitize::string_length( $api_data['title'] ?? '', 100 ),\n\t'content'  =\u003e Sanitize::html( $api_data['content'] ?? '' ),\n\t'status'   =\u003e Sanitize::option( $api_data['status'] ?? '', [ 'draft', 'published' ], 'draft' ),\n\t'tags'     =\u003e Sanitize::comma_list( $api_data['tags'] ?? '' ),\n\t'metadata' =\u003e Sanitize::json( $api_data['metadata'] ?? '{}' )\n];\n\n// Validate required fields\n$required = [ 'id', 'title' ];\n$missing  = Validate::required_fields( $clean_api_data, $required );\n\nif ( ! empty( $missing ) ) {\n\twp_send_json_error( [ 'message' =\u003e 'Missing required fields', 'fields' =\u003e $missing ] );\n}\n\n// Additional validation\nif ( ! Validate::length( $clean_api_data['title'], 100, 1 ) ) {\n\twp_send_json_error( [ 'message' =\u003e 'Title must be 1-100 characters' ] );\n}\n```\n\n## Security Best Practices\n\n```php\n// ✅ Always sanitize user input\n$clean_input = Sanitize::text( $_POST['user_input'] );\n\n// ✅ Validate after sanitizing\nif ( ! Validate::required( $clean_input ) ) {\n\twp_die( 'Input is required' );\n}\n\n// ✅ Use appropriate sanitization for data type\n$email  = Sanitize::email( $_POST['email'] );\n$amount = Sanitize::amount( $_POST['price'] );\n$html   = Sanitize::html( $_POST['content'] );\n\n// ✅ Validate business rules\nif ( ! Validate::min( $amount, 0 ) ) {\n\twp_die( 'Amount must be positive' );\n}\n\n// ❌ Never trust user input without sanitization\n// $unsafe = $_POST['data']; // Don't do this\n\n// ❌ Don't sanitize passwords (just validate)\n// $password = Sanitize::text($_POST['password']); // Wrong!\n```\n\n## Requirements\n\n- PHP 7.4+\n- WordPress 5.0+\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nThis project is licensed under the GPL-2.0-or-later License.\n\n## Support\n\n- [Documentation](https://github.com/arraypress/wp-clean-utils)\n- [Issue Tracker](https://github.com/arraypress/wp-clean-utils/issues)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farraypress%2Fwp-sanitize-utils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farraypress%2Fwp-sanitize-utils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farraypress%2Fwp-sanitize-utils/lists"}