WordPress SEO by Yoast: Ocultar Meta Boxes en Entradas para No-administradores
Tengo un sitio web con múltiples autores y no me siento cómodo permitiendo que todos los miembros ingresen detalles SEO en las entradas que publican. Me gustaría que esto solo fuera visible para el Administrador del sitio. ¿Alguna idea?
No decía en la documentación de la API del sitio del plugin Yoast SEO cuál era el ID
y no tengo una copia de Yoast instalada a mano, pero según yoas-plugin-dir/admin/class-metabox.php
línea 144, el meta_box registrado es;
add_meta_box( 'wpseo_meta', ...etc ); ...
Que está enganchado al hook add_meta_boxes
en la línea 32 del mismo archivo,
add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
Por supuesto podrías obtener el ID del meta box directamente en la pantalla de edición de entradas... En fin.
Puedes hacer lo siguiente,
add_action('add_meta_boxes', 'yoast_is_toast', 99);
function yoast_is_toast(){
//la capacidad 'manage_plugins' equivale a administrador, por lo tanto si NO es administrador
//oculta el meta box para todos los demás roles en el siguiente 'post_type'
//como post, page, custom_post_type, etc
if (!current_user_can('activate_plugins')) {
remove_meta_box('wpseo_meta', 'post_type', 'normal');
}
}
...donde post type es el tipo de contenido al que deseas aplicar esta restricción, como post
o uno o más tipos de contenido personalizados.
Debería funcionar.
actualización: manage_plugins
debería haber sido activate_plugins
- corregido.

@Ahmad M gracias por la edición sugerida pero la variable $post_type
y el parámetro de acción no son necesarios en este caso y no generan aviso/error. Además si incluyes la variable $post_type
necesitas definir el tipo de post dentro de la función en otro lugar, lo cual no hiciste, ¡así que el usuario tendría que ejecutar esto para que funcione incorrectamente! En este caso es perfectamente aceptable pasar directamente el nombre del tipo de post, es decir, como 'post'
dentro de la función remove_meta_box
. De todos modos gracias por la sugerencia.

@userabuser: Gracias por la aclaración, pero $post_type
ya está definida y lista para ser usada por las funciones del hook de acción add_meta_boxes
, por favor revisa la vista fuente de Adam Brown de este hook de acción. Utilizar $post_type
en este caso hará que el código sea independiente de la pantalla de edición del post_type
, lo que significa que eliminará la caja meta wpseo_meta
de todos los tipos de post donde se encuentre, y no devolverá nada en caso de que wpseo_meta
no se encuentre.

@AhmadM Gracias compañero. Soy consciente de que la variable ya está definida, sin embargo eso no la convierte en un requisito para pasarla al hook/función. En este caso, el OP quiere eliminar el meta box del post_type post
, por lo que la solución inicial permitirá un control granular. Sin embargo, en el caso de que quieras eliminarlo para todos los post types, entonces usar la variable ya definida $post_type
es satisfactorio. Lo que haré es editar mi respuesta para incluir tu ejemplo adicional usando la variable $post_type
para situaciones donde alguien pueda querer aplicar esto a todos los post_types registrados.

Prueba pegar esto en un plugin o en el archivo functions.php
del tema, según el plugin WordPress SEO (Documentación de la API), por Yoast.
if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
add_filter('wpseo_use_page_analysis', '__return_false');
}
Para evitar errores... Esto verifica que la función exista antes de intentar ocultar elementos, permitiéndote desactivar el plugin sin generar errores.
Puede que necesites engancharte al hook init
para que esto funcione correctamente, lo cual se puede hacer así:
function wpse_init(){
if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
add_filter('wpseo_use_page_analysis', '__return_false');
}
}
add_action('init', 'wpse_init');

Puedes eliminarlo usando la función remove_meta_box.
if ( ! current_user_can( 'edit_pages' ) ) {
add_action( 'add_meta_boxes', 'my_remove_wp_seo_meta_box', 100000 );
}
function my_remove_wp_seo_meta_box() {
remove_meta_box( 'wpseo_meta', 'post', 'normal' );
}
Observa el 100000 en el add_action, esto asegura que se ejecute después de que el metabox de WP SEO haya sido enganchado.

Puedes usar el plugin Adminimize para ocultar elementos a los usuarios dependiendo de sus roles. Yo mismo lo he usado para ocultar algunas cosas de Yoast SEO a los clientes y simplificar el backend.
http://wordpress.org/extend/plugins/adminimize/
Es bastante sencillo de usar añadiendo los selectores CSS de los elementos que quieres ocultar. Lo he utilizado para ocultar las pestañas de Análisis SEO de página (#linkdex)

Existe una opción de configuración en WordPress SEO by Yoast para desactivar la parte avanzada de los ajustes de WordPress SEO para usuarios que no son administradores. Si deseas desactivar completamente el cuadro, puedes utilizar otros plugins para eliminar elementos de la página del editor de entradas para no administradores, por ejemplo, eliminar el cuadro de WordPress SEO del editor de entradas para no administradores.
