Soporte » WordPress Avanzado » Permisos para editar posts de otro autor

  • Resuelto inigonz

    (@inigonz)


    Buenos días,

    He creado un cpt, proyect, con sus capabilities:

    
    'edit_post' => 'edit_proyecto',
    'read_post' => 'read_proyecto',
    'delete_post' => 'delete_proyecto',
    'edit_posts' => 'edit_proyectos',
    'edit_others_posts' => 'edit_others_proyectos',
    'publish_posts'	=> 'publish_proyectos',
    'read_private_posts' => 'read_private_proyectos',
    'create_posts' => 'edit_proyectos',
    'delete_posts' => 'delete_proyectos',
    'delete_others_posts' => 'delete_others_proyectos'
    

    Mi objetivo, es que los usuarios puedan crear o editar los proyectos que pertenezcan a las categorías asignadas. En las opciones de tema, he creado una pagina donde me lista todos los usuarios y las categorías que hay, ahí selecciono a que categoría puede acceder cada usuario.

    En el functions.php añado esta función:

    
    add_filter( 'map_meta_cap', 'postTypes_meta_cap', 10, 4 );
    function postTypes_meta_cap( $caps, $cap, $user_id, $args ) {
       if ( 'edit_proyecto' == $cap || 'delete_proyecto' == $cap || 'read_proyecto' == $cap ) 
       {
    	$post 		= get_post( $args[0] );
    	$post_type 	= get_post_type_object( $post->post_type );
    	$caps 		= array(); // vaciar $caps
    	$permisos 	= of_get_option( $user_id . 'permisos' );
    	$term 		= get_the_terms( $post, 'mercado' );
       }
    
       if ( 'edit_proyecto' == $cap ) {
    	if ( $user_id == $post->post_author || $permisos[$term[0]->term_id] == 1 ) {
    // Aqui le pregunto si es el autor o si ese user pertenece a esa categoria
                    $caps[] = $post_type->cap->edit_posts;
    	} else {
    		$caps[] = $post_type->cap->edit_others_posts;
    	}
       }
       .....
    
       return $caps;
    

    Todos los usuarios tienen los roles:

    
     $role->add_cap( 'edit_proyectos' );
     $role->add_cap( 'publish_proyectos' );
     $role->add_cap( 'delete_proyectos' );
    
     'read' => true,
     'upload_files' => true,
     'edit_theme_options' => true,
     'gmedia_library' => true,
     'gmedia_upload' => true,
     'gmedia_import' => true,
     'gmedia_edit_media' => true,
     'gmedia_delete_media' => true,
     'gmedia_album_manage' => true,
     'gmedia_tag_manage' => true,
    

    Si no soy el autor del proyecto, me dejar editarlo sin problemas, pero cuando le doy a guardar, me salta el error «Lo siento, no tienes permisos para editar entradas con este usuario.»

    No se porque me falla, he probado de todo,
    – a poner el cap «edit_other_posts», pero entonces me deja editar aunque no pertenezca a la categoría
    – a poner «map_meta_cap => true», que he leído que había que ponerlo pero me da error
    – a poner los cap «edit_proyecto, read_proyecto, delete_proyecto»
    ,… ya no se me ocurre nada mas, a ver si me podéis echar una mano. Muchas gracias por ayuda.

    Un saludo

Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)
  • ¿Podrías darnos un código que podamos utilizar tal cual para reproducir la situación?

    Buenas,

    Si, a ver como queda:

    
    // CPT PROYECTO
    $pr_labels = array(
    	'name' => __( 'Proyectos' ),
    	'singular_name' => __( 'Proyecto' ),
    	'add_new' => __( 'Añadir nuevo' ),
    	'add_new_item' => __( 'Añadir nuevo Proyecto' ),
    	'edit_item' => __( 'Editar Proyecto' ),
    	'new_item' => __( 'Nuevo Proyecto' ),
    	'view_item' => __( 'Ver Proyecto' ),
    	'search_items' => __( 'Buscar Proyecto' ),
    	'not_found' => __( 'No se encontraron Proyectos' ),
    	'not_found_in_trash' => __( 'No se encontraron Proyectos en la papelera' )
    );
    
    $pr_args = array(
    	'labels' => $pr_labels,
    	'public' => true,
    	'publicly_queryable' => true,
    	'show_ui' => true,
    	'show_in_menu'	=> true,
    	'show_in_nav_menus' => true,
    	'menu_position ' => 20,
    	'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'post-formats', 'revisions', 'author' ),
    	'capability_type' => 'proyecto',
    	'capabilities' => array(
    	        'edit_post' => 'edit_proyecto',
    	        'read_post' => 'read_proyecto',
    		'delete_post' => 'delete_proyecto',
    		'edit_posts' => 'edit_proyectos',
    		'edit_others_posts' => 'edit_others_proyectos',
    		'publish_posts'	=> 'publish_proyectos',
    		'read_private_posts' => 'read_private_proyectos',
    		'create_posts' => 'edit_proyectos',
    		'delete_posts' => 'delete_proyectos',
    		'delete_others_posts' => 'delete_others_proyectos',
    	),
    	//'map_meta_cap' => true,
    	'hierarchical'	=> false,
    	'has_archive' => true,
    		'rewrite' => array(
    		'slug'	=> $cpt_pr,
    		/*'hierarchical' => true,
    		'with_front' => false*/
    	),
    	'menu_icon' => 'dashicons-screenoptions'
    );
    
    $pr_args = apply_filters( 'proyecto_args', $pr_args );
    register_post_type( 'proyecto', $pr_args );
    
    
    // Crear Rol para los Recas
    $caps = array(
                'read'         => true,
                'upload_files'     => true,
                'edit_theme_options'   => true,
                'gmedia_library'       => true,
                'gmedia_upload'  => true,
                'gmedia_import'  => true,
                'gmedia_edit_media' => true,
                'gmedia_delete_media'  => true,
                'gmedia_album_manage'  => true,
                'gmedia_tag_manage' => true,
    );
    add_role( 'reca', 'Reca', $caps );
    
    function add_theme_caps_postTypes() {
    	$role 	= get_role( 'reca' );
    	$cpts 	= array( 'proyectos' );
    
            foreach ( $cpts as $cpt ) {
    		$role->add_cap( 'edit_' . $cpt );
    		//$role->add_cap( 'edit_others_' . $cpt );
    		$role->add_cap( 'publish_' . $cpt );
    		$role->add_cap( 'delete_' . $cpt );
    	}
    }
    add_action( 'admin_init', 'add_theme_caps_postTypes');
    
    
    // Funcion que da permisos para leer/escribir/eliminar a los proyectos
    add_filter( 'map_meta_cap', 'postTypes_meta_cap', 10, 4 );
    function postTypes_meta_cap( $caps, $cap, $user_id, $args ) {
    	// Si es una capacidad meta tipo "proyecto", obtener el post y el objeto del post type que se utilizará más adelante
    	if ( 'edit_proyecto' == $cap || 'delete_proyecto' == $cap || 'read_proyecto' == $cap ) {
    	        $post 		= get_post( $args[0] );
    		$post_type 	= get_post_type_object( $post->post_type );
    
    		$caps 		= array(); // vaciar $caps
    		$permisos 	= of_get_option( $user_id . 'permisos' );
    		$term 		= get_the_terms( $post, 'mercado' );
    	}
    
    	// Si se va a editar un "proyecto", asignar las capacidades correspondientes
    	if ( 'edit_proyecto' == $cap ) {
    		if ( $user_id == $post->post_author || $permisos[$term[0]->term_id] == 1 ) {
    			// Si el usuario es el autor del post, comprobar si el usuario tiene la capaciad edit_posts
    			$caps[] = $post_type->cap->edit_posts;
    		} else {
    			// Si el usuario no es el autor del post, comprobar si el usuario tiene la capacidad edit_others_posts
    			$caps[] = $post_type->cap->edit_others_posts;
    		}
    	}
    
    	// Si se va a borrar un proyecto
    	if ( 'delete_proyecto' == $cap ) {
    		if ( $user_id == $post->post_author || $permisos[$term[0]->term_id] == 1 ) {
    			$caps[] = $post_type->cap->delete_posts;
    		} else {
    			$caps[] = $post_type->cap->delete_others_posts;
    		}
    	}
    
    	// Si se va a leer un proyecto privado
    	if ( 'read_proyecto' == $cap ) {
    		if ( 'private' != $post->post_status ) {
    			$caps[] = 'read';
    		} elseif ( $user_id == $post->post_author || $permisos[$term[0]->term_id] == 1 ) {
    			$caps[] = 'read';
    		} else {
    			$caps[] = $post_type->cap->read_private_posts;
    		}
    	}
    
    	// Devolver las capacidades que debe tener el usuario
    		return $caps;
    }
    

    Lo de los permisos, es con el options framework

    Si necesitais alguna cosa mas me decis, gracias.

    Nada más copiar el primer bloque de código me aparecen errores PHP fatales. También hay cosas que faltarían, como asignar el role reca a los usuarios, registrar la taxonomía mercado, etc. Así que sigo igual que antes, no veo nada evidente y no es posible reproducir la situación con el código que pones.

    Si fueras capaz de poner un código que se pueda utilizar de forma directa para reproducir el problema, mucho mejor y seguro que mucha más gente se animaría a mirar que pasa (es tan solo un consejo para obtener mejor y más ayuda).

    Intentaré luego reconstruir la situación, aunque hará falta un buen rato y a ver si lo puedo sacar. No prometo nada.

    • Esta respuesta fue modificada hace 2 años, 9 meses por cybmeta.

    De todas formas, pensando en el tema, no creo que sea algo fácil y directo de conseguir, permisos de usuarios controlados en función de términos de una taxonomía asignados a un post es algo un tanto peculiar, unas necesidades muy concretas, y tengo dudas sobre si se puede conseguir fácilmente.

    • Esta respuesta fue modificada hace 2 años, 9 meses por cybmeta.

    OK, muchas gracias por la respuesta.

    A mi el código que he puesto lo pego en mi functions.phpp y me funciona perfectamente, hay una variable ($cpt_pr) que me ha quedado colgando, pero si se sustituye por proyecto funciona.

    Asignar el rol reca a los usuarios, no lo hago por código, lo hago desde el admin, al crear el usuario.

    Todo esto que quiero conseguir es porque tengo en mi web, diferentes usuarios y no quiero que por error puedan editar los proyectos de los otros usuarios, a no ser que pertenezcan a la misma categoría.

    Saludos

    Me ha costado, pero he reproducido el error. Y todo para llegar a que WordPress comprueba la capacidad edit_others_posts antes de guardar el post. Y si el autor y el usuario actual no son el mismo, y el usuario actual no puede edit_others_posts, no hay nada que hacer. Archivo wp-admin/includes/post.php, líneas 66-67.

    Así de pronto, se ocurren pocas soluciones. Una sería pasar la taxonomía a otro post type, y poner el post_parent en los proyectos al post type que hace de «taxonomía»; así se pueden mapear las capacidades de un post type al de post padre fácilmente. Esto hacen, por ejemplo, bbPress con los foros, los mensajes y los moderadores: foros y mensajes son post types y hay moderadores de mensajes por foros.

    A lo mejor hay algo más sencillo que no conozco, pero a estas horas no se me viene nada a la cabeza.

    O igual te interesa simplemente un plugin de terceros para gestión de proyectos, que los hay.

    Siento no ser de más ayuda.

    • Esta respuesta fue modificada hace 2 años, 9 meses por cybmeta.
    • Esta respuesta fue modificada hace 2 años, 9 meses por cybmeta.
    • Esta respuesta fue modificada hace 2 años, 9 meses por cybmeta.

    Muchísimas gracias por tu ayuda.

    Lo que propones de crearlo como post type, ahora mismo no lo veo, pero no es mala opción.
    Utilizar plugins de terceros, siempre es una opción pero estoy intentando usar el mínimo número de plugins posibles, para tenerlo todo más controlado.
    Pero lo que comentas de que antes de guardar comprueba la capacidad … me has dado un idea, a ver si consigo hacerlo, si lo consigo ya pongo el código aquí.

    Un saludo y muchas gracias

    Que no te asusten los plugins de terceros, si son buenos, lo hacen mejor que nosotros casi siempre, para eso tienen un equipo detrás dedicado. Por ejemplo, añadir capacidades de usuario en cada admin_init, tal y como estás haciendo, genera operaciones en la base datos innecesarias cada vez que el admin_init se ejecuta, lo que incluye incluso wp-admin/admin-ajax.php. Las capacidades de usuario se deberían añadir a través de un plugin (no lo veo en themes) y una sola vez, por ejemplo añadirlas al activar el plugin y quitarlas al desactivar el plugin, si se hace al vuelo se debe comprobar antes si es estrictamente necesario.

    <?php
    /*
    Plugin Name:  Mi plugin
    Plugin URI:   http://example.com
    Description:  A plugin for general play and test
    Version:      0.1
    */
    
    // init u otro action adecuado según la situación
    add_action( 'init', function() {
        // Comprobar antes si es necesario modificar las capacidades
        // y roles que se crearon durante la activación del plugin
        if( $condicion ) {
            // Realizar los cambios oportunos
        }
    );
    
    register_activation_hook( __FILE__, function () {
    
        // Crear roles y capacidades personalizadas aquí
    
    } );
    
    register_deactivation_hook( __FILE__, function () {
    	
        // Eliminar los roles y capacidades personalizadas aquí
    
    } );

    Que no te asusten los plugins de terceros, sobre todo para temas complejos como los que planteas. A mi por lo menos me parece complejo, y a menos que tengas un gran presupuesto para dedicarle muuuuucho tiempo, mejor irte con una solución ya lista. Mi humilde opinión.

    De todas formas, si encuentras una solución, compártela por favor!! Sería muy interesante.

    Buenas,

    Ciertamente veo que cojeo en la forma de programar en wp, todas las funciones las pongo en el functions, o las añado a otro archivo php para dejarlo todo mas limpio.

    Lo único que si controlo algo más, es la creación de mis post types, que los creo de esta manera:

    if ( !class_exists( 'postTypes' ) ) {
    	class postTypes {
    		function __construct() {
    			add_action( 'init', array( &$this, 'postTypes_init' ), 0 );
                            add_filter( 'manage_edit-proyecto_columns', array( &$this, 'pr_edit_columns' ) );
    			add_action( 'manage_posts_custom_column', array( &$this, 'postTypes_column_display' ), 10, 2 );
    
    			add_action( 'restrict_manage_posts', array( &$this, 'add_me_tax_filters' ) );
    		}
    
    		function postTypes_init() {
                            creacion....
                    }
    
                    function pr_edit_columns( $columns ) {
                            columnas
                    }
    
                    function postTypes_column_display( $columns, $post_id ) {
                            contenido columnas
                    }
    
                    function add_me_tax_filters() {
                            filtro de las taxonomia
                    }
           }
    }
    new postTypes;
    

    Los plugins de terceros, tienen su lado bueno y su lado malo. Como pilles uno que se deje de actualizar como ya me ha pasado con alguno, te lo comes pero bien, sobretodo cuando empieza a dar errores y es un plugin que no puedes eliminar porque es importante en tu web.

    Bueno si no consigo lo de los permisos, lo desactivo que tampoco pasa nada, era por tener todo mas atado.

    Saludos

    • Esta respuesta fue modificada hace 2 años, 9 meses por inigonz.

    Buenas de nuevo,

    Codigo con roles especiales

    He encontrado el link de arriba, donde explican como dar permisos especiales a los usuarios, basándose en el rol de author.
    Los autores solo pueden editar en estos casos:

    Los post de otros – si están pendiente de revisión
    Los suyos propios – si están pendiente de revisión o borrador
    Si estan publicados ya no pueden editarlos

    Lo he probado y funciona perfectamente, ahora solo tengo que modificarlo para que se adapte a lo que yo necesito.

    Un saludo

    Buenas de nuevo,

    Ya lo he conseguido, ha costado pero bueno, funciona que es lo importante.

    
    // CPT PROYECTO
    $pr_labels = array(
    	'name' => __( 'Proyectos' ),
    	'singular_name' => __( 'Proyecto' ),
    	'add_new' => __( 'Añadir nuevo' ),
    	'add_new_item' => __( 'Añadir nuevo Proyecto' ),
    	'edit_item' => __( 'Editar Proyecto' ),
    	'new_item' => __( 'Nuevo Proyecto' ),
    	'view_item' => __( 'Ver Proyecto' ),
    	'search_items' => __( 'Buscar Proyecto' ),
    	'not_found' => __( 'No se encontraron Proyectos' ),
    	'not_found_in_trash' => __( 'No se encontraron Proyectos en la papelera' )
    );
    
    $pr_args = array(
    	'labels' => $pr_labels,
    	'public' => true,
    	'publicly_queryable' => true,
    	'show_ui' => true,
    	'show_in_menu'	=> true,
    	'show_in_nav_menus' => true,
    	'menu_position ' => 20,
    	'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'post-formats', 'revisions', 'author' ),
    	'capability_type' => 'proyecto',
    	'capabilities' => array(
    	        'edit_post' => 'edit_proyecto',
    	        'read_post' => 'read_proyecto',
    		'delete_post' => 'delete_proyecto',
    		'edit_posts' => 'edit_proyectos',
    		'edit_others_posts' => 'edit_others_proyectos',
    		'publish_posts'	=> 'publish_proyectos',
                    'edit_publish_posts' => 'edit_publish_proyectos',
    		'read_private_posts' => 'read_private_proyectos',
    		'create_posts' => 'edit_proyectos',
    		'delete_posts' => 'delete_proyectos',
    		'delete_others_posts' => 'delete_others_proyectos',
    	),
    	'map_meta_cap' => true,
    	'hierarchical'	=> false,
    	'has_archive' => true,
    		'rewrite' => array(
    		'slug'	=> 'proyecto',
    	),
    	'menu_icon' => 'dashicons-screenoptions'
    );
    
    $pr_args = apply_filters( 'proyecto_args', $pr_args );
    register_post_type( 'proyecto', $pr_args );
    

    Y en el plugin

    
    // ACTIVACION / DESACTIVACION PLUGIN: CREACION / ELIMINACION DE ROLES - CAPS
    class CustomEditorRole {
    	private static $role = 'rol12';
    	private $role_label;
    
    	function __construct() {
    		// here we need a real, loaded, text domain
    		$this->role_label = __( 'Rol12' );
    	}
    
    	function addRole() {
    		global $wp_roles;
    
    		if ( ! $wp_roles instanceof WP_Roles ) {
    			$wp_roles = new WP_Roles;
    		}
    
    		// Crear Rol para los Recas
    		$caps = array(
    			'read' => true,
    			'upload_files' => true,
    			'edit_theme_options' => true,
    				
    		);
    
    		// Añadir caps CTP y TAX al rol
    		$caps['edit_proyecto'] 	= TRUE;
    		$caps['publish_proyecto'] = TRUE;
    		$caps['delete_proyecto'] = TRUE;
    
    		// Custom cap
    		$caps['edit_same_tax_posts'] 	= TRUE;
    
    		// Create new role with custom caps
    		add_role( self::$role, $this->role_label, $caps );
    	}
    
    	function removeRole() {
    		global $wp_roles;
    
    		if ( ! $wp_roles instanceof WP_Roles ) {
    			$wp_roles = new WP_Roles;
    		}
    
    		remove_role(self::$role);
    	}
    }
    
    register_activation_hook( __FILE__, array( new CustomEditorRole, 'addRole' ) );
    register_deactivation_hook( __FILE__, array( new CustomEditorRole, 'removeRole' ) );
    
    // PERMISOS DE LECTURA / ESCRITURA PARA LOS POST PROPIOS / OTROS / MISMA CATEGORIA
    class CustomEditorCaps {
    	function manageCaps( $allcaps, $caps, $args, $user ) {
    		if ( ! $this->shouldManage( $args[0], $user ) ) {
    			return $allcaps;
    		}
    
    		// Are we saving?
    		$action = filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRING );
    		$method = strtoupper( filter_var($_SERVER['REQUEST_METHOD'], FILTER_SANITIZE_STRING ) );
    
    		if ( $method !== 'POST' ) { // not saving
    			global $pagenow;
    
    			// we are interested only on post list and post edit screens
    			if ( is_admin() && in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), TRUE ) ) {
    				$screen_id 	= $pagenow === 'edit.php' ? 'edit-pproyecto' : 'proyecto';
    				$allcaps 	= $this->maybeAllow( $args, $allcaps, $user, $screen_id );
    			}
    		} elseif ( $action === 'editpost' ) { // saving and right action
    			$allcaps = $this->maybeAllowOnSave( $args, $allcaps, $user );
    		}
    
    		return $allcaps; // always return: it's a filter
    	}
    
    	function lockPendingStatus( $data, $postarr ) {
                    return $data; // always return: it's a filter
    	}
    
    	function allowPreview( $posts, $query ) {
    		if ( is_admin() || ! $query->is_main_query() || empty( $posts ) || ! $query->is_single || $posts[0]->post_type !== 'proyecto' ) {
    			return $posts; // return first argument: it's a filter
    		}
    
    		$status = get_post_status( $posts[0] );
    		$post_status_obj = get_post_status_object( $status );
    			
    		if ( ! $post_status_obj->public && current_user_can('edit_same_tax_posts') ) {
    			// post is pending and our user has our special role
    			// allow preview
    			global $wp_post_statuses;
    			$wp_post_statuses[$status]->public = TRUE;
    		}
    
    		return $posts; // return first argument: it's a filter
    	}
    
    	private function maybeAllow( $args, $allcaps, $user, $screen ) {
    		if ( $args[0] === 'edit_others_proyectos' ) {
    			// if filtering 'edit_others_posts' we have no access to single post data
    			// allow cap only on post list screen and before querying posts
    			$allcaps['edit_others_proyectos'] = ! did_action('pre_get_posts') && $screen === 'edit-proyecto';
    
    			return $allcaps;
    		}
    
    		$post = get_post( $args[2] );
    		$permisos = of_get_option( $user->ID . 'permisos' );
    		$terms 	= get_the_terms( $post, 'mercado' );
    		$termId = '';
    		$termParent = '';
    
    		if ( $terms ) {
    			foreach ( $terms as $term ) {
    				$termId = $term->term_id;
    				$termParent = $term->parent;
    
    				if ( $termParent != 0 ) {
    					$term_parent = get_term_top_most_parent( $termId, 'mercado' );
    					$termId = $term_parent['parent'];
    				}
    
    				if ( $permisos[$termId] == 1 ) {
    					$allcaps['edit_others_proyectos'] 	 = TRUE;
    					$allcaps['edit_published_proyectos'] = TRUE;
    				}
    			}
    		}
    
    		return $allcaps; // always return: it's a filter
    	}
    
    	private function maybeAllowOnSave( $args, $allcaps, $user ) {
    		$data = $this->getPostedData();
    
    		if ( $data['post_type'] !== 'proyecto' || (int) $data['post_ID'] <= 0 ) {
    			return $allcaps;
    		}
    
    		$post = get_post( $data['post_ID'] );
    		$permisos = of_get_option( $user->ID . 'permisos' );
    		$terms = get_the_terms( $post, 'mercado' );
    		$termId = '';
    		$termParent = '';
    
    		if ( $terms ) {
    			foreach ( $terms as $term ) {
    				$termId = $term->term_id;
    				$termParent = $term->parent;
    
    				if ( $termParent != 0 ) {
    					$term_parent = get_term_top_most_parent( $termId, 'mercado' );
    					$termId = $term_parent['parent'];
    				}
    
    				if ( $permisos[$termId] == 1 ) {
    					// if post is pending and will stay pending allow editing
    					$allcaps['edit_others_proyectos'] 	 = true;
    					$allcaps['edit_published_proyectos'] = true;
    				}
    			}
    		}			
    
    		return $allcaps;
    	}
    
    	private function shouldManage( $cap, $user ) {
    		return is_admin() && in_array( $cap, array( 'edit_others_proyectos', 'edit_published_proyectos', 'edit_proyecto', 'edit_post', ), TRUE ) && ! $user->has_cap( 'delete_others_proyectos' ) && $user->has_cap( 'edit_same_tax_posts' ) && ! defined( 'DOING_AJAX' ); // does not affect ajax
    	}
    
    	private function getPostedData() {
    		return filter_input_array( INPUT_POST, array( 'post_type' => FILTER_SANITIZE_STRING, 'post_ID' => FILTER_SANITIZE_NUMBER_INT, 'original_post_status' => FILTER_SANITIZE_STRING, 'post_status' => FILTER_SANITIZE_STRING, ) );
    	}
    
    }
    
    $cap_manager = new CustomEditorCaps;
    add_filter( 'user_has_cap', array( $cap_manager, 'manageCaps' ), PHP_INT_MAX, 4 );
    add_filter( 'posts_results', array( $cap_manager, 'allowPreview' ), 10, 2 );
    add_filter( 'wp_insert_post_data', array( $cap_manager, 'lockPendingStatus' ), 10, 2 );
    

    Lo de los permisos genero en el options del options-framework unos checkbox con los terms para cada usuario, y así compruebo si el id de ese usuario tiene permisos para ese term

    Saludos

    Hola @inigonz.
    Gracias por compartir tu codigo, he tratado de reproducir lo que has hecho con el ejemplo que as puesto, pero no logro reproducir puedes compartir tu codigo o que me esta faltando para probar lo que tu hiciste Por favor gracias por tu ayuda.

    Buenas Dackar,

    Que error te da?
    La parte de seguridad la hago en el plugin, y está copiada en el ultimo comentario, y lo otro que necesitas, es el cpt para ver como llamo a los caps del cpt proyecto, no se que mas puede faltar.

    Lo otro que comento, es con el plugin options-framework, para crear un theme options, desde ahí genero una página-options donde me muestra las taxonomías de mi cpt proyecto, con los usuarios registrados, voy marcando que taxonomías puede editar cada usuario.

Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)
  • El debate ‘Permisos para editar posts de otro autor’ está cerrado a nuevas respuestas.