web-dev-qa-db-fra.com

Empêcher les utilisateurs du rôle auteur de modifier des publications déjà en attente

Je souhaite empêcher les auteurs de pouvoir modifier en permanence des publications en attente de relecture par des éditeurs.

Clarifier; J'ai déjà du code dans mon thème qui définit les messages en direct en attente et qui fonctionne correctement ...

function published_to_pending($post_id) {
  global $post;
  if (!is_object($post)) {
      return;
  }
  if (get_current_user_role()=="author" && get_post_type()=="custompost" && $post->post_status=='publish') {
    // stop recursion call
    remove_action('save_post', 'published_to_pending');     
    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_status' => 'pending'));
    // re-hook this function back
    add_action('save_post', 'published_to_pending');
  }
}
add_action('save_post', 'published_to_pending');

J'ai trouvé quelque chose de très similaire à ce que je veux faire ici: Autoriser les rédacteurs à éditer les posts en attente, mais pas les brouillons , mais peu importe comment je modifie ce code n'arrive pas à avoir aucun effet sur mon propre site.

Quelqu'un at-il une idée de la façon dont cela peut être réalisé car je suis assez confiant que cela provient d'autres exemples de code que j'ai vus et de ce que je comprends des fonctionnalités de rôle WordPress.

1
AdamJones

J'ai résolu ce problème en ajoutant des contrôles via le hook "content_edit_pre" WP. Je vérifie rapidement le statut de la publication et, si elle est déjà en attente, je renvoie l'utilisateur à la page de publication de la publication, puis affiche une erreur.

// Redirect edit post page back to the list page when pending
add_action( 'content_edit_pre', 'my_check_status_before_editing');
function my_check_status_before_editing( $content, $post_id) {
  global $post;

  if( $post->post_type=="custom-post-type" && get_current_user_role()=="custom-user-type" ){    
       if ($post->post_status=="pending" ){
          wp_redirect("edit.php?post_type=apartments&msg=101");
          exit;  
       } 
    }
    return $content;
 }

function get_current_user_role() {
    global $wp_roles;
    $current_user = wp_get_current_user();
    $roles = $current_user->roles;
    $role = array_shift($roles);
    return $role;
}

Lorsque la page de liste se charge, j'ai un autre code pour vérifier s'il existe un paramètre "msg", puis un msg approprié à l'aide du hook admin_notices.

0
AdamJones