¿Cómo puedo modificar la capacidad necesaria para acceder a las opciones de un plugin?

28 jul 2014, 14:02:43
Vistas: 19.4K
Votos: 5

Tengo los siguientes 3 roles diferentes: Admin, Editor y SEO. He instalado WordPress SEO by Yoast, y quiero lograr esto:

  • No quiero que los editores vean las opciones de SEO, porque solo escriben posts y no saben de SEO. Hay una persona con el rol SEO que se encargará de la optimización.
  • No quiero que la persona de SEO vea opciones de otros plugins. Solo quiero que tenga las mismas capacidades que los Editores, pero con las funciones de SEO habilitadas.

He estado probando con algunos fragmentos de código de este sitio, y puedo ocultar el meta box a los Editores, pero no el pequeño 'cuadro de valoración' sobre el botón de Publicar.

Tampoco sé cómo resolver el segundo punto, porque todos los plugins usan la misma capacidad manage_options, así que no puedo asignar esa capacidad al rol SEO. Y no sé cómo cambiar la capacidad necesaria sin modificar los archivos del plugin (lo que se perdería al actualizar).

Gracias de antemano.

3
Comentarios

usa manage_options para SEO, luego establece reglas para el rol de SEO desde el functions.php de tu tema para denegar el acceso a otras páginas de administración de plugins. Puedes redirigir esas páginas a una página 404.

тнє Sufi тнє Sufi
28 jul 2014 15:45:12

Podría ser una solución @тнєSufi. Estaba investigando sobre ocultar opciones de menú con remove_menu_page, y obtuve algunos resultados. Sé que no previene el acceso pero es algo visual en este caso.

Elías Gómez Elías Gómez
29 jul 2014 16:58:24

sí, no lo previene. Pero puedes redirigir esas páginas a una 404, así cualquier persona con rol de SEO que intente acceder a esas páginas mediante URL directa verá una página 404.

тнє Sufi тнє Sufi
29 jul 2014 21:19:13
Todas las respuestas a la pregunta 3
2

Quizás este no sea el mejor método porque le da acceso a un editor a Configuración y Opciones, pero lo que hace es darle permisos a un editor específico (basado en ID de usuario) para editar opciones. Luego verificamos si estamos cargando una de las plantillas de opciones, si es así Y el ID de usuario coincide con el ID al que le dimos permisos, detenemos el proceso y mostramos un mensaje.

1) Lo primero es lo primero, crea tu usuario SEO y asígnale el rol de Editor.

2) Luego necesitamos darle a este usuario la habilidad de manage_options. Puedes encontrar esto editando el usuario y mirando la URL, debería ser uno de los últimos parámetros en la URL.

/** Dar permisos a nuestro SEO **/
function give_seo_yoastToast() {
    $user = new WP_User( $seo_user_id );
    $user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');

3) Ahora necesitamos asegurarnos de que nuestro chico SEO no pueda acceder a ninguna de las opciones críticas. Hasta donde sé, las páginas abajo son la única forma en que este usuario puede editar información crucial. SI ven estas páginas, lo detenemos y mostramos un mensaje, siéntete libre de cambiar el mensaje.

/** Remover acceso a ciertas páginas **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
    $currID = is_user_logged_in() ? get_current_user_id() : 0;

    if($currID == $seo_user_id ){
        wp_die("Hubo un agujero aquí una vez, ya no está.");
        exit();
    }
}

4) Ahora mismo, él puede ver las páginas en el menú pero cuando accede a ellas ve el mensaje de arriba. Como un paso extra, eliminemos esta página de nuestro menú. Por favor nota que si eliminas la página del menú sin la función de arriba, un usuario astuto podría ir a cualquiera de las páginas de opciones directamente via URL.

/** Remover página de Configuración del menú para el SEO **/
function seo_guy_menu() {
    if(!current_user_can('administrator')){
        remove_menu_page('options-general.php');
    }
}
add_action('admin_menu', 'seo_guy_menu');

5) ¡Y listo!

Desafortunadamente como mencionaste en tu pregunta, Yoast no parece tener una capacidad para darle a un usuario permisos específicos para todas las cosas de SEO sin darles permisos innecesarios extra también lo cual es una lástima. Y como otro comentario, podrías en lugar de usar un $seo_user_id estático crear un Rol SEO, darle a ese rol permisos de editor junto con lo de arriba. Eso es un poco más de trabajo (no demasiado) pero si solo tienes un chico haciendo tu SEO para siempre entonces el método de arriba está bien supongo.

28 jul 2014 18:10:48
Comentarios

Gracias por el punto 3. No lo necesito ahora pero podría ser útil en el futuro. Logré ocultar el 'cuadro de valoración' con una función condicional y CSS. Es solo un problema visual, así que funciona.

Elías Gómez Elías Gómez
29 jul 2014 17:04:38

Ten en cuenta que WP_User->add_cap escribirá en la base de datos, por lo que genera una sobrecarga innecesaria al tener esto enganchado en admin_init en: add_action( 'admin_init', 'give_seo_yoastToast');

En cambio, el Codex recomienda ejecutar esto durante la activación del tema/plugin. Por ejemplo:

add_action("after_switch_theme", "your_add_cap_function");

y

add_action('switch_theme', 'your_remove_cap_function');

O ejecutarlo una vez y desactivar el código.

Pim Schaaf Pim Schaaf
4 dic 2015 15:57:24
3

La mejor manera de cambiar el permiso que los usuarios necesitan para ver las páginas de configuración de Yoast SEO es utilizando el filtro wpseo_manage_options_capability.

Aquí hay un ejemplo de cómo se utiliza (colocado en tu archivo functions.php):

/**
 * Devuelve el permiso que los usuarios necesitan para ver las páginas de configuración de Yoast SEO.
 *
 * @return mixed|void
 */
function mi_personalizacion_wpseo_manage_options_capability() {

    $permiso_gestion_opciones = 'edit_others_posts';

    return $permiso_gestion_opciones;
}
add_filter( 'wpseo_manage_options_capability', 'mi_personalizacion_wpseo_manage_options_capability' );

En el ejemplo anterior, se utiliza el permiso edit_others_posts para que (en una instalación predeterminada de WordPress) tanto los Editores como los Administradores puedan acceder a la configuración de Yoast SEO.

En tu caso, donde no deseas que los Editores "normales" tengan acceso, necesitarás crear un nuevo rol (por ejemplo, 'SEO') que tenga las mismas capacidades que un Editor, más un permiso personalizado adicional (por ejemplo, manage_wpseo_options) que pueda usarse en la función anterior en lugar de edit_others_posts.

El plugin Members de Justin Tadlock te permite crear fácilmente nuevos roles y permisos para esto.

Nota: Esto puede no funcionar en Multisitio debido a este problema.


Actualización: En Yoast SEO v5.5+, el filtro wpseo_manage_options_capability ha sido renombrado a wpseo_manage_options.

13 sept 2016 17:35:07
Comentarios

¿qué hace la parte @return mixed|void?

Mau Mau
14 ago 2017 05:12:34

La etiqueta @return se utiliza para documentar el valor de retorno de funciones o métodos cuando se usa phpDocumentor. @return mixed|void simplemente significa que el valor devuelto por la función podría ser de cualquier tipo, o void (es decir, no devuelve ningún valor).

Matt Sims Matt Sims
14 ago 2017 11:53:02

Esta debería ser la respuesta elegida.

Matthew Clark Matthew Clark
14 sept 2017 16:53:07
0

Acabo de encontrar una solución muy sencilla. Si aún no lo has hecho, instala algún tipo de plugin de gestión de capacidades. Luego, crea una nueva capacidad desde el gestor de capacidades, llámala "CUSTOM_CAPABILITY_NAME" o como prefieras. Después, asígnala a un rol o usuario específico.

Importante: copia y haz backup de cualquier archivo que vayas a modificar por si lo estropeas, siempre podrás restaurar el original.

Luego, en el servidor real, necesitas navegar por los directorios hasta wp-content/plugins/ y luego usar grep para encontrar todos los archivos que contengan 'manage_options'.

Ejemplo: grep 'manage_options' */*

La parte complicada es que tendrás que encontrar la función principal que añade el menú o submenú al panel de control. Aquí tienes mis dos ejemplos para acceso específico a Yoast SEO.

$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );


add_submenu_page( 'wpseo_dashboard', __( 'Configuración WooCommerce SEO', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(

PD - no cambies nada que empiece por '$' - eso es una variable. :)

9 abr 2016 01:57:15