¿Cómo puedo modificar la capacidad necesaria para acceder a las opciones de un plugin?
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.

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.

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.

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.

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
.

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).

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. :)
