Roles de usuario personalizados de WordPress con upload_files true pero edit_post false, ¿cómo puedo eliminar y editar medios?

3 minutos de lectura

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

  • “Sé que los archivos adjuntos son post post_type” – no, este no es el caso. attachmentson posts y por lo tanto tratados como tales, pero son dueños de la post_type attachment también.

    – Axel

    27 de noviembre de 2020 a las 8:54

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

¿Ha sido útil esta solución?