Skip to content

Instantly share code, notes, and snippets.

@daveloodts
Created August 27, 2025 09:02
Show Gist options
  • Save daveloodts/5f64ae6ec353a5968a41d7cdc3c0b17f to your computer and use it in GitHub Desktop.
Save daveloodts/5f64ae6ec353a5968a41d7cdc3c0b17f to your computer and use it in GitHub Desktop.
<?php
/**
* View-tabs + filters:
* - Customers zonder naam
* - Subscribers zonder naam
*/
// 1) View-links met teller
add_filter('views_users', function ($views) {
global $wpdb;
$cap_key = $wpdb->get_blog_prefix() . 'capabilities';
// === Customers zonder naam ===
$count_customers = (int) $wpdb->get_var( $wpdb->prepare("
SELECT COUNT(DISTINCT u.ID)
FROM {$wpdb->users} u
INNER JOIN {$wpdb->usermeta} cap
ON cap.user_id = u.ID AND cap.meta_key = %s
LEFT JOIN {$wpdb->usermeta} fn
ON fn.user_id = u.ID AND fn.meta_key = 'first_name'
LEFT JOIN {$wpdb->usermeta} ln
ON ln.user_id = u.ID AND ln.meta_key = 'last_name'
WHERE cap.meta_value LIKE %s
AND (fn.meta_value IS NULL OR fn.meta_value = '')
AND (ln.meta_value IS NULL OR ln.meta_value = '')
", $cap_key, '%"customer"%') );
$url_customers = add_query_arg(
['role' => 'customer', 'no_name' => '1'],
admin_url('users.php')
);
$current_customers = (
isset($_GET['no_name']) && $_GET['no_name'] === '1'
&& isset($_GET['role']) && $_GET['role'] === 'customer'
);
$views['customers_no_name'] = sprintf(
'<a href="%s"%s>%s <span class="count">(%d)</span></a>',
esc_url($url_customers),
$current_customers ? ' class="current"' : '',
esc_html__('Customers zonder naam', 'textdomain'),
$count_customers
);
// === Subscribers zonder naam ===
$count_subs = (int) $wpdb->get_var( $wpdb->prepare("
SELECT COUNT(DISTINCT u.ID)
FROM {$wpdb->users} u
INNER JOIN {$wpdb->usermeta} cap
ON cap.user_id = u.ID AND cap.meta_key = %s
LEFT JOIN {$wpdb->usermeta} fn
ON fn.user_id = u.ID AND fn.meta_key = 'first_name'
LEFT JOIN {$wpdb->usermeta} ln
ON ln.user_id = u.ID AND ln.meta_key = 'last_name'
WHERE cap.meta_value LIKE %s
AND (fn.meta_value IS NULL OR fn.meta_value = '')
AND (ln.meta_value IS NULL OR ln.meta_value = '')
", $cap_key, '%"subscriber"%') );
$url_subs = add_query_arg(
['role' => 'subscriber', 'no_name' => '1'],
admin_url('users.php')
);
$current_subs = (
isset($_GET['no_name']) && $_GET['no_name'] === '1'
&& isset($_GET['role']) && $_GET['role'] === 'subscriber'
);
$views['subscribers_no_name'] = sprintf(
'<a href="%s"%s>%s <span class="count">(%d)</span></a>',
esc_url($url_subs),
$current_subs ? ' class="current"' : '',
esc_html__('Subscribers zonder naam', 'textdomain'),
$count_subs
);
return $views;
});
// 2) Query toepassen als de view actief is
add_action('pre_get_users', function ($query) {
if ( ! is_admin() ) return;
global $pagenow;
if ( 'users.php' !== $pagenow ) return;
if ( empty($_GET['no_name']) || $_GET['no_name'] !== '1' ) return;
if ( empty($_GET['role']) || ! in_array($_GET['role'], ['customer','subscriber'], true) ) return;
$query->set('role', sanitize_text_field($_GET['role']));
$query->set('meta_query', [
'relation' => 'AND',
[
'relation' => 'OR',
['key' => 'first_name', 'compare' => 'NOT EXISTS'],
['key' => 'first_name', 'value' => '', 'compare' => '='],
],
[
'relation' => 'OR',
['key' => 'last_name', 'compare' => 'NOT EXISTS'],
['key' => 'last_name', 'value' => '', 'compare' => '='],
],
]);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment