Comment activer les modifications suggérées?

19

J'aime l'idée de permettre à n'importe quel utilisateur de mon site Web de suggérer des modifications à une page. Tout comme le système d'édition sur Stack Exchange, mais différent en ce que n'importe qui devrait pouvoir éditer, pas seulement les utilisateurs enregistrés. Toutes les modifications passeraient par un processus d'approbation.

Comment pourrais-je mettre cela en œuvre?

Patrick Klug
la source
1
Je ne sais pas comment faire, mais je pense que cela pourrait être vraiment problématique. Je pense que vous obtiendrez beaucoup de spam.
Martin Thoma
3
Êtes-vous certain d'avoir besoin d'une installation WordPress pour votre site Web? La fonctionnalité que vous désirez ressemble beaucoup à une installation MediaWiki . Vous devez peser le pour et le contre des deux installations. MediaWiki est une bonne alternative.
Marc Dingena
Je rebondissais avec cette idée il y a quelque temps. Le plugin le plus proche d'une solution disponible était: wordpress.org/support/plugin/post-forking Il n'en est cependant qu'à ses débuts. Le plugin est réservé aux utilisateurs enregistrés.
Christine Cooper
Nous travaillons vers quelque chose comme ça. Nous avions envisagé une modification de style Wikipedia pour les publications, ainsi qu'un widget "Historique": github.com/publishpress/Revisionary/issues/13 Nous n'y sommes pas encore tout à fait, mais presque toute la structure est en place.
steveburge

Réponses:

11

Diff le contenu du post, le titre et l'auteur

Comme je devais faire quelque chose de connexe il y a un mois, voici le moyen le plus simple et le plus à l'épreuve du temps (que je pourrais bien) pour vérifier s'il y a eu une modification du contenu ou du titre ou si l'auteur a changé:

// Update Title
'' !== wp_text_diff(
    $el['post_title'],
    $GLOBALS['post']->post_title
)
    AND $GLOBALS['post']->post_title = $el['post_title'];
// Update Content
'' !== wp_text_diff(
    $el['post_content'],
    $GLOBALS['post']->post_content
)
    AND $GLOBALS['post']->post_content = $el['post_content'];
// Update author
$GLOBALS['post']->post_author !== $el['post_author']
    AND $GLOBALS['post']->post_author = $el['post_author'];

Pour expliquer brièvement mon scénario: je récupérais des publications à distance via une API distante. Ensuite, je suis retourné leglobal $post , au cours d'une seule boucle de publication, contenant soit les données d'origine, soit les nouvelles données. De cette façon, je me suis déplacé en définissant toutes les autres valeurs de publication dont je n'avais pas besoin pour vérifier les modifications.

Proposer la modification

Le fait principal que l'on doit garder à l'esprit lors de la recherche d'un endroit où une copie-édition du contenu de la publication pourrait être (temporairement) enregistrée est que le contenu est une entrée db de longtext . L'endroit où l'on souhaite enregistrer la modification suggérée doit donc répondre à cette exigence. Les commentaires font ça.

Ensuite, il y a le fait qu'ils offrent une API pour les placer bien dans une boucle, de sorte qu'il s'intègre facilement, est hautement personnalisable et peut être rapidement configuré. Enfin, la plupart des thèmes sont déjà livrés avec des commentaires intégrés, il est donc facile de se superposer au système et de se connecter à presque tous les thèmes disponibles.

Je suggère de simplement (soit) étendre ou modifier le formulaire de commentaire. Utilisez les éléments suivants ou ajoutez des champs supplémentaires avec un rappel accroché à comment_form_default_fields.

<?php
// Add it for logged in users and guests:
add_action( 'comment_form_logged_in_after', 'wpse_proposed_edit_textarea' );
add_action( 'comment_form_after_fields', 'wpse_proposed_edit_textarea' );
function wpse_proposed_edit_textarea()
{
    ?>
    <p class="comment-form-title">
        <label for="wpse_propsed_edit">
            <?php _e( 'Propose Edit', 'your_textdomain' ); ?>
        </label>
        <textarea name="wpse_propsed_edit" id="wpse_propsed_edit">
            <?php the_content(); ?>
        </textarea>
    </p>
    <input type="hidden" name="comment_approved" id="comment_approved" value="0" />
    <?php
}

J'ai donc ajouté un hiddenchamp pour comment_approvedavec une valeur de 0pour le mettre dans la file d'attente. Je ne sais pas si cela fonctionnera ou si cette valeur (principale) est en fait des métadonnées de commentaire et doit être ajoutée en utilisant add_comment_meta()lors de l'enregistrement. Sinon, vous pouvez utiliser quelque chose le long des lignes de code suivantes

add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // You might need to inspect $commentdata 
    // to determine approval, disapproval, or spam status
    if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
    {
        # Now add a filter to the comment post action, so we save a meta entry
        add_action( 'comment_post', 'wpse_set_proposed_edit' );
        return 0;
    }

    return 1;
}

// This function makes it easier for us to identify the comments by their meta value
function wpse_set_proposed_edit( $comment_id );
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    add_comment_meta( $comment_id, 'proposed_edit', true, true );
}

Affichage des commentaires du côté administrateur

Ici, j'irais avec une extension de classe simple et une page d'administration personnalisée:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        'Proposed Edits',
        'Suggested Edits',
        'activate_plugins',
        'proposed_edits',
        'wpse_proposed_edits_page_cb'
    );
}
add_action( 'admin_menu', 'wpse_add_proposed_edits_admin_page' );

function wpse_proposed_edits_page_cb()
{
    $proposed_edits_table = new WP_Proposed_Edits_Table();
    $proposed_edits_table->prepare_items(); 
    $proposed_edits_table->display(); 
}

class WP_Proposed_Edits_Table extends WP_List_Table
{
    // Override List table default logic in here
}

Plus d'informations peuvent être trouvées sur WPEngineer .

Approuver les modifications

Vous pouvez ensuite ajouter des actions personnalisées et traiter les modifications proposées à l'aide du premier code que j'ai montré pour vérifier s'il y a eu un changement, puis simplement mettre à jour la publication. Le commentaire lui-même contient une valeur avec une clé de comment_post_ID, donc l'identification de l'ID des articles modifiés est simple.

Note finale

J'aimerais également voir le plugin final. Veuillez le lier ici :)

kaiser
la source
1
Je donne la prime à cette question pour l'idée d'utiliser la méta de commentaire pour stocker la modification suggérée et wp_text_diff()pour la comparaison réelle. Upvotes pour les autres réponses.
fuxia
8

Mon idée est quelque chose de simple.

  • Vous pouvez créer un Edit Suggestionlien au bas des publications qui a un modèle défini personnalisé, dans lequel utiliser une zone de texte (peut-être avec un éditeur) qui est liée à une taxonomie personnalisée avec la valeur par défaut de post content.

  • Toutes les modifications apportées contentseront comparées à original post contentaprès la soumission (en tant que brouillon) et la saisie CAPTCHA codeavec des algorithmes Diff comme le package PHP en ligne-diff ou le package PEAR Text-Diff ou en utilisant une fonction PHP conformément à cela pour les textes pas trop longs avec une combinaison de CSS.

  • Ensuite, en enregistrant les valeurs dans 3 Meta Box personnalisées (dans cette page d'ajout / modification de back-end de taxonomie) qui affichent

    1. Contenu original
    2. Version éditée
    3. Pseudo de l'utilisateur et son e-mail

    et enregistrer Post IDpeut-être avec une update_option()fonction pour une utilisation ultérieure.

  • Après avoir lu la version modifiée et accepté par l'administrateur, ce message sera remplacé par celui d'origine comme vous l'avez codé dans functions.php.

revo
la source
Quelques notes: (A) "comme vous l'avez codé dans functions.php" - ne sont pas d'accord avec celui-ci. C'est du matériel de plugin. (B) "lié à une taxonomie personnalisée avec la valeur par défaut du contenu du message" - Un terme / taxon de taxonomie n'a qu'une seule valeur possible où le contenu pourrait convenir dans tous les cas: la description. Et puis vous auriez besoin d'un endroit pour stocker l'ID du message. Où serait-ce? Comme il n'y a pas de place pour cela en raison des limites du système fiscal des WP, vous ne pouvez enregistrer que le terme ID. Il s'agit alors d'un système à sens unique (limité): Post> Term data.
kaiser
4

Eh bien, c'est assez compliqué, une bonne réponse prendrait beaucoup de temps à écrire. Donc ce n'est pas une vraie réponse juste quelques réflexions ..

L'utilisation de WordPress intégré wp_update_postvia ajax vous donnerait l'historique des révisions nécessaires, mais pas la capacité nécessaire pour approuver les modifications.

La création de brouillons à partir de modifications n'est pas possible par défaut mais a été discutée ici, Existe - t-il un moyen de rédiger une révision d'une page ou d'un article publié? Quelles solutions de contournement avez-vous utilisées?

Vous pouvez essayer d'utiliser l' éditeur frontal mais vous n'aurez aucun contrôle sur les modifications publiées, alors essayez de les écraser avec un autre plugin comme Revisionary qui autorise les modifications basées sur les autorisations, je ne sais pas si elles fonctionneront ensemble.

S'ils ne le font pas, vous devrez pirater un plugin basé sur les 2 plugins ci-dessus ou écrire quelque chose à partir de zéro.

Mon approche de base serait d'avoir un bouton qui va à une autre page qui génère le contenu / les données de publication à l'aide de JSON , ce qui est plus facile à travailler lorsque vous utilisez les éditeurs Ajax et WYSIWYG. Le bouton Enregistrer serait publié sous forme de brouillon au lieu de publier et de cette façon, vous auriez le contrôle sur les modifications (voir ci-dessus la discussion WPSE sur la façon d'accomplir cela, c'est plutôt intimidant).

Il y a des complications supplémentaires lors de cette opération telles que la désinfection, l'encodage, le spam, la gestion des médias, les champs personnalisés, les horodatages, la mémoire, etc. La bonne nouvelle est que wordpress a déjà un système de révision auquel vous pouvez vous connecter et une capacité décente de gérer plusieurs éditeurs .

ps. C'est une bonne idée pour un plugin.

Wyck
la source