Как добавить возможность для роли пользователя?

14

Я управляю сетью Wordpress и хотел бы добавить возможность пользователя unfiltered_html к уже предопределенной роли пользователя Admin. В стандартной установке Wordpress учетная запись администратора уже имела бы эту возможность, но в установке MU эта возможность предоставляется только супер-администраторам. WordPress Роли и возможности .

Как я могу увеличить роль администратора из темы или плагина?

Jonnybojangles
источник
1
wordpress.org/extend/plugins/unfiltered-mu похоже, что это может помочь. Но это работает для администраторов и редакторов. Если это не желательно, может быть, код можно немного подправить?
Преподобный Вуду
@Rev. Voodoo Спасибо за предложение. Это помогло пролить некоторый свет на эту тему, так как добавления возможности unfiltered_html недостаточно, чтобы позволить роли, отличной от Admin или Super admin, публиковать встраивания и т. Д. Ключом была фильтрация / перехват WordPress KSES: kses_remove_filters ()
Jonnybojangles
Подробный блог: goo.gl/xNuafH
Суреш Камруши

Ответы:

14

Вы можете использовать класс WP_Role ,

// get the the role object
$role_object = get_role( $role_name );

// add $cap capability to this role object
$role_object->add_cap( $capability_name );

// remove $cap capability from this role object
$role_object->remove_cap( $capability_name );

Итак, чтобы ответить на ваш первоначальный вопрос о том, как разрешить администраторам вводить теги SCRIPT и IFRAME в содержимое публикации, вам нужна возможность «unfiltered_html», которая в мультисайте предоставляется только супер администраторам.

// get the the role object
$admin_role = get_role( 'administrator' );
// grant the unfiltered_html capability
$admin_role->add_cap( 'unfiltered_html', true );

или вы можете запустить это один раз в своих функциях:

/* Roles & Capabilities */
add_role('professional', 'Professional User', array(
    'read' => true, // True allows that capability, False specifically removes it.
    'edit_posts' => true,
    'delete_posts' => true,
    //'edit_published_posts' => true,
    //'publish_posts' => true,
    //'edit_files' => true,
    'upload_files' => true //last in array needs no comma!
));
Филипп
источник
Спасибо Филипп. Что касается класса WP_Role, когда следует выполнять код? Я предполагаю, что это влияет на глобальный объект роли? Я рад, что вы подняли второй блок кода, отметив, что я мог запустить его один раз в моем файле функций. Я нашел похожие решения на некоторых форумах поддержки Wordpress, но я нахожу странным запускать один раз код в теме или плагине. Особенно без проверки, если изменение уже существует. Возможно, роль записи на самом деле ничтожна. Чтобы проверить возможность против, просто запишите возможность в роль, как показано в первом примере.
Jonnybojangles
Мне также интересно, как бы вы выполнили класс WP_Role, если бы у вас была возможность сообщить нам об этом. Спасибо
Осу
1
@Jonnybojagles & @Osu, посмотрите это: Руководство по ролям и возможностям garyc40.com/2010/04/ultimate-guide-to-roles-and-capabilities
Philip
Я уже прочитал эту статью в своем стремлении, но я воспользовался возможностью, чтобы снова пройти через все это, спасибо! В конце концов, после анализа плагина нефильтрованного (упомянутого выше Rev. Voodoo) я в конце концов обнаружил, что смены ролей путем добавления возможностей недостаточно. Мне нужно было отфильтровать фильтры KSES Wordpress.
Jonnybojangles
Я предпочитаю добавлять запятую к последнему элементу в массивах. Даже если это может показаться неуместным, поскольку нет необходимости заставлять код работать или приводить к ошибкам, это удобно при использовании контроля версий при визуализации изменений; вы не увидите старую строку элемента массива, удаленную, повторно добавленную и выделенную как новую, только с запятой в качестве добавления или изменения, сделанного для этой строки. Хотя и мало, это помогает сэкономить много времени при анализе модификаций.
nyedidikeke
2

Чтобы разрешить другой роли, отличной от Super Admin или Admin (в зависимости от того, является ли установка Wordpress сетевым / MU-экземпляром или нет), добавить нефильтрованный html в сообщение или комментарий. Фильтр KSES Wordpress должен быть удален.

Проверьте, есть ли у пользователя особые возможности.

if ( current_user_can( 'unfiltered_html' ) ) {  }

Если это так, чем удалить KSES

kses_remove_filters();

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

Jonnybojangles
источник
Функциональность также обернута в реестр плагинов и отменена регистрация, так что логику не нужно предварительно формировать для каждого экземпляра WP.
Jonnybojangles