{"id":249715,"date":"2025-09-04T12:04:53","date_gmt":"2025-09-04T12:04:53","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/all-users-filter\/"},"modified":"2026-02-21T13:49:11","modified_gmt":"2026-02-21T13:49:11","slug":"all-users-filter","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/all-users-filter\/","author":20704480,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.4","stable_tag":"1.4","tested":"6.9.4","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"All Users Filter","header_author":"Hardik Lakkad\/Patel","header_description":"This plugin helps the admin to filter the users with various ranges of filters.","assets_banners_color":"","last_updated":"2026-02-21 13:49:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/h-lakkad1998\/all-users-filter","header_author_uri":"https:\/\/www.linkedin.com\/in\/hardik-patel-lakkad-097b12147\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":485,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"hlakkad1998","date":"2025-09-04 12:04:33"},"1.1":{"tag":"1.1","author":"hlakkad1998","date":"2025-09-08 13:01:30"},"1.2":{"tag":"1.2","author":"hlakkad1998","date":"2025-10-26 09:24:12"},"1.3":{"tag":"1.3","author":"hlakkad1998","date":"2026-02-21 09:15:36"},"1.4":{"tag":"1.4","author":"hlakkad1998","date":"2026-02-21 13:49:11"}},"upgrade_notice":{"1.0":"<p>Initial Release.<\/p>","1.1":"<ul>\n<li>Minor changes in the main file, added German Support<\/li>\n<\/ul>","1.2":"<ul>\n<li>This release updates the plugin code for compliance with current WordPressVIPMinimum coding standards and improving and code quality. No changes to plugin functionality.<\/li>\n<\/ul>","1.3":"<ul>\n<li>Filter and export users based on their total WooCommerce order count, featuring full support for High-Performance Order Storage (HPOS) *<\/li>\n<\/ul>","1.4":"<p>Minor changes for order status count in csv.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3356036,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0","1.1","1.2","1.3","1.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3356036,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3356036,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3356036,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3356036,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3356036,"resolution":"5","location":"assets","locale":""}},"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[27372,68807,28272,154044,3229],"plugin_category":[],"plugin_contributors":[247405,247404,247406],"plugin_business_model":[],"class_list":["post-249715","plugin","type-plugin","status-publish","hentry","plugin_tags-customer-list","plugin_tags-export-user","plugin_tags-export-users","plugin_tags-user-export","plugin_tags-usermeta","plugin_contributors-akshaykungiri","plugin_contributors-hlakkad1998","plugin_contributors-visualsbyridhi","plugin_committers-hlakkad1998"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/all-users-filter\/assets\/icon-256x256.png?rev=3356036","icon_2x":"https:\/\/ps.w.org\/all-users-filter\/assets\/icon-256x256.png?rev=3356036","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/all-users-filter\/assets\/screenshot-1.png?rev=3356036","caption":""},{"src":"https:\/\/ps.w.org\/all-users-filter\/assets\/screenshot-2.png?rev=3356036","caption":""},{"src":"https:\/\/ps.w.org\/all-users-filter\/assets\/screenshot-3.png?rev=3356036","caption":""},{"src":"https:\/\/ps.w.org\/all-users-filter\/assets\/screenshot-4.png?rev=3356036","caption":""},{"src":"https:\/\/ps.w.org\/all-users-filter\/assets\/screenshot-5.png?rev=3356036","caption":""}],"raw_content":"<!--section=description-->\n<p>Plugin for filtering, sorting, and exporting users.<\/p>\n\n<p>This plugin allows you to filter, sort, and export users in CSV format. You can filter users by multiple parameters, such as date, role, meta key-value, and registration date.<\/p>\n\n<h3>Usage<\/h3>\n\n<p>Use the Users \u2192 All Users Filter screen to compose conditions. Choose a meta key, operator, type, value, and (optionally) group relation to build complex queries without code. Export matched users to CSV.<\/p>\n\n<h3>Admin UI \u2192 WP_Meta_Query Mapping<\/h3>\n\n<ul>\n<li>meta_key \u2192 <code>key<\/code><\/li>\n<li>operator \u2192 <code>compare<\/code><\/li>\n<li>Type \u2192 <code>type<\/code><\/li>\n<li>meta_value \u2192 <code>value<\/code><\/li>\n<li>Group relation (if available) \u2192 <code>relation: AND | OR<\/code><\/li>\n<\/ul>\n\n<h3>Meta keys used in tests (wp_usermeta.meta_key)<\/h3>\n\n<ul>\n<li><code>job_description<\/code> (string)<\/li>\n<li><code>job_designation<\/code> (string; single value OR a pipe\/comma-separated list)<\/li>\n<li><code>age_in_years<\/code> (integer-like string)<\/li>\n<li><code>joining_date<\/code> (stored as <code>YYYY-MM-DD<\/code> or full <code>YYYY-MM-DD HH:MM:SS<\/code>)<\/li>\n<li><code>monthly_salary<\/code> (numeric, e.g., <code>9000<\/code>)<\/li>\n<\/ul>\n\n<p>If your dataset stores dates in a different format (e.g., <code>DD\/MM\/YYYY<\/code>) or salaries with commas (e.g., <code>9,000<\/code>), see <strong>Edge Cases<\/strong> below.<\/p>\n\n<h3>Test Cases<\/h3>\n\n<p>The following UI test cases validate common scenarios and guardrails.<\/p>\n\n<h3>1) Single-condition functional tests<\/h3>\n\n<p>1A. Exact match on text<br \/>\nIntent: Users with <code>job_description<\/code> exactly \"Lorem ipsum test\".<br \/>\nUI:\n- meta_key: <code>job_description<\/code>\n- operator: <code>=<\/code>\n- Type: <code>CHAR<\/code>\n- meta_value: <code>Lorem ipsum test<\/code><br \/>\nExpected: Exact match; typically case-insensitive under default collations; respects spaces.<\/p>\n\n<p>1B. Case-sensitive regex match<br \/>\nIntent: <code>job_description<\/code> starts with <code>Lorem<\/code> (case-sensitive).<br \/>\nUI:\n- meta_key: <code>job_description<\/code>\n- operator: <code>REGEXP<\/code>\n- Type: <code>BINARY<\/code>\n- meta_value: <code>^Lorem<\/code><br \/>\nExpected: Matches only values beginning with uppercase <code>Lorem<\/code>.<\/p>\n\n<p>1C. Negative regex<br \/>\nIntent: <code>job_description<\/code> does NOT mention <code>ipsum<\/code> as a whole word.<br \/>\nUI:\n- meta_key: <code>job_description<\/code>\n- operator: <code>NOT REGEXP<\/code>\n- Type: <code>CHAR<\/code>\n- meta_value: <code>(^|[^A-Za-z])ipsum([^A-Za-z]|$)<\/code><br \/>\nExpected: Excludes any row containing <code>ipsum<\/code> as a separate word.<\/p>\n\n<h3>2) Multi-value (roles) tests for `job_designation`<\/h3>\n\n<p>Assume values include: UI\/UX Designer | QA Engineer | DevOps Engineer | Project Manager | Business Analyst | HR Manager | Data Analyst | Software Engineer | System Admin | Marketing Specialist<\/p>\n\n<p>2A. Membership via IN<br \/>\nIntent: QA Engineer OR DevOps Engineer.<br \/>\nUI:\n- meta_key: <code>job_designation<\/code>\n- operator: <code>IN<\/code>\n- Type: <code>CHAR<\/code>\n- meta_value: <code>QA Engineer, DevOps Engineer<\/code>  (comma-separated \u2192 parsed to array) Must Include at least one array<br \/>\nExpected: Exact membership match.<\/p>\n\n<p>2B. Pipe-separated field using REGEXP<br \/>\nIntent: Field stores multiple roles separated by <code>|<\/code>; match Software Engineer or Data Analyst.<br \/>\nUI:\n- meta_key: <code>job_designation<\/code>\n- operator: <code>REGEXP<\/code>\n- Type: <code>CHAR<\/code>\n- meta_value: <code>(^|\\s*\\|\\s*)(Software Engineer|Data Analyst)(\\s*\\|\\s*|$)<\/code><br \/>\nExpected: Token-aware match; avoids partials like \"Engineer\" inside longer tokens.<\/p>\n\n<p>2C. Excluding a role with NOT REGEXP<br \/>\nIntent: Exclude HR Manager.<br \/>\nUI:\n- meta_key: <code>job_designation<\/code>\n- operator: <code>NOT REGEXP<\/code>\n- Type: <code>CHAR<\/code>\n- meta_value: <code>(^|\\s*\\|\\s*)HR Manager(\\s*\\|\\s*|$)<\/code><br \/>\nExpected: Excludes any token equal to HR Manager.<\/p>\n\n<h3>3) Numeric range tests for `age_in_years`<\/h3>\n\n<p>3A. Inclusive range (happy path)<br \/>\nIntent: 18\u201345 inclusive.<br \/>\nUI:\n- meta_key: <code>age_in_years<\/code>\n- operator: <code>BETWEEN<\/code>\n- Type: <code>NUMERIC<\/code> (or <code>UNSIGNED<\/code>)\n- meta_value: <code>18,45<\/code><br \/>\nExpected: Ages 18 through 45 inclusive.<\/p>\n\n<h3>4) Date tests for `joining_date` on Meta Filters<\/h3>\n\n<p>Reference cut-off date: 2023-08-25 (two years ago from baseline).<\/p>\n\n<p>4A. On or before cut-off (joined \u2265 2 years ago)<br \/>\nUI:\n- meta_key: <code>joining_date<\/code>\n- operator: <code>&lt;=<\/code>\n- Type: <code>DATE<\/code>\n- meta_value: <code>2023-08-25<\/code><br \/>\nExpected: On or before 2023-08-25. If stored as DATETIME, see 4A'.<\/p>\n\n<p>4B'. DATETIME variant<br \/>\nUI:\n- meta_key: <code>joining_date<\/code>\n- operator: <code>&lt;=<\/code>\n- Type: <code>DATETIME<\/code>\n- meta_value: <code>2023-08-25 23:59:59<\/code><\/p>\n\n<h3>5) Salary tests for `monthly_salary` (business rule: exactly 9000)<\/h3>\n\n<p>5A. Exact numeric<br \/>\nUI:\n- meta_key: <code>monthly_salary<\/code>\n- operator: <code>=<\/code>\n- Type: <code>NUMERIC<\/code>\n- meta_value: <code>9000<\/code><\/p>\n\n<p>5B. Degenerate range \u21d2 equality<br \/>\nUI:\n- operator: <code>BETWEEN<\/code>\n- Type: <code>NUMERIC<\/code>\n- meta_value: <code>9000,9000<\/code><\/p>\n\n<h3>10) Extending scope for multiple users<\/h3>\n\n<p>Allow non-admins (specific user ID) to use the plugin by adding this to your theme's functions.php:<\/p>\n\n<pre><code>&lt;?php\n\/\/ Allow a specific user to access All Users Filter UI\nfunction yr_theme_custom_allusfi_filter( $allowed ) {\n    return ( 64901 === get_current_user_id() ) ? true : $allowed;\n}\nadd_filter( 'allusfi_allowed_user_to_filter', 'yr_theme_custom_allusfi_filter' );\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Go to the Plugins page.<\/li>\n<li>Click the Add New button.<\/li>\n<li>Search for the plugin name \"All Users Filter\".<\/li>\n<li>Click the Install Now button.<\/li>\n<li>Click the Activate button.<\/li>\n<\/ol>\n\n<p>The plugin is now installed. Note: Initially only administrators can use this plugin.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20can%20non-admins%20access%20the%20plugin%3F\"><h3>How can non-admins access the plugin?<\/h3><\/dt>\n<dd><p>Use the <code>allusfi_allowed_user_to_filter<\/code> filter (see \"Extending scope for multiple users\").<\/p><\/dd>\n<dt id=\"why%20doesn%27t%20a%20numeric%20filter%20work%20with%20type%3A%20char%3F\"><h3>Why doesn't a numeric filter work with Type: CHAR?<\/h3><\/dt>\n<dd><p>String comparisons are lexicographic. Use <code>NUMERIC<\/code> (or <code>SIGNED<\/code>\/<code>UNSIGNED<\/code>) for number ranges and equality.<\/p><\/dd>\n<dt id=\"what%20is%20signed%20and%20unsigned%20type%3F\"><h3>What is SIGNED and UNSIGNED type?<\/h3><\/dt>\n<dd><p>\"SIGNED\" Treated as a signed integer, can represent negative, zero, and positive numbers. e.g. -2, -1, 0, 1, 2\n\"UNSIGNED\" Only allows 0 and positive numbers (no negatives). e.g. 0, 1, 2<\/p><\/dd>\n<dt id=\"does%20the%20order%20count%20filter%20work%20with%20woocommerce%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Does the order count filter work with WooCommerce High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes! The plugin is fully compatible with modern WooCommerce stores using HPOS, as well as stores using legacy custom post type (CPT) order storage.<\/p><\/dd>\n<dt id=\"can%20i%20export%20the%20filtered%20order%20counts%3F\"><h3>Can I export the filtered order counts?<\/h3><\/dt>\n<dd><p>Yes. Whenever the WooCommerce filter is enabled, your user export file will automatically include a new \"Total Orders\" column containing the exact order count for each filtered user.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial Release<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Minor changes in the main file, added German Support<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Codebase refactored for full compliance with WordPressVIPMinimum coding standards.<\/li>\n<li>Improved code quality and maintainability.<\/li>\n<li>No user-facing changes.<\/li>\n<\/ul>\n\n<h4>1.3<\/h4>\n\n<ul>\n<li>Filter and export users based on their total WooCommerce order count, featuring full support for High-Performance Order Storage (HPOS) *<\/li>\n<\/ul>\n\n<h4>1.4<\/h4>\n\n<p>Minor changes for order status count in csv.<\/p>","raw_excerpt":"Filter, sort, and export WordPress users to CSV using powerful UI-driven meta queries (roles, dates, numeric ranges, regex, and more).","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/249715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=249715"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hlakkad1998"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=249715"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=249715"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=249715"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=249715"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=249715"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=249715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}