Как я могу проверить, является ли текущий пользователь администратором или редактором?
Я знаю, как это сделать по отдельности:
<?php if( current_user_can('editor')) { ?>
<!--stuff here for editors-->
<?php } ?>
<?php if( current_user_can('administrator')) { ?>
<!--stuff here for admins-->
<?php } ?>
Но как мне объединить это? Как узнать, админ это или редактор?
Во-первых,
current_user_can()
не следует использовать для проверки роли пользователя — его следует использовать для проверки, имеет ли пользователь определенные права.Во-вторых, вместо того, чтобы определять роль пользователя, вам нужно знать его права. Вместо этого, если
current_user_can()
использовался по назначению, то есть для проверки прав пользователя, а не его роли, вам не понадобится условная проверка, содержащая тест «или» (||). Например:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages это функция администраторов и редакторов, но не нижестоящих ролей, таких как авторы. Вот как
current_user_can()
должна использоваться.Вы можете разрешить видеть на странице только «редактора» или «участника», вы можете разместить этот код прямо в generic-page.php
Первый ответ, не связанный с WordPress, потому что это всего лишь PHP, используйте логический оператор «ИЛИ»:
Если нужно проверить более двух ролей, вы можете проверить, находятся ли роли текущего пользователя в массиве ролей, что-то вроде:
Однако,
current_user_can
можно использовать не только с именем роли пользователя, но и с разрешениями. Поэтому:Согласно PHPDoc, в описании функции
current_user_can()
, мы можем видеть строку «Хотя проверка по отдельным ролям вместо возможности поддерживается частично, эта практика не рекомендуется, так как она может привести к ненадежным результатам». Поэтому я думаю, что было бы лучше избегать использования ролей при проверке возможностей пользователяПоскольку
current_user_can()
всегда возвращает false, если пользователь не вошел в систему, аwp_get_current_user()
вернет пользователя без какой-либо роли, если пользователь не вошел в систему, поэтомуarray_intersect()
всегда будет выдавать false.Вам нужно проверить, если
is_logged_in();
?Когда я использую метод
array_intersect
, я получаю предупреждение PHP в журнале ошибок сервера о том, чтоarray_intersect(): Argument #2 не является массивом
. Это потому, что проверяемые пользователи имеют только одну роль?Обычно это должен быть массив. По какой-то причине вам кажется, что это не так.
array_intersect($allowed_roles, (array)$user->roles )
будет работать без проблем.if( current_user_can('editor') || current_user_can('administrator') )