Come abilitare le modifiche suggerite?

12 mar 2013, 13:52:38
Visualizzazioni: 2.06K
Voti: 21

Mi piace l'idea di permettere a qualsiasi utente del mio sito web di suggerire modifiche a una pagina. Simile al sistema di modifica di Stack Exchange, ma con la differenza che chiunque dovrebbe poter modificare, non solo gli utenti registrati. Tutte le modifiche passerebbero attraverso un processo di approvazione.

Come potrei implementarlo?

4
Commenti

Non so come farlo, ma penso che questo potrebbe essere davvero problematico. Penso che riceverai molto spam.

Martin Thoma Martin Thoma
13 mar 2013 20:39:52

Sei sicuro di aver bisogno di un'installazione WordPress per il tuo sito web? La funzionalità che desideri sembra molto simile a un'installazione MediaWiki. Dovresti valutare i pro e i contro di entrambe le installazioni. MediaWiki è una buona alternativa.

Marc Dingena Marc Dingena
15 mar 2013 11:59:15

Ho riflettuto su questa idea qualche tempo fa. La soluzione più vicina disponibile era questo plugin: http://wordpress.org/support/plugin/post-forking Tuttavia è in una fase molto iniziale. Il plugin è limitato agli utenti registrati.

Christine Cooper Christine Cooper
5 mag 2013 03:10:49

Stiamo lavorando per ottenere qualcosa di simile. Avevamo immaginato una modifica in stile Wikipedia per gli articoli, insieme a un widget "Cronologia": https://github.com/publishpress/Revisionary/issues/13 Non ci siamo ancora arrivati completamente, ma quasi tutta la struttura è già pronta.

steveburge steveburge
20 set 2019 18:59:53
Tutte le risposte alla domanda 3
1
11

Confronta il contenuto, il titolo e l'autore del post

Avendo dovuto affrontare una situazione simile alcuni mesi fa, ecco il modo più semplice e duraturo (che ho trovato) per verificare se ci sono state modifiche al contenuto, al titolo o all'autore:

// Aggiorna Titolo
'' !== wp_text_diff(
    $el['post_title'],
    $GLOBALS['post']->post_title
)
    AND $GLOBALS['post']->post_title = $el['post_title'];
// Aggiorna Contenuto
'' !== wp_text_diff(
    $el['post_content'],
    $GLOBALS['post']->post_content
)
    AND $GLOBALS['post']->post_content = $el['post_content'];
// Aggiorna autore
$GLOBALS['post']->post_author !== $el['post_author']
    AND $GLOBALS['post']->post_author = $el['post_author'];

Per spiegare brevemente il mio scenario: stavo recuperando post da una posizione remota tramite un'API remota. Poi restituivo il global $post, durante un loop di singolo post, contenente i dati originali o i nuovi dati. In questo modo ho gestito l'impostazione di tutti gli altri valori del post che non dovevo verificare per cambiamenti.

Proporre la modifica

Il fatto principale da tenere a mente quando si cerca un luogo dove salvare (temporaneamente) una modifica proposta del contenuto del post è che il contenuto è un'entrata del database di tipo longtext. Quindi il luogo dove si vuole salvare la modifica proposta dovrebbe soddisfare questo requisito. I commenti lo fanno.

Poi c'è il bel fatto che offrono un'API per posizionarli comodamente in un loop, quindi si integrano facilmente, sono altamente personalizzabili e possono essere configurati rapidamente. Ultimo ma non meno importante, la maggior parte dei temi ha già i commenti integrati, quindi è facile sfruttare il sistema e agganciarsi a quasi qualsiasi tema disponibile.

Suggerirei di estendere o modificare il modulo dei commenti. Usa il seguente codice o aggiungi campi aggiuntivi con un callback agganciato a comment_form_default_fields.

<?php
// Aggiungilo per utenti loggati e ospiti:
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( 'Proponi Modifica', '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
}

Ho aggiunto un campo hidden per comment_approved con un valore di 0 per metterlo in coda. Non sono sicuro se funzionerà o se questo valore (del core) è in realtà un meta dato del commento e deve essere aggiunto usando add_comment_meta() durante il salvataggio. Altrimenti, potresti usare qualcosa simile alle seguenti righe di codice:

add_filter( 'pre_comment_approved' , 'wpse_pre_suggest_edit', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // Potresti dover ispezionare $commentdata 
    // per determinare approvazione, disapprovazione o stato spam
    if ( ! empty( $commentdata['wpse_propsed_edit'] ) )
    {
        # Ora aggiungi un filtro all'azione di pubblicazione del commento, così salviamo un meta dato
        add_action( 'comment_post', 'wpse_set_proposed_edit' );
        return 0;
    }

    return 1;
}

// Questa funzione rende più facile identificare i commenti dal loro meta valore
function wpse_set_proposed_edit( $comment_id );
{
    // Esegui solo una volta
    remove_filter( current_filter(), __FUNCTION__ );

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

Mostrare i commenti nell'area di amministrazione

Qui opterei per una semplice estensione di classe e una pagina personalizzata di amministrazione:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        'Modifiche Proposte',
        'Modifiche Suggerite',
        '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
{
    // Sovrascrivi la logica predefinita della tabella qui
}

Maggiori informazioni possono essere trovate su WPEngineer.

Approvare le modifiche

Potresti poi aggiungere azioni personalizzate e processare le modifiche proposte usando il primo codice che ho mostrato per verificare se c'è stato un cambiamento e poi semplicemente aggiornare il post. Il commento stesso contiene un valore con una chiave comment_post_ID, quindi identificare l'ID del post modificato è semplice.

Nota finale

Mi piacerebbe vedere anche il plugin finale. Per favore, linkalo qui :)

7 mag 2013 18:03:26
Commenti

Assegno la ricompensa a questa domanda per l'idea di utilizzare i meta dei commenti per memorizzare le modifiche suggerite e wp_text_diff() per il confronto effettivo. Voti positivi per le altre risposte.

fuxia fuxia
8 mag 2013 22:26:53
1

La mia idea è qualcosa di semplice.

  • Puoi creare un link Suggerisci Modifica in fondo agli articoli che ha un template personalizzato, dove utilizzare una casella di testo (magari con un editor) collegata a una tassonomia personalizzata con il valore predefinito del contenuto dell'articolo.

  • Qualsiasi modifica al contenuto verrà confrontata con il contenuto originale dell'articolo dopo l'invio (come Bozza) e l'inserimento del codice CAPTCHA con algoritmi di Diff come il pacchetto PHP inline-diff oppure Text-Diff di PEAR o in alternativa utilizzando una funzione PHP secondo questo per testi non troppo lunghi, combinato con CSS.

  • Poi salvando i valori in 3 Meta Box personalizzati (nella pagina di aggiunta/modifica della tassonomia nel backend) che mostrano

    1. Contenuto Originale
    2. Versione Modificata
    3. Nickname dell'utente e la sua Email

    e salvando l'ID dell'articolo magari con una funzione update_option() per un uso successivo.

  • Dopo aver letto la versione modificata e l'accettazione da parte dell'amministratore, quell'articolo sostituirà quello originale come hai codificato in functions.php.

15 mar 2013 11:56:57
Commenti

Alcune note: (A) "come hai codificato in functions.php" - non sono d'accordo con questo. Questo è materiale per plugin. (B) "collegato a una tassonomia personalizzata con il valore predefinito del contenuto del post" - Un termine/tasson di tassonomia ha solo un possibile valore in cui il contenuto si adatterebbe in ogni caso: La descrizione. E poi avresti bisogno di un posto per memorizzare l'ID del post. Dove sarebbe questo? Poiché non c'è spazio per questo a causa dei limiti del sistema di tassonomie di WP, potresti solo salvare l'ID del termine. Quindi questo è un sistema (limitato) a senso unico solo: Post > Dati del termine.

kaiser kaiser
9 mag 2013 18:05:03
0

Beh, questo è piuttosto complicato, una risposta adeguata richiederebbe molto tempo per essere scritta. Quindi questa non è una vera risposta, solo alcuni pensieri...

Usare la funzione integrata di WordPress wp_update_post via ajax ti darebbe la cronologia delle revisioni necessaria ma non la capacità di approvare le modifiche.

Creare bozze dalle modifiche non è possibile di default ma è stato discusso qui, È possibile creare una bozza di revisione per una pagina o articolo già pubblicato? Quali soluzioni alternative avete usato?

Puoi provare a usare Front-end Editor ma non avrai controllo sulle modifiche che vengono pubblicate, quindi prova a combinarlo con un altro plugin come Revisionary che permette modifiche basate su permessi, non ho idea se funzioneranno insieme.

Se non funzionano, dovrai modificare un plugin basato sui 2 plugin sopra o scrivere qualcosa da zero.

Il mio approccio da zero sarebbe avere un pulsante che va a un'altra pagina che restituisce il contenuto/dati del post usando JSON, che è più facile da gestire quando si usa Ajax e editor WYSIWYG. Il pulsante salva creerebbe una bozza invece di pubblicare e in questo modo avresti controllo sulle modifiche (vedi sopra la discussione su WPSE su come realizzarlo, è piuttosto complesso).

Ci sono ulteriori complicazioni quando si fa questo come sanitizzazione, codifica, spam, gestione media, campi personalizzati, timestamp, memoria, ecc. La buona notizia è che WordPress ha già un sistema di revisioni a cui puoi collegarti e una discreta capacità di gestire più editor.

PS. Questa è una buona idea per un plugin.

2 mag 2013 02:13:51