web-dev-qa-db-fra.com

Rôle personnalisé permettant aux utilisateurs de "Soumettre pour révision" au lieu de "Publier"

La fonctionnalité que j'essaie d'obtenir est un rôle d'utilisateur qui permet à l'utilisateur de soumettre des brouillons de modifications sans les publier. Leurs modifications doivent être publiées par un éditeur ou un utilisateur de rôle supérieur.

J'ai un peu cherché dans cet échange de piles et je n'ai trouvé aucune solution qui semble répondre à mes besoins. Je préférerais éviter les plugins et intégrer cette fonctionnalité directement dans mon fichier functions.php.

Je travaille dans un environnement sandbox non actif, je n'ai donc aucun souci majeur de casser quoi que ce soit tout en testant différentes solutions. Jusqu'ici c'est ce que j'ai:

 $role_object = get_role( 'contributor' );
 $role_object->add_cap( 'edit_pages' );
 $role_object->add_cap( 'edit_others_pages' );
 $role_object->add_cap( 'edit_published_pages' );
 $role_object->add_cap( 'upload_files' );
 $role_object->remove_cap( 'publish_posts' );
 $role_object->remove_cap( 'publish_pages' );

add_filter('wp_insert_post_data','re_aprove');
 function re_aprove($data , $postarr){
    global $current_user;
    get_currentuserinfo();
    //check if current user is not admin
    if (!current_user_can('manage_options')){
        if ($data['post_status'] == "publish"){
            $data['post_status'] = "pending";
        }
    }
    return $data;
 }

La deuxième fonction a été trouvée ici, mais je soupçonne qu’elle pourrait être une solution obsolète, car elle ne semble pas fonctionner correctement pour moi et j’ai trouvé une publication la contenant depuis 2010.

C'est la façon dont cette solution ne fonctionne pas qui m'a fait me gratter la tête. En tant que contributeur, je peux accéder à la page d'édition de n'importe quelle page. Toutefois, un bouton "Mettre à jour" au lieu d'un bouton "Soumettre pour révision". Lorsque vous appuyez sur le bouton "Mettre à jour", la page d'édition est actualisée et affiche à la place un bouton "Soumettre pour révision". La page de tableau de bord Pages affiche la page mise à jour comme "En attente". Jusqu'ici tout va bien pour la plupart. Le problème est que la page 404 maintenant sur le front-end. La "mise à jour" en tant que contributeur a annulé la page, ce qui n'est pas ce que j'allais faire.

Toutes les pensées, suggestions ou solutions sont grandement appréciées. Je pense que cette fonctionnalité serait très souhaitable pour beaucoup de gens.

Merci pour votre temps.

1
PersonNinja

Cela dépend vraiment de savoir si vous voulez restreindre ces nouveaux rôles à un type de publication particulier. Si vous recherchez des "plugins de flux de travail", vous pouvez trouver plusieurs solutions toutes faites. Certains permettent uniquement aux nouveaux rôles de modifier des pages, d'autres leur permettent de modifier n'importe quel type de publication.

J'ai construit un site qui nécessitait des utilisateurs pouvant uniquement affecter un CPT particulier. Ainsi, par exemple, nous avions "Editors" pour CPT1 qui ne pouvait que "soumettre pour révision", puis "Approvers" pour CPT1 qui pouvait éditer et publier. Nous avions également des "rédacteurs" pour CPT2 et des "approbateurs" pour CPT2, etc., de sorte que les utilisateurs ne puissent modifier que le CPT qui leur est attribué.

La première étape consistait à utiliser map_meta_cap lors de l'enregistrement des CPT, ce qui créait un nouvel ensemble d'autorisations pour chaque CPT. La deuxième étape était plus compliquée et un peu hacky. Tout d'abord, j'ai ajouté une balise noscript à l'administrateur pour empêcher quiconque dont JS est désactivé de se déplacer, de modifier ou de publier des éléments. J'ai supprimé Quick Edit et désactivé l'enregistrement automatique. Le seul moyen de mettre à jour les CPT était donc d'accéder à l'écran de l'éditeur complet avec JS activé.

De là, je me suis connecté à admin_footer-post.php et j'ai vérifié les autorisations. Si l'utilisateur actuel ne pouvait pas publier ou modifier le CPT particulier qu'il était en train de modifier, j'ai utilisé jQuery pour modifier le bouton "Publier" afin qu'il soit "Enregistrer les modifications", puis j'ai modifié l'action du formulaire sur ma propre URL de plug-in. Le plugin prend toutes les données POST et insère par programme une nouvelle publication avec un statut personnalisé, puis envoie un e-mail aux "approbateurs" de ce CPT avec des instructions sur la procédure de révision - il les amène à la comparaison de révision. écran.

Je n'aime pas le fait qu'il repose sur JS et je n'aime pas trop remplacer les fonctionnalités de Core Publishing, mais jusqu'à présent, mis à part un autre plug-in qui fait la même chose, c'est la seule méthode que j'ai trouvée pour gérer plusieurs flux de travail personnalisés.

1
WebElaine