Creé un usuario personalizado de wordpress con sus capacidades: este usuario solo puede leer, editar y eliminar publicaciones de un tipo de publicación personalizada (llamada receta).
Le doy a este usuario la función de cargar el archivo, porque cuando el usuario escribe una publicación de recetas puede agregar medios a su artículo.
Cargar archivo funciona bien en el administrador de medios (no en iframe de medios, porque las condiciones para editar archivos adjuntos tienen el rol edit_post). De hecho, este usuario con roles personalizados no puede editar ni eliminar archivos adjuntos (no puedo asignarle los roles edit_posts y delete_posts porque en este sitio hay muchos otros tipos de publicaciones personalizadas administradas por el administrador del sitio)
Sé que los archivos adjuntos son post post_type, pero ¿cómo puedo asignar las capacidades para editar y eliminar sus medios?
Buscando encontré este truco para cambiar las capacidades predeterminadas de los archivos adjuntos, pero no creo que sea la forma correcta
global $wp_post_types;
$wp_post_types['attachment']->cap->edit_post="upload_files";
$wp_post_types['attachment']->cap->read_post="upload_files";
$wp_post_types['attachment']->cap->delete_post="upload_files";
Gracias de antemano
Basado en la respuesta de @Marco, creo que logro escribirlo de manera más simple:
function allow_attachment_actions( $user_caps, $req_cap, $args ) {
// if no post is connected with capabilities check just return original array
if ( empty($args[2]) )
return $user_caps;
$post = get_post( $args[2] );
if ( 'attachment' == $post->post_type ) {
$user_caps[$req_cap[0]] = true;
return $user_caps;
}
// for any other post type return original capabilities
return $user_caps;
}
add_filter( 'user_has_cap', 'allow_attachment_actions', 10, 3 );
De esta manera, independientemente de otros permisos, los usuarios pueden hacer todo con los archivos adjuntos.
Uno puede definir permisos personalizados para acciones de archivos adjuntos y verificar si existe junto con la verificación de tipo de publicación.
Más información sobre el gancho utilizado en este código. https://codex.wordpress.org/Plugin_API/Filter_Reference/user_has_cap
después de buscar, encontré una respuesta a mi pregunta: para permitir que el usuario sin edit_post=true, podemos establecerlo como verdadero solo cuando post_type es un archivo adjunto con el filtro user_has_cap. Para mi propósito escribo este gancho
add_filter( 'user_has_cap', 'myUserHasCap', 10, 3 );
function myUserHasCap( $user_caps, $req_cap, $args ) {
$post = get_post( $args[2] );
if ( 'attachment' != $post->post_type )
return $user_caps;
if ( 'delete_post' == $args[0] ) {
if ( $user_caps['delete_others_posts'] )
return $user_caps;
if ( !isset( $user_caps['publish_recipes'] ) or !$user_caps['publish_recipes'] )
return $user_caps;
$user_caps[$req_cap[0]] = true;
}
if ( 'edit_post' == $args[0] ) {
if ( $user_caps['edit_others_posts'] )
return $user_caps;
if ( !isset( $user_caps['publish_recipes'] ) or !$user_caps['publish_recipes'] )
return $user_caps;
$user_caps[$req_cap[0]] = true;
}
return $user_caps;
}
Espero que pueda ser útil para otras personas que buscan una respuesta a mi pregunta.
-
¡Salvó mi día! ¡Gracias!
– Adriano Monecchi
6 de diciembre de 2016 a las 6:34
-
$post = get_post( $args[2] );
puede lanzar una advertencia como$args[2]
no está necesariamente establecido.– Axel
26 de noviembre de 2020 a las 16:36
“Sé que los archivos adjuntos son post post_type” – no, este no es el caso.
attachment
sonpost
s y por lo tanto tratados como tales, pero son dueños de lapost_type
attachment
también.– Axel
27 de noviembre de 2020 a las 8:54