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


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

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

 50
Author: Mild Fuzz, 2010-11-17

7 answers

Добавьте это в свою тему functions.php:

// add editor the privilege to edit theme

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

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

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

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

 62
Author: T.Todua, 2020-11-23 13:45:11

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

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

// Do this only once. Can go anywhere inside your functions.php file
$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' ); // hide the theme selection submenu
        remove_submenu_page( 'themes.php', 'widgets.php' ); // hide the widgets submenu
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // hide the customizer submenu
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // hide the background submenu


        // these are theme-specific. Can have other names or simply not exist in your current theme.
        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_панель

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

 19
Author: Jules, 2017-11-17 14:14:09

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

/**
 * @var $roleObject WP_Role
 */
$roleObject = get_role( 'editor' );
if (!$roleObject->has_cap( 'edit_theme_options' ) ) {
    $roleObject->add_cap( 'edit_theme_options' );
}
 13
Author: BenFreke, 2014-01-09 07:39:30

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

 3
Author: Jan Fabry, 2010-11-17 13:26:34

Установите плагин "Редактор ролей пользователя" - Включите опции edit_theme_options - установите плагин Adminimize - отключите "Виджеты" и "Переключите тему" для редакторов;)

 2
Author: , 2011-04-14 07:51:21

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

function add_theme_caps(){
  global $pagenow;
  // gets the author role
  $role = get_role('editor');

  if ('themes.php' == $pagenow && isset($_GET['activated'])) { 
          // Test if theme is activated
          // Theme is activated
          // This only works, because it accesses the class instance.
          // would allow the editor to edit the theme options
          $role->add_cap('edit_theme_options');
  } else {
         // Theme is deactivated
         // Remove the capability when theme is deactivated
         $role->remove_cap('edit_theme_options');
  }
}
add_action( 'load-themes.php', 'add_theme_caps' );

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


/**
 * YourClient Class
 *
 * @author   John Doe
 * @package  YourClient
 * @since    1.0
 */
if (!defined('ABSPATH')) {
    exit;
}
if (!class_exists('YourClient')) {
    /**
     * The main YourClient class
     */
    class YourClient
    {
        /**
         * Setup class
         */

        public function __construct()
        {
            // Give more privileges on Theme Activation
            add_action('load-themes.php', array($this, 'add_theme_caps'));
        }

        function add_theme_caps()
        {
            global $pagenow;

            // gets the author role
            $role = get_role('editor');

            if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Test if theme is activated
                // Theme is activated

                // This only works, because it accesses the class instance.
                // would allow the author to edit others' posts for current theme only
                $role->add_cap('edit_theme_options');
            } else {
                // Theme is deactivated
                // Remove the capability when theme is deactivated
                $role->remove_cap('edit_theme_options');
            }
        }
    }
}

 1
Author: pixeline, 2020-03-30 15:04:52

Я обнаружил, что ваше меню будет работать следующим образом: установите плагин " Редактор ролей пользователя", и там вы можете редактировать условия для роли редактора и другие. Включите опцию edit_theme_options. Но теперь: вы увидите "меню" - опцию в разделе "темы", "виджеты". Для меня: После нажатия кнопки "меню" (в качестве редактора) Я не вижу заполненных опций, но пустых. Таким образом, идентификатор деактивирует плагин "Редактор ролей пользователя", и заполненные параметры для "меню" отображаются правильно. Обратите внимание, что деактивация плагина "Редактор ролей пользователя" остается условия для активного редактора! Хорошо для меня, может быть, это поможет и тебе

 0
Author: , 2011-01-05 12:54:33