¿permitir que los editores modifiquen los menús?

17 nov 2010, 14:42:00
Vistas: 87.8K
Votos: 56

Me gustaría poder otorgar a mis editores la capacidad de cambiar el menú, ¿es esto posible?

La pestaña de apariencia no parece ser una opción disponible, ¿puedo hacer que lo sea?

0
Todas las respuestas a la pregunta 7
5
75

Agrega esto al archivo functions.php de tu tema:

// otorga al editor el privilegio de editar el tema

// obtiene el objeto del rol
$role_object = get_role( 'editor' );

// añade la capacidad $cap a este objeto de rol
$role_object->add_cap( 'edit_theme_options' );

Actualización (sugerido en los comentarios):

Probablemente no deberías hacer esto en cada solicitud, ya que según mi conocimiento esto causa una escritura en la base de datos. Es mejor hacerlo en el hook admin_init y solo si !$role_object->has_cap('edit_theme_options')

24 feb 2011 15:11:45
Comentarios

¿get_role es una clase?

Mild Fuzz Mild Fuzz
24 feb 2011 15:31:06

@Mild Fuzz - no en sí misma, pero devuelve una instancia de WP_Role

TheDeadMedic TheDeadMedic
14 ago 2011 15:25:21

Probablemente no deberías hacer esto en cada solicitud, ya que esto causa una escritura en la base de datos según lo que entendí. Mejor hacerlo en admin_init y solo if !$role_object->has_cap('edit_theme_options')

jsphpl jsphpl
14 feb 2017 11:14:12

Esta configuración se guarda en la base de datos (en la tabla wp_options, campo wp_user_roles), por lo que podría ser mejor ejecutarla durante la activación del tema/plugin. Consulta https://codex.wordpress.org/Function_Reference/add_cap

Pim Schaaf Pim Schaaf
12 mar 2018 18:46:25

O podrías agregarlo a functions.php, ejecutarlo una vez y luego eliminarlo

d79 d79
17 ene 2019 01:10:39
1
25

EDITO: actualización para WP 4.9 y solo ocultar elementos del menú para Editor

Si deseas que tus usuarios puedan cambiar el menú de navegación, pero no las otras opciones bajo Apariencia: usa esto

// Haz esto solo una vez. Puede ir en cualquier parte dentro de tu archivo functions.php
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );

Puedes comentar todo este código después de haber actualizado tu panel de administración, porque el código anterior realizará cambios persistentes en la base de datos.

Ahora tendrás todas las opciones bajo Apariencia visibles para los editores. Puedes ocultar las otras opciones así:

function hide_menu() {

    if (current_user_can('editor')) {

        remove_submenu_page( 'themes.php', 'themes.php' ); // oculta el submenú de selección de temas
        remove_submenu_page( 'themes.php', 'widgets.php' ); // oculta el submenú de widgets
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // oculta el submenú del personalizador
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // oculta el submenú de fondo


        // estos son específicos del tema. Pueden tener otros nombres o simplemente no existir en tu tema actual.
        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');

Las últimas 3 líneas en la función hide_menu() son específicas para mi tema. Puedes encontrar el segundo parámetro haciendo clic en el submenú que deseas ocultar, en el panel de administración. Tu URL será algo como: ejemplo.com/wp-admin/themes.php?page=yiw_panel

Así que, en este ejemplo, el segundo parámetro para la función remove_submenu_page() será yiw_panel

16 abr 2013 17:51:02
Comentarios

esto también oculta los temas, etc., para los administradores.

JorgeLuisBorges JorgeLuisBorges
15 sept 2017 15:05:50
0
13

En WordPress 3.8, este sería un código mejor que la respuesta aceptada actualmente.

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

Cuando observo la estructura del menú de administración, parece que el enlace nav-menus.php está vinculado a la capacidad edit_theme_options. ¿Puedes modificar el rol de editor para incluir esta capacidad? Esto también les daría la opción de editar widgets, no sé si esto sería un problema. Toda la funcionalidad Ajax de menús está restringida por esta capacidad, así que simplemente cambiar la capacidad del menú de administración para editar menús probablemente no funcione.

17 nov 2010 15:26:34
0

Es 2020, WordPress ya ha superado la versión 5.3, así que pensé en contribuir con una versión actualizada en la que la configuración se guarda solo una vez en la base de datos: al activar el tema, y se elimina cuando el tema se desactiva.

function add_theme_caps(){
  global $pagenow;
  // obtiene el rol de editor
  $role = get_role('editor');

  if ('themes.php' == $pagenow && isset($_GET['activated'])) { 
          // Comprueba si el tema está activado
          // El tema está activado
          // Esto solo funciona porque accede a la instancia de la clase.
          // permitiría al editor editar las opciones del tema
          $role->add_cap('edit_theme_options');
  } else {
         // El tema está desactivado
         // Elimina la capacidad cuando el tema se desactiva
         $role->remove_cap('edit_theme_options');
  }
}
add_action( 'load-themes.php', 'add_theme_caps' );

También prefiero programar en un estilo OOP, así que aquí está una versión OOP:


/**
 * Clase YourClient
 *
 * @author   John Doe
 * @package  YourClient
 * @since    1.0
 */
if (!defined('ABSPATH')) {
    exit;
}
if (!class_exists('YourClient')) {
    /**
     * La clase principal YourClient
     */
    class YourClient
    {
        /**
         * Configura la clase
         */

        public function __construct()
        {
            // Otorga más privilegios al activar el tema
            add_action('load-themes.php', array($this, 'add_theme_caps'));
        }

        function add_theme_caps()
        {
            global $pagenow;

            // obtiene el rol de editor
            $role = get_role('editor');

            if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Comprueba si el tema está activado
                // El tema está activado

                // Esto solo funciona porque accede a la instancia de la clase.
                // permitiría al editor editar las opciones del tema solo para el tema actual
                $role->add_cap('edit_theme_options');
            } else {
                // El tema está desactivado
                // Elimina la capacidad cuando el tema se desactiva
                $role->remove_cap('edit_theme_options');
            }
        }
    }
}

30 mar 2020 18:04:52
0

instala el plugin "User Role Editor" - Activa la opción edit_theme_options - instala el plugin Adminimize - desactiva "Widgets" y "Cambiar Tema" para los Editores ;)

14 abr 2011 10:51:21
0

He descubierto que el menú funcionará de esta manera: instala el plugin "User Role Editor" y allí podrás editar las condiciones para el rol de editor y otros también. Activa la opción edit_theme_options. Pero ahora: verás la opción "menú" dentro de "temas", "widgets".

En mi caso: Después de hacer clic en "menú" (como editor) no veía las opciones rellenadas sino vacías. Así que desactivé el plugin "User Role Editor" y las opciones del "menú" aparecieron correctamente. Ten en cuenta que al desactivar el plugin "User Role Editor" ¡las condiciones para el editor permanecen activas! Me funcionó, quizás también te ayude a ti.

5 ene 2011 14:54:33