разрешить редакторам редактировать меню?

17 нояб. 2010 г., 14:42:00
Просмотры: 87.8K
Голосов: 56

Я хотел бы предоставить моим редакторам возможность изменять меню, возможно ли это сделать?

Вкладка "Внешний вид" вообще не отображается в их панели, можно ли это как-то настроить?

0
Все ответы на вопрос 7
5
75

Добавьте это в файл functions.php вашей темы:

// добавляем редактору привилегию на редактирование темы

// получаем объект роли
$role_object = get_role( 'editor' );

// добавляем $cap возможность этому объекту роли
$role_object->add_cap( 'edit_theme_options' );

Обновление (предложено в комментариях):

Вероятно, не стоит выполнять это при каждом запросе, насколько я знаю, это вызывает запись в базу данных. Лучше использовать хук admin_init и только если !$role_object->has_cap('edit_theme_options')

24 февр. 2011 г. 15:11:45
Комментарии

является ли get_role классом?

Mild Fuzz Mild Fuzz
24 февр. 2011 г. 15:31:06

@Mild Fuzz - сам по себе нет, но он возвращает экземпляр класса WP_Role

TheDeadMedic TheDeadMedic
14 авг. 2011 г. 15:25:21

Вероятно, не стоит делать это при каждом запросе, так как, насколько я понял, это вызывает запись в БД. Лучше на хуке admin_init и только if !$role_object->has_cap('edit_theme_options')

jsphpl jsphpl
14 февр. 2017 г. 11:14:12

Эта настройка сохраняется в базе данных (в таблице wp_options, поле wp_user_roles), поэтому лучше выполнять этот код при активации темы/плагина. Смотрите https://codex.wordpress.org/Function_Reference/add_cap

Pim Schaaf Pim Schaaf
12 мар. 2018 г. 18:46:25

Или вы можете добавить это в functions.php, выполнить один раз и затем удалить

d79 d79
17 янв. 2019 г. 01:10:39
1
25

РЕДАКТИРОВАНО: обновлено для WP 4.9 и скрытия элементов меню только для редакторов

Если вы хотите, чтобы пользователи могли изменять меню навигации, но не другие опции в разделе "Внешний вид", используйте это:

// Выполните это только один раз. Можно разместить в любом месте файла functions.php
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );

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

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

function hide_menu() {

    if (current_user_can('editor')) {

        remove_submenu_page( 'themes.php', 'themes.php' ); // скрыть подменю выбора темы
        remove_submenu_page( 'themes.php', 'widgets.php' ); // скрыть подменю виджетов
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // скрыть подменю кастомизатора
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // скрыть подменю фона


        // эти пункты специфичны для темы. Могут иметь другие названия или просто отсутствовать в вашей текущей теме.
        remove_submenu_page( 'themes.php', 'yiw_panel' );
        remove_submenu_page( 'themes.php', 'custom-header' );
        remove_submenu_page( 'themes.php', 'custom-background' );
    }
}

add_action('admin_head', 'hide_menu');

Последние 3 строки в функции hide_menu() специфичны для моей темы. Вы можете найти второй параметр, кликнув на подменю, которое хотите скрыть, в панели администратора. Тогда ваш URL будет выглядеть примерно так: example.com/wp-admin/themes.php?page=yiw_panel

Таким образом, в этом примере вторым параметром для функции remove_submenu_page() будет yiw_panel

16 апр. 2013 г. 17:51:02
Комментарии

это скрывает темы и прочее даже для администраторов.

JorgeLuisBorges JorgeLuisBorges
15 сент. 2017 г. 15:05:50
0
13

В WordPress 3.8 этот код будет лучше, чем текущий принятый ответ.

/**
 * @var $roleObject WP_Role
 */
$roleObject = get_role( 'editor' );
if (!$roleObject->has_cap( 'edit_theme_options' ) ) {
    $roleObject->add_cap( 'edit_theme_options' );
}
9 янв. 2014 г. 09:39:30
0

Когда я смотрю на структуру меню админки, кажется, что ссылка на nav-menus.php привязана к capability edit_theme_options. Можешь изменить роль редактора, чтобы включить эту capability? Это также даст им возможность редактировать виджеты, не знаю, станет ли это проблемой? Все Ajax-действия с меню ограничены этой capability, поэтому простое изменение capability в админ-меню для редактирования меню, скорее всего, не сработает.

17 нояб. 2010 г. 15:26:34
0

2020 год, WordPress уже вышел за версию 5.3, поэтому я решил внести обновлённую версию, в которой настройка сохраняется в базе данных только один раз — при активации темы, и удаляется при её деактивации.

function add_theme_caps(){
  global $pagenow;
  // получаем роль редактора
  $role = get_role('editor');

  if ('themes.php' == $pagenow && isset($_GET['activated'])) { 
          // Проверяем, активирована ли тема
          // Тема активирована
          // Это работает только потому, что обращается к экземпляру класса
          // позволяет редактору изменять настройки темы
          $role->add_cap('edit_theme_options');
  } else {
         // Тема деактивирована
         // Удаляем возможность при деактивации темы
         $role->remove_cap('edit_theme_options');
  }
}
add_action( 'load-themes.php', 'add_theme_caps' );

Я также предпочитаю программировать в ООП-стиле, поэтому вот ООП-версия:


/**
 * Класс YourClient
 *
 * @author   John Doe
 * @package  YourClient
 * @since    1.0
 */
if (!defined('ABSPATH')) {
    exit;
}
if (!class_exists('YourClient')) {
    /**
     * Основной класс YourClient
     */
    class YourClient
    {
        /**
         * Настройка класса
         */

        public function __construct()
        {
            // Даём больше привилегий при активации темы
            add_action('load-themes.php', array($this, 'add_theme_caps'));
        }

        function add_theme_caps()
        {
            global $pagenow;

            // получаем роль редактора
            $role = get_role('editor');

            if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Проверяем, активирована ли тема
                // Тема активирована

                // Это работает только потому, что обращается к экземпляру класса.
                // позволяет редактору изменять записи других пользователей только для текущей темы
                $role->add_cap('edit_theme_options');
            } else {
                // Тема деактивирована
                // Удаляем возможность при деактивации темы
                $role->remove_cap('edit_theme_options');
            }
        }
    }
}

30 мар. 2020 г. 18:04:52
0

установите плагин "User Role Editor" - включите edit_theme_options - установите плагин Adminimize - отключите "Виджеты" и "Смена темы" для редакторов ;)

14 апр. 2011 г. 10:51:21
0

Я обнаружил, что ваше меню будет работать следующим образом: установите плагин "User Role Editor" и там вы сможете редактировать условия для роли редактора и других. Включите опцию edit_theme_options. Но теперь: вы увидите пункт "меню" в разделе "темы", "виджеты".

В моем случае: после клика на "меню" (как редактор) я не видел заполненные опции, а только пустые. Поэтому я деактивировал плагин "User Role Editor", и заполненные опции для "меню" появились правильно. Важно отметить, что деактивация плагина "User Role Editor" сохраняет активными условия для редактора! Это сработало для меня, возможно, поможет и вам.

5 янв. 2011 г. 14:54:33