wp_dropdown_roles() для замены значения опции = код

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

Я пытаюсь заменить жестко закодированный выпадающий список ролей в плагине. В данный момент это код:

echo '<select name="xf_user_role_' . $id . '" id="xf_user_role_' . $id . '">';
?>

<option value="subscriber"
<?php echo ($xf_options['xf_user_role'][$id] == 'subscriber') ? "selected='yes'" : ''; ?> >Подписчик</option>

<option value="contributor"
<?php echo ($xf_options['xf_user_role'][$id] == 'contributor') ? "selected='yes'" : ''; ?> >Участник</option>

<option value="author"
<?php echo ($xf_options['xf_user_role'][$id] == 'author') ? "selected='yes'" : ''; ?> >Автор</option>

<option value="editor"
<?php echo ($xf_options['xf_user_role'][$id] == 'editor') ? "selected='yes'" : ''; ?> >Редактор</option>

<option value="administrator"
<?php echo ($xf_options['xf_user_role'][$id] == 'administrator') ? "selected='yes'" : ''; ?> >Администратор</option>

</select> 

Этот код изменен на :

echo '<select name="xf_user_role_' . $id . '" id="xf_user_role_' . $id . '">';
wp_dropdown_roles( );
?>
</select> 

Выпадающий список отображается, но выбор не дает $xf_options …

Функция wp_dropdown_roles недостаточно документирована на странице Codex. Я пробовал несколько различных способов добавить информацию в (), но не удается сделать это правильно.

Какая правильная информация должна быть в ()?

Функция wp_dropdown_roles() внутренне использует get_editable_roles() для получения нужных ролей. Она ничего не делает, кроме как получает роли из глобального:

$all_roles = $GLOBALS['wp_roles']->roles;

и фильтрует их затем:

return apply_filters( 'editable_roles', $all_roles );

Так что вы можете просто добавить следующую функцию в плагин или в файл functions.php вашей темы:

function wpse137935_filter_editable_roles( Array $roles )
{
    // Не конфликтуем и сразу удаляем
    remove_filter( current_filter(), __FUNCTION__ );

    // Выполните любую логику здесь, которая добавляет или удаляет роли

    return $roles;
}

Затем, прямо перед вызовом wp_dropdown_roles(), вы добавляете:

add_filter( 'editable_roles', 'wpse137935_filter_editable_roles' );

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

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

Функция wp_dropdown_roles() в WordPress предназначена для создания выпадающего списка, содержащего роли пользователей. Однако, если вам необходимо заменить код, который вы уже используете для отображения ролей, вам нужно обратить внимание на несколько ключевых моментов. Давайте разберем вашу задачу подробно.

Проблема

Вы хотите заменить жестко закодированный список ролей, используя функцию wp_dropdown_roles(), но ваше текущее решение не позволяет корректно сохранять выбранные значения для $xf_options.

Решение

Функция wp_dropdown_roles() автоматически генерирует выпадающий список на основе ролей, получаемых через функцию get_editable_roles(). Эта функция возвращает только роли, которые могут быть редакционно доступными, и не связывается непосредственно с пользовательскими настройками, как $xf_options.

Чтобы ваша реализация работала правильно, вам нужно:

  1. Убедиться, что выбранное значение сохраняется и отображается корректно.
  2. Настроить wp_dropdown_roles() с помощью фильтра для настройки доступных ролей (по желанию).

Реализация

Ниже приведен пример того, как можно эффективно использовать wp_dropdown_roles() и сделать так, чтобы выбранные роли корректно отображались:

<?php
// Оборачиваем код в функцию для лучшей организации
function display_user_role_dropdown($id, $xf_options) {
    // Получаем текущее значение роли пользователя
    $current_role = isset($xf_options['xf_user_role'][$id]) ? $xf_options['xf_user_role'][$id] : '';

    // Используем wp_dropdown_roles с нужными атрибутами
    echo '<select name="xf_user_role_' . esc_attr($id) . '" id="xf_user_role_' . esc_attr($id) . '">';
    $roles = get_editable_roles();

    // Генерируем опции для выпадающего списка
    foreach ($roles as $role => $details) {
        $selected = selected($current_role, $role, false);
        echo '<option value="' . esc_attr($role) . '"' . $selected . '>' . esc_html($details['name']) . '</option>';
    }

    echo '</select>';
}
?>

Объяснение кода

  1. Получение текущей роли: Мы сначала проверяем, установлено ли значение роли для данного пользователя ($id), и сохраняем его в переменной $current_role.
  2. Создание выпадающего списка: Используем стандартный HTML <select> и проходимся по всем ролям, полученным из функции get_editable_roles(). Для каждой роли мы создаем <option>, автоматически добавляя атрибут selected, если эта роль соответствует текущей роли.
  3. Фильтрация для настраиваемых ролей (по желанию): Если вы хотите отфильтровать роли перед их отображением в выпадающем списке, можете использовать add_filter() как описано в вашем вопросе.

Заключение

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

Если у вас возникнут дополнительные вопросы или потребуется помощь в настройке, не стесняйтесь обращаться за поддержкой.

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

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