Cómo habilitar un tipo de entrada personalizada para un rol de usuario personalizado en WordPress

4 ene 2018, 06:42:04
Vistas: 23.4K
Votos: 5

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' );
        }
        }
0
Todas las respuestas a la pregunta 4
1
15

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.

4 ene 2018 08:25:52
Comentarios

¡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

00-BBB 00-BBB
23 may 2019 19:02:57
1

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.

4 ene 2018 07:17:17
Comentarios

Sí. Cuando creo un tipo de publicación personalizada, uso tu sugerencia. Pero hay muchos tipos de publicaciones personalizadas en este proyecto que fueron creados por otro desarrollador y no quiero reescribirlos todos como mencionaste.

ashanrupasinghe ashanrupasinghe
4 ene 2018 12:03:10
0

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;
}
3 ene 2020 13:53:48
0

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');
1 dic 2021 13:05:16