¿Cómo puedo evitar que un escritor pueda editar un artículo que ha sido programado?

2

En el antiguo WordPress que tenía, el escritor (un tipo de usuario que no podía publicar) era, después de que un artículo estaba programado, no podía volver al artículo y editarlo. Pero ahora en WordPress 8.1 ellos (los escritores) pueden volver y editar un artículo de programación. ¿Hay alguna manera de detener esto?

writer = contributor

    
pregunta jnbdz 04.03.2014 - 21:19

2 respuestas

6

Yo, como @fischi creo que el filtro 'user_has_cap' es la mejor opción para el propósito, sin embargo, creo que es mejor para el trabajo, independientemente de la publicación o acción $ _GET: WordPress check la metaabacabilidad por publicación, utilizando un argumento adicional.

En pocas palabras, al filtrar 'user_has_cap' para una meta capacidad (consulte enlace ) tenemos acceso a la publicación ID, y al usarlo podemos evitar que un usuario edite o elimine una publicación específica.

add_filter( 'user_has_cap', 'no_edit_prending_for_contrib', 9999, 3 );

function no_edit_prending_for_contrib ( $allcaps, $caps, $args ) {
  // an arry of action we want to prevent
  $prevent = array('edit_posts', 'delete_posts');

  // we are not checking for edit a post, do nothing
  if ( ! array_intersect( $prevent, (array) $caps ) ) return $allcaps; 

  // we are not checking for a specific post, do nothing
  if ( ! isset( $args[2] ) || ! is_numeric( $args[2] ) ) return $allcaps;

  // the user has the capability to edit published posts, do nothing
  if ( array_key_exists( 'edit_published_posts', (array) $allcaps ) ) return $allcaps;

  // if the post is not a future one, do nothing
  if ( get_post_status( $args[2] ) !== 'future' ) return $allcaps;

  // if we are here we have to prevent user to edit or delete post
  if ( isset($allcaps['edit_posts']) ) unset($allcaps['edit_posts']);
  if ( isset($allcaps['delete_posts']) ) unset($allcaps['delete_posts']);
  return $allcaps;
}

Al usar este código, los colaboradores aún podrán ver las publicaciones pendientes, pero de forma de solo lectura, al igual que las publicaciones publicadas por otros usuarios.

    
respondido por el gmazzap 05.03.2014 - 01:37
0

Vaya, ese fue difícil de resolver ;-) Sin embargo, la cosa es que tienes que profundizar aquí.

La función current_user_can() usa muchas funciones diferentes después de la guerra, pero puede filtrar user_has_cap , que básicamente verifica si el usuario que inició sesión tiene una capacidad específica ( duh ).

Como se permite a los colaboradores (de forma predeterminada) editar publicaciones con un estado distinto de publish (corríjame si me equivoco, no verifiqué trash ), y también las capacidades se verifican varias veces mientras Al cargar la pantalla de administración, tenemos que verificar algunas cosas diferentes antes de devolver un error:

  • ¿Puede el usuario edit_posts en primer lugar? '
  • ¿El estado de la publicación que se va a editar future ?
  • ¿El usuario desea editar la publicación o crear una nueva, y la URL establece una publicación? (probablemente el menos importante debido al estado de la publicación).

La (casi) solución

Si no se establece ninguna publicación (por $_GET['post'] ), el filtro puede continuar sin restricción.

Luego, debe verificar si el post_status es realmente futuro, si la acción (por $_GET['action'] ) es realmente "editar" y, por supuesto, si el usuario actual puede editar en primer lugar .

add_filter( 'user_has_cap', 'f711_restrict_editing_future', 1, 3 );

function f711_restrict_editing_future ( $allcaps, $cap, $args ) {
    // check if a post ist set
    if ( !isset( $_GET['post'] ) ) return $allcaps;
    // get the post
    $thispost = get_post( (int) $_GET['post'] );
    // check everything else
    if ( $cap[0] == 'edit_posts' && $thispost->post_status == 'future' && $_GET['action'] == 'edit' && $allcaps['contributor'] == 1 ) {
        wp_die( 'post is scheduled' );
    }
    return $allcaps;
}

Los problemas

Esta función para filtrar su rol de usuario solo verifica en el momento en que el usuario desea editar la publicación futura. Es posible que tenga que filtrar las listas de las publicaciones también, para evitar mostrar el enlace a la publicación en primer lugar.

El segundo problema es que esta solución depende de que el usuario tenga el rol de contributor . Es posible que tenga que ajustar estas configuraciones también, si desea tener una solución general para este problema.

Sin embargo, para responder a su pregunta, con esta función evita que los colaboradores editen publicaciones futuras

No es la forma más elegante, pero espero que consigas el giro :-)

    
respondido por el fischi 05.03.2014 - 00:49

Lea otras preguntas en las etiquetas