web-dev-qa-db-fra.com

Comment autoriser un utilisateur à rédiger son brouillon (annonce), puis à le publier à nouveau sans avoir à obtenir une approbation?

J'utilise WordPress en tant que site de répertoire, où un utilisateur peut soumettre un message qui devient leur annonce/liste. Les utilisateurs se voient attribuer un rôle wordpress personnalisé.

Les messages doivent être approuvés et publiés par l’administrateur une fois, puis ils peuvent librement mettre à jour leur publication comme bon leur semble. Cela fonctionne bien comme cela pour le moment, car je n’ai donné aucune possibilité de publication au rôle personnalisé.

Cependant, j'ai également besoin de la possibilité pour l'utilisateur de prendre son message hors ligne (brouillon peut-être) temporairement quand il le souhaite et de le publier à nouveau quand il le souhaite. Actuellement, lorsqu'ils rédigent leur message en tant que "brouillon", ils doivent le soumettre à une relecture pour le rendre à nouveau publié - ce n'est pas idéal.

Y a-t-il un moyen de contourner ce problème afin qu'ils puissent modifier leur publication de published à draft, puis de nouveau de draft à published, sans qu'il soit nécessaire de l'approuver?

Ou peut-être que je leur donne des capacités de publication pour commencer, mais il y a un plugin qui exige que leur premier message soit approuvé? (ils ne sont autorisés que 1 poste de toute façon).

Qu'en est-il d'une métabox personnalisée avec une case à cocher qui contrôle si la publication est publiée ou non? Malheureusement, je n'aurais aucune idée par où commencer avec ce type de fonctionnalité. J'utilise WPALchemy pour d'autres métaboxes cependant.

1
Andrew

Grâce à la suggestion de Chris d'assigner une capacité à la volée, j'ai pu faire fonctionner quelque chose qui pourrait aider quelqu'un d'autre. Il y a peut-être une meilleure méthode, mais celle-ci fonctionne bien pour ma situation.

Étant donné que je travaille avec un type de publication personnalisé de listing, je devais affecter la fonctionnalité mappée publish_listings à l'utilisateur, mais uniquement après son approbation. La meilleure façon de procéder consistait à inclure une metabox "uniquement pour les administrateurs" sur les écrans de publication personnalisés que seuls les administrateurs pouvaient voir. Cela a été fait avec l'aide de WPAlchemy et c'est output_filter.

Avec une metabox que seul un administrateur pouvait maintenant voir, j'ai ajouté une simple case à cocher. Lorsque cette case est cochée et que le message est mis à jour, il ajoute la capacité publish_listings à l'auteur du message actuel. Étant un type de site de répertoires, je n'autorise qu'un post par auteur dans mon cas, donc cela fonctionne assez bien. Si cette case est décochée et mise à jour, la capacité est supprimée. Donc, le cas d'utilisation ressemblerait à ceci:

  1. L'utilisateur soumet un message pour approbation
  2. L'administrateur examine le message, coche la case et le publie pour la première fois.
  3. L'utilisateur est maintenant libre de mettre à jour son message à volonté, notamment d'en faire un brouillon et de le publier à nouveau.

Comme je l'ai mentionné, j'utilise WPAlchemy pour le levage de métaboxes. J'ai donc pu utiliser save_filter pour ajouter la capacité lorsque la publication est mise à jour.

function save_admin_only( $meta, $post_id ) {
global $post;

//get the author ID of the post we're on
$author_id = $post->post_author;
$id = get_the_author_meta( 'ID' , $author_id );
$user = new WP_User( $id ); //retrieves the user, based on their ID specified above for user with WP_User class

    if($meta['_can_publish'] == 'yes') {    
        $user->add_cap( 'publish_listings' ); //assign capability to this user if checkbox is ticked
    }
    else { $user->remove_cap( 'publish_listings' ); } //otherwise remove the capability so they can not publish

return $meta;
}

Si vous devez rechercher un type de message personnalisé (par exemple, vous en avez plus d'un), vous pouvez l'envelopper avec:

if ( 'other_post_type' == get_post_type() ) {
    ...
}

Cela semble être extrêmement utile pour d'autres scénarios dans lesquels vous ne souhaitez pas créer un tout nouveau rôle, simplement pour donner à un utilisateur certaines fonctionnalités. Si quelqu'un peut améliorer ce qui précède, alors s'il vous plaît faites-le.

0
Andrew

Je me suis récemment occupé du même problème. Je n'ai pas résolu le problème et nous avons décidé que, puisque les gens devaient payer une somme relativement importante pour leurs annonces, ils seraient suffisamment incités à ne pas publier de mauvaises choses. De plus, il serait difficile d’approuver manuellement chacun d’eux - les gens n’aiment pas attendre un jour pour obtenir des résultats.

Nous avons donc donné dès le début à notre niveau d'utilisateur directory_member les capacités publish_posts et edit_published_posts. Ils doivent passer par le processus de paiement avant la publication du message; une fois qu'ils ont payé, ils peuvent faire tout ce qu'ils veulent avec leur poste.

Mais j'ai eu une vague de cerveau (rare) en regardant votre question. Je pense que je me suis trompé parce qu’il n’ya qu’un seul niveau directory_member, au lieu de directory_member et directory_member_approved. Ce dernier aurait la capacité edit_published_posts; le premier ne serait pas. Il serait relativement simple d'augmenter l'utilisateur lorsqu'un administrateur publie la publication pour la première fois.

L'autre possibilité est d'attribuer la capacité edit_published_posts à la volée en fonction d'un champ méta utilisateur, dans admin_init ou quelque part. Mais de toute façon, je soupçonne que l’idée d’avoir deux niveaux explicites est préférable.

Fais-moi savoir ce que tu finis par faire.

2
Chris Carson