Cómo habilitar un tipo de entrada personalizada para un rol de usuario personalizado en WordPress
He creado un tipo de entrada personalizada llamado Course Documents usando el plugin de WordPress Custom Post Type UI. También, he creado un nuevo rol de usuario llamado Teacher.
add_role('rpt_teacher',
'Teacher',
array(
'read' => true, // permitir lectura
'edit_posts' => false, // no permitir edición de entradas
'delete_posts' => false, // no permitir eliminar entradas
'publish_posts' => false, // no permitir publicar entradas
'upload_files' => true, // permitir subir archivos
)
);
Y ahora quiero habilitar el tipo de entrada personalizada en el menú de navegación del panel de profesor. He usado el siguiente código en mi functions.php pero no sucede nada. ¿Cómo puedo resolver mi problema?
add_action('admin_init','rpt_add_role_caps',999);
/**
añadir capacidades de profesores
*/
function rpt_add_role_caps() {
// Agregar los roles que deseas que administren los tipos de entrada personalizados
$roles = array('rpt_teacher','editor','administrator');
// Recorrer cada rol y asignar capacidades
foreach($roles as $the_role) {
$role = get_role($the_role);
$role->add_cap( 'read' );
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'delete_published_course_documents' );
}
}

No creo que el plugin agregue las capacidades que estás usando en add_cap
al registrar el tipo de publicación.
Puedes modificar el tipo de publicación registrado agregando código al archivo functions.php
del tema. Puedes hacer algo como esto:
/**
* Sobrescribir argumentos del tipo de publicación personalizado registrado por el plugin
*/
add_filter( 'register_post_type_args', 'change_capabilities_of_course_document' , 10, 2 );
function change_capabilities_of_course_document( $args, $post_type ){
// No filtrar ningún otro tipo de publicación
if ( 'course_document' !== $post_type ) {
// Devolver los argumentos originales a otros tipos de publicación
return $args;
}
// Cambiar las capacidades del tipo de publicación "course_document"
$args['capabilities'] = array(
'edit_post' => 'edit_course_document',
'edit_posts' => 'edit_course_documents',
'edit_others_posts' => 'edit_other_course_documents',
'publish_posts' => 'publish_course_documents',
'read_post' => 'read_course_document',
'read_private_posts' => 'read_private_course_documents',
'delete_post' => 'delete_course_document'
);
// Devolver los argumentos modificados para course_document
return $args;
}
Luego puedes hacer:
/**
* Agregar capacidades al rol de profesor
*/
add_action('admin_init','rpt_add_role_caps',999);
function rpt_add_role_caps() {
$role = get_role('teacher');
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_other_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'read_private_course_documents' );
$role->add_cap( 'delete_course_document' );
}
No necesitas agregar capacidades al administrador y editor porque el capability_type
es post
por defecto al registrar un Tipo de Publicación Personalizado a través de este plugin. Puedes cambiarlo si prefieres tener un capability_type
personalizado basado en otro tipo de publicación.
Nota: Asegúrate de que Mostrar en Menú
esté configurado como true
. Por defecto es true
en este plugin.

¡Perfecto, gracias! Un detalle que encontré:
"Si estás definiendo un rol personalizado y agregando capacidades al rol usando add_role(), ten en cuenta que modificar el array de capacidades y volver a ejecutar add_role() no necesariamente actualizará el rol con la nueva lista de capacidades. La función add_role() se interrumpe si el rol ya existe en la base de datos. La solución en este caso es preceder tu llamada a add_role() con una llamada a remove_role() que apunte al rol que estás agregando." https://codex.wordpress.org/Function_Reference/add_role#Delete_existing_role

Desde mi punto de vista, vas por buen camino. Has creado un usuario y le has asignado nuevas capacidades. Solo te faltó especificar que las nuevas capacidades se utilizarán para editar tu tipo de publicación personalizado.
Nunca he usado un plugin para crear un tipo de publicación personalizado, así que no estoy seguro de cómo hacerlo usando un plugin. Pero si estás dispuesto a crear tu CPT mediante código, puedes usar lo siguiente:
add_action( 'init', 'psp_register_cpt_projects');
function psp_register_cpt_projects() {
$args = array(
'label' => __( 'course_documents', 'course_documents' ),
'description' => __( 'Course document', 'course_document' ),
'supports' => array( 'title', 'comments', 'revisions', ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'capability_type' => array('course_document','course_documents'),
'map_meta_cap' => true,
);
register_post_type( 'course_documents', $args );
}
Nota: Este es solo un código básico para crear un CPT. Por favor lee este documento en el codex para entenderlo a fondo.
Déjame saber si esto te ayuda.

Acabo de permitir que todos los usuarios aparezcan en la selección de 'Autor':
add_filter( 'wp_dropdown_users_args', 'add_subscribers_to_dropdown', 10, 2 );
function add_subscribers_to_dropdown( $query_args, $r ) {
$query_args['who'] = '';
return $query_args;
}

Una sola cosa en la que pasé un par de horas y vale la pena mencionar. Si tienes capacidades personalizadas y quieres actualizar los permisos de un rol personalizado, no lo hagas en la función add_role.
Por ejemplo, esto no actualizará el rol porque ya existe:
$role = add_role(
'client',
'Client',
array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
CAP_READ_ADDRESS => true,
CAP_DELETE_ADDRESS => true,
CAP_EDIT_OTHER_ADDRESSES => true,
CAP_READ_PRIVATE_ADDRESS => true,
CAP_EDIT_ADDRESSES => true,
CAP_PUBLISH_ADDRESS => true,
CAP_EDIT_ADDRESS => true
)
Después de cualquier actualización de capacidades, mi rol de cliente no se actualizará porque ya existe.
La forma más segura de agregar capacidades personalizadas a un rol personalizado es obtener el rol y agregarlas después de add_role
function addCaps() {
$role = get_role('client');
$role->add_cap(CAP_READ_ADDRESS, true);
$role->add_cap(CAP_EDIT_ADDRESSES, true);
}
add_action('admin_init', 'addCaps');
