WordPress – Фильтрация количества пользователей в списке

Вопрос или проблема

Все (3) | Администратор (3)

Как я могу просто уменьшить значение на -1 в счетчиках “Все” и “Администратор”?

Здесь действительно не так много отличных хуков. Используется класс WP_Users_List_Table и хук views_users, который можно использовать для парсинга и замены числа.

Хук дает нам массив ссылок следующим образом (несмотря на то, что это плоский массив, значение является ссылкой).

Array
(
    [all] => Все (4)
    [administrator] => Администратор (2)
    [editor] => Редактор (2)
)

На мой взгляд, легче всего просто использовать regex для (2) и выполнить str_replace().

/**
 * Изменить представления списка ролей в верхней части users.php
 * 
 * @param array $user_roles
 * 
 * @return array $user_roles
 */
add_filter( 'views_users', function( $user_roles ) {

    $roles = array(
        'administrator' => -1,
        'editor'        => +1,
    );

    foreach( $user_roles as $slug => $link ) {

        // Пропустить - Слаг роли не существует в нашем массиве.
        if( ! isset( $roles[ $slug ] ) ) { continue; }

        // $matches = array( 0 => '(123)', 1 => 123 )
        preg_match('/\((\d+)\)/', $link, $matches );

        // Пропустить - Регулярное выражение не нашло совпадения
        if( count( $matches ) < 2 ) { continue; }

        // Изменить
        $original_number = absint( $matches[1] );
        $modified_number = $original_number + $roles[ $slug ];

        // Заменить
        $user_roles[ $slug ] = str_replace( 
            '(' . $original_number . ')', 
            '(' . $modified_number . ')',
            $user_roles[ $slug ]
        );

    }

    return $user_roles

} );

Это, конечно, не изменит список пользователей в таблице пользователей. Для этого вам нужно использовать pre_user_query.


Альтернативно, представление действительно использует count_users(), и существует хук pre_count_users, но вам нужно будет прервать его выполнение и самостоятельно подсчитать пользователей с ролями.

Ответ или решение

Вопрос, связанный с фильтрацией списка пользователей и уменьшением отображаемого количества пользователей по ролям в WordPress, требует детального понимания структуры WordPress и методологии его работы с ролями и пользователями. Разберём теоретические аспекты, рассмотрим примерные решения и обсудим их применение.

Теория

WordPress использует определённую архитектуру для работы с пользователями и их ролями. В административной панели, на странице пользователей, отображаются различного рода статистики, включая количество пользователей с каждой ролью. Эти данные выводятся с помощью класса WP_Users_List_Table, который и отвечает за представление данных в виде таблицы. Это включает создание вкладок, которые мы видим как "Все", "Администраторы", "Редакторы" и так далее.

Чтобы изменить количество пользователей, отображаемое возле каждой роли, мы можем использовать специальные хуки WordPress. В данном случае, полезным будет хук views_users, который позволяет нам вмешиваться в процесс создания представления этих вкладок. Этот хук предоставляет массив ссылок, где каждая ссылка содержит текст с количеством пользователей в скобках.

Пример

Пример реализации решения на основе вышеупомянутого хука может выглядеть следующим образом:

/**
 * Модификация представления списка ролей на странице пользователей
 *
 * @param array $user_roles
 *
 * @return array $user_roles
 */
add_filter('views_users', function($user_roles) {
    $roles_to_modify = array(
        'administrator' => -1,
        'editor' => +1,
    );

    foreach ($user_roles as $slug => $link) {
        if (!isset($roles_to_modify[$slug])) {
            continue;
        }

        preg_match('/\((\d+)\)/', $link, $matches);
        if (count($matches) < 2) {
            continue;
        }

        $original_number = absint($matches[1]);
        $modified_number = $original_number + $roles_to_modify[$slug];

        $user_roles[$slug] = str_replace(
            '(' . $original_number . ')',
            '(' . $modified_number . ')',
            $user_roles[$slug]
        );
    }

    return $user_roles;
});

В данном коде мы используем регулярные выражения для поиска и замены количества пользователей, отображаемого в скобках. Мы создаём массив $roles_to_modify, где для каждой роли указываем, на сколько нужно изменить количество. Далее мы перебираем каждую роль, проверяем, содержится ли она в нашем массиве, и если да, то изменяем количество пользователей.

Применение

Используя данный подход, вы можете тонко настраивать отображаемое количество пользователей в административной части WordPress. Это может быть полезно для внутренних целей, например, скрытия определённой части пользователей или создания собственного отчёта по ним.

Однако стоит учитывать, что данное изменение является исключительно косметическим и не влияет на реальные данные о пользователях в базе данных. Таким образом, если вам нужно изменить сам состав пользователей, например, исключить кого-либо из списка по определённому критерию, стоит рассмотреть использование хука pre_user_query. Этот хук позволит вам модифицировать запросы, выполняемые к таблицам пользователей в базе данных.

Также можно упомянуть о хук pre_count_users, который предоставляет возможность изменить способ подсчёта пользователей. Однако его использование требует самостоятельного подсчета пользователей с определёнными ролями и его применение в данном случае избыточно, учитывая всё необходимое можно сделать через views_users.

На практике, взаимодействие с WordPress API, правильное использование хуков и знание внутренней архитектуры позволяет добиваться высоко точных кастомизаций под нужды бизнеса или личные предпочтения сопровождения сайтов. Любые изменения должны быть тщательно протестированы на тестовых средах перед реализацией в продакшене, чтобы избегать сбоев в работе системы.

Оцените материал
Добавить комментарий

Капча загружается...